Make WordPress Core


Ignore:
Timestamp:
02/07/2025 03:44:07 PM (19 months ago)
Author:
joemcgill
Message:

Editor: Update packages for 6.8 pre-Betas.

Syncs @wordpress/* packages to the 'latest' npm tag.

Props mamaduka, joemcgill, youknowriad, swissspidy, sergiomdgomes, gziolo.
See #62887.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/blocks/navigation.php

    r59119 r59775  
    344344
    345345                $navigation_name = $attributes['ariaLabel'] ?? '';
     346
     347                if ( ! empty( $navigation_name ) ) {
     348                        return $navigation_name;
     349                }
    346350
    347351                // Load the navigation post.
     
    536540                        $toggle_aria_label_open,
    537541                        $toggle_aria_label_close,
    538                         esc_attr( implode( ' ', $responsive_container_classes ) ),
    539                         esc_attr( implode( ' ', $open_button_classes ) ),
     542                        esc_attr( trim( implode( ' ', $responsive_container_classes ) ) ),
     543                        esc_attr( trim( implode( ' ', $open_button_classes ) ) ),
    540544                        ( ! empty( $overlay_inline_styles ) ) ? "style=\"$overlay_inline_styles\"" : '',
    541545                        $toggle_button_content,
     
    564568                $style              = static::get_styles( $attributes );
    565569                $class              = static::get_classes( $attributes );
    566                 $wrapper_attributes = get_block_wrapper_attributes(
    567                         array(
    568                                 'class'      => $class,
    569                                 'style'      => $style,
    570                                 'aria-label' => $nav_menu_name,
    571                         )
     570                $extra_attributes   = array(
     571                        'class' => $class,
     572                        'style' => $style,
    572573                );
     574                if ( ! empty( $nav_menu_name ) ) {
     575                        $extra_attributes['aria-label'] = $nav_menu_name;
     576                }
     577                $wrapper_attributes = get_block_wrapper_attributes( $extra_attributes );
    573578
    574579                if ( $is_responsive_menu ) {
     
    814819                // Add directives to the parent `<li>`.
    815820                $tags->set_attribute( 'data-wp-interactive', 'core/navigation' );
    816                 $tags->set_attribute( 'data-wp-context', '{ "submenuOpenedBy": { "click": false, "hover": false, "focus": false }, "type": "submenu" }' );
     821                $tags->set_attribute( 'data-wp-context', '{ "submenuOpenedBy": { "click": false, "hover": false, "focus": false }, "type": "submenu", "modal": null }' );
    817822                $tags->set_attribute( 'data-wp-watch', 'callbacks.initMenu' );
    818823                $tags->set_attribute( 'data-wp-on--focusout', 'actions.handleMenuFocusout' );
     
    14341439
    14351440/**
    1436  * Accepts the serialized markup of a block and its inner blocks, and returns serialized markup of the inner blocks.
    1437  *
    1438  * @since 6.5.0
    1439  *
    1440  * @param string $serialized_block The serialized markup of a block and its inner blocks.
    1441  * @return string
    1442  */
    1443 function block_core_navigation_remove_serialized_parent_block( $serialized_block ) {
    1444         $start = strpos( $serialized_block, '-->' ) + strlen( '-->' );
    1445         $end   = strrpos( $serialized_block, '<!--' );
    1446         return substr( $serialized_block, $start, $end - $start );
    1447 }
    1448 
    1449 /**
    14501441 * Mock a parsed block for the Navigation block given its inner blocks and the `wp_navigation` post object.
    14511442 * The `wp_navigation` post's `_wp_ignored_hooked_blocks` meta is queried to add the `metadata.ignoredHookedBlocks` attribute.
     
    15011492        $mock_navigation_block = block_core_navigation_mock_parsed_block( $inner_blocks, $post );
    15021493
    1503         if ( function_exists( 'apply_block_hooks_to_content' ) ) {
    1504                 $mock_navigation_block_markup = serialize_block( $mock_navigation_block );
    1505                 return apply_block_hooks_to_content( $mock_navigation_block_markup, $post, 'insert_hooked_blocks' );
    1506         }
    1507 
    1508         $hooked_blocks        = get_hooked_blocks();
    1509         $before_block_visitor = null;
    1510         $after_block_visitor  = null;
    1511 
    1512         if ( ! empty( $hooked_blocks ) || has_filter( 'hooked_block_types' ) ) {
    1513                 $before_block_visitor = make_before_block_visitor( $hooked_blocks, $post, 'insert_hooked_blocks' );
    1514                 $after_block_visitor  = make_after_block_visitor( $hooked_blocks, $post, 'insert_hooked_blocks' );
    1515         }
    1516 
    1517         return traverse_and_serialize_block( $mock_navigation_block, $before_block_visitor, $after_block_visitor );
    1518 }
    1519 
    1520 /**
    1521  * Insert ignoredHookedBlocks meta into the Navigation block and its inner blocks.
    1522  *
    1523  * Given a Navigation block's inner blocks and its corresponding `wp_navigation` post object,
    1524  * this function inserts ignoredHookedBlocks meta into it, and returns the serialized inner blocks in a
    1525  * mock Navigation block wrapper.
    1526  *
    1527  * @since 6.5.0
    1528  *
    1529  * @param array   $inner_blocks Parsed inner blocks of a Navigation block.
    1530  * @param WP_Post $post         `wp_navigation` post object corresponding to the block.
    1531  * @return string Serialized inner blocks in mock Navigation block wrapper, with hooked blocks inserted, if any.
    1532  */
    1533 function block_core_navigation_set_ignored_hooked_blocks_metadata( $inner_blocks, $post ) {
    1534         $mock_navigation_block = block_core_navigation_mock_parsed_block( $inner_blocks, $post );
    1535         $hooked_blocks         = get_hooked_blocks();
    1536         $before_block_visitor  = null;
    1537         $after_block_visitor   = null;
    1538 
    1539         if ( ! empty( $hooked_blocks ) || has_filter( 'hooked_block_types' ) ) {
    1540                 $before_block_visitor = make_before_block_visitor( $hooked_blocks, $post, 'set_ignored_hooked_blocks_metadata' );
    1541                 $after_block_visitor  = make_after_block_visitor( $hooked_blocks, $post, 'set_ignored_hooked_blocks_metadata' );
    1542         }
    1543 
    1544         return traverse_and_serialize_block( $mock_navigation_block, $before_block_visitor, $after_block_visitor );
    1545 }
    1546 
    1547 /**
    1548  * Updates the post meta with the list of ignored hooked blocks when the navigation is created or updated via the REST API.
    1549  *
    1550  * @access private
    1551  * @since 6.5.0
    1552  *
    1553  * @param stdClass $post Post object.
    1554  * @return stdClass The updated post object.
    1555  */
    1556 function block_core_navigation_update_ignore_hooked_blocks_meta( $post ) {
    1557         /*
    1558          * In this scenario the user has likely tried to create a navigation via the REST API.
    1559          * In which case we won't have a post ID to work with and store meta against.
    1560          */
    1561         if ( empty( $post->ID ) ) {
    1562                 return $post;
    1563         }
    1564 
    1565         /**
    1566          * Skip meta generation when consumers intentionally update specific Navigation fields
    1567          * and omit the content update.
    1568          */
    1569         if ( ! isset( $post->post_content ) ) {
    1570                 return $post;
    1571         }
    1572 
    1573         /*
    1574          * We run the Block Hooks mechanism to inject the `metadata.ignoredHookedBlocks` attribute into
    1575          * all anchor blocks. For the root level, we create a mock Navigation and extract them from there.
    1576          */
    1577         $blocks = parse_blocks( $post->post_content );
    1578 
    1579         /*
    1580          * Block Hooks logic requires a `WP_Post` object (rather than the `stdClass` with the updates that
    1581          * we're getting from the `rest_pre_insert_wp_navigation` filter) as its second argument (to be
    1582          * used as context for hooked blocks insertion).
    1583          * We thus have to look it up from the DB,based on `$post->ID`.
    1584          */
    1585         $markup = block_core_navigation_set_ignored_hooked_blocks_metadata( $blocks, get_post( $post->ID ) );
    1586 
    1587         $root_nav_block        = parse_blocks( $markup )[0];
    1588         $ignored_hooked_blocks = isset( $root_nav_block['attrs']['metadata']['ignoredHookedBlocks'] )
    1589                 ? $root_nav_block['attrs']['metadata']['ignoredHookedBlocks']
    1590                 : array();
    1591 
    1592         if ( ! empty( $ignored_hooked_blocks ) ) {
    1593                 $existing_ignored_hooked_blocks = get_post_meta( $post->ID, '_wp_ignored_hooked_blocks', true );
    1594                 if ( ! empty( $existing_ignored_hooked_blocks ) ) {
    1595                         $existing_ignored_hooked_blocks = json_decode( $existing_ignored_hooked_blocks, true );
    1596                         $ignored_hooked_blocks          = array_unique( array_merge( $ignored_hooked_blocks, $existing_ignored_hooked_blocks ) );
    1597                 }
    1598                 update_post_meta( $post->ID, '_wp_ignored_hooked_blocks', json_encode( $ignored_hooked_blocks ) );
    1599         }
    1600 
    1601         $post->post_content = block_core_navigation_remove_serialized_parent_block( $markup );
    1602         return $post;
    1603 }
    1604 
    1605 /*
    1606  * Before adding our filter, we verify if it's already added in Core.
    1607  * However, during the build process, Gutenberg automatically prefixes our functions with "gutenberg_".
    1608  * Therefore, we concatenate the Core's function name to circumvent this prefix for our check.
    1609  */
    1610 $rest_insert_wp_navigation_core_callback = 'block_core_navigation_' . 'update_ignore_hooked_blocks_meta'; // phpcs:ignore Generic.Strings.UnnecessaryStringConcat.Found
    1611 
    1612 /*
    1613  * Do not add the `block_core_navigation_update_ignore_hooked_blocks_meta` filter in the following cases:
    1614  * - If Core has added the `update_ignored_hooked_blocks_postmeta` filter already (WP >= 6.6);
    1615  * - or if the `$rest_insert_wp_navigation_core_callback` filter has already been added.
    1616  */
    1617 if (
    1618         ! has_filter( 'rest_pre_insert_wp_navigation', 'update_ignored_hooked_blocks_postmeta' ) &&
    1619         ! has_filter( 'rest_pre_insert_wp_navigation', $rest_insert_wp_navigation_core_callback )
    1620 ) {
    1621         add_filter( 'rest_pre_insert_wp_navigation', 'block_core_navigation_update_ignore_hooked_blocks_meta' );
    1622 }
    1623 
    1624 /**
    1625  * Hooks into the REST API response for the core/navigation block and adds the first and last inner blocks.
    1626  *
    1627  * @since 6.5.0
    1628  *
    1629  * @param WP_REST_Response $response The response object.
    1630  * @param WP_Post          $post     Post object.
    1631  * @return WP_REST_Response The response object.
    1632  */
    1633 function block_core_navigation_insert_hooked_blocks_into_rest_response( $response, $post ) {
    1634         if ( ! isset( $response->data['content']['raw'] ) || ! isset( $response->data['content']['rendered'] ) ) {
    1635                 return $response;
    1636         }
    1637         $parsed_blocks = parse_blocks( $response->data['content']['raw'] );
    1638         $content       = block_core_navigation_insert_hooked_blocks( $parsed_blocks, $post );
    1639 
    1640         // Remove mock Navigation block wrapper.
    1641         $content = block_core_navigation_remove_serialized_parent_block( $content );
    1642 
    1643         $response->data['content']['raw'] = $content;
    1644 
    1645         /** This filter is documented in wp-includes/post-template.php */
    1646         $response->data['content']['rendered'] = apply_filters( 'the_content', $content );
    1647 
    1648         return $response;
    1649 }
    1650 
    1651 /*
    1652  *  Before adding our filter, we verify if it's already added in Core.
    1653  * However, during the build process, Gutenberg automatically prefixes our functions with "gutenberg_".
    1654  * Therefore, we concatenate the Core's function name to circumvent this prefix for our check.
    1655  */
    1656 $rest_prepare_wp_navigation_core_callback = 'block_core_navigation_' . 'insert_hooked_blocks_into_rest_response';
    1657 
    1658 /*
    1659  * Do not add the `block_core_navigation_insert_hooked_blocks_into_rest_response` filter in the following cases:
    1660  * - If Core has added the `insert_hooked_blocks_into_rest_response` filter already (WP >= 6.6);
    1661  * - or if the `$rest_prepare_wp_navigation_core_callback` filter has already been added.
    1662  */
    1663 if (
    1664         ! has_filter( 'rest_prepare_wp_navigation', 'insert_hooked_blocks_into_rest_response' ) &&
    1665         ! has_filter( 'rest_prepare_wp_navigation', $rest_prepare_wp_navigation_core_callback )
    1666 ) {
    1667         add_filter( 'rest_prepare_wp_navigation', 'block_core_navigation_insert_hooked_blocks_into_rest_response', 10, 3 );
    1668 }
     1494        $mock_navigation_block_markup = serialize_block( $mock_navigation_block );
     1495        return apply_block_hooks_to_content( $mock_navigation_block_markup, $post, 'insert_hooked_blocks' );
     1496}
Note: See TracChangeset for help on using the changeset viewer.