Make WordPress Core


Ignore:
Timestamp:
03/07/2024 02:10:31 PM (11 months ago)
Author:
Bernhard Reiter
Message:

Block Hooks: Use new Templates Controller filter instead of action.

This changeset adds a new rest_pre_insert_{$this->post_type} filter in the WP_REST_Templates_Controller, where it is applied to the return value of the prepare_item_for_database method. (This is consistent with the WP_REST_Post_Controller, where that filter has existed before.)

The new filter is then used to inject hooked blocks into the template (or template part) content received via the endpoint, prior to persisting it to the database.

This supersedes the previous mechanism, which was using the rest_after_insert_{$this->post_type} action, from which it performed an additional wp_update_post call to update the template (part) content with the hooked blocks injected. The new technique eschews that additional call and the resulting extra revision it created, as well as a problem with regard to duplicated escaping and sanitization, which had caused some special characters to be garbled.

Props tomjcafferkey, gziolo, swissspidy, karolmanijak.
Fixes #60671.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/block-template-utils.php

    r57771 r57790  
    14331433    return $template_hierarchy;
    14341434}
     1435
    14351436/**
    14361437 * Inject ignoredHookedBlocks metadata attributes into a template or template part.
    14371438 *
    1438  * Given a `wp_template` or `wp_template_part` post object, locate all blocks that have
     1439 * Given an object that represents a `wp_template` or `wp_template_part` post object
     1440 * prepared for inserting or updating the database, locate all blocks that have
    14391441 * hooked blocks, and inject a `metadata.ignoredHookedBlocks` attribute into the anchor
    14401442 * blocks to reflect the latter.
    14411443 *
    1442  * @param WP_Post $post A post object with post type set to `wp_template` or `wp_template_part`.
    1443  * @return WP_Post The updated post object.
    1444  */
    1445 function inject_ignored_hooked_blocks_metadata_attributes( $post ) {
     1444 * @since 6.5.0
     1445 * @access private
     1446 *
     1447 * @param stdClass        $post    An object representing a template or template part
     1448 *                                 prepared for inserting or updating the database.
     1449 * @param WP_REST_Request $request Request object.
     1450 * @return stdClass The updated object representing a template or template part.
     1451 */
     1452function inject_ignored_hooked_blocks_metadata_attributes( $post, $request ) {
     1453    $filter_name = current_filter();
     1454    if ( ! str_starts_with( $filter_name, 'rest_pre_insert_' ) ) {
     1455        return $post;
     1456    }
     1457    $post_type = str_replace( 'rest_pre_insert_', '', $filter_name );
     1458
    14461459    $hooked_blocks = get_hooked_blocks();
    14471460    if ( empty( $hooked_blocks ) && ! has_filter( 'hooked_block_types' ) ) {
    1448         return;
     1461        return $post;
    14491462    }
    14501463
     
    14531466    // To that end, we need to suppress hooked blocks from getting inserted into the template.
    14541467    add_filter( 'hooked_block_types', '__return_empty_array', 99999, 0 );
    1455     $template = _build_block_template_result_from_post( $post );
     1468    $template = $request['id'] ? get_block_template( $request['id'], $post_type ) : null;
    14561469    remove_filter( 'hooked_block_types', '__return_empty_array', 99999 );
    14571470
     
    14591472    $after_block_visitor  = make_after_block_visitor( $hooked_blocks, $template, 'set_ignored_hooked_blocks_metadata' );
    14601473
    1461     $blocks  = parse_blocks( $template->content );
     1474    $blocks  = parse_blocks( $post->post_content );
    14621475    $content = traverse_and_serialize_blocks( $blocks, $before_block_visitor, $after_block_visitor );
    14631476
    1464     wp_update_post(
    1465         array(
    1466             'ID'           => $post->ID,
    1467             'post_content' => $content,
    1468         )
    1469     );
    1470 }
     1477    $post->post_content = $content;
     1478    return $post;
     1479}
Note: See TracChangeset for help on using the changeset viewer.