block_core_query_disable_enhanced_pagination

The timeline below displays how wordpress function block_core_query_disable_enhanced_pagination has changed across different WordPress versions. If a version is not listed, refer to the next available version below.

WordPress Version: 6.5

/**
 * Traverse the tree of blocks looking for any plugin block (i.e., a block from
 * an installed plugin) inside a Query block with the enhanced pagination
 * enabled. If at least one is found, the enhanced pagination is effectively
 * disabled to prevent any potential incompatibilities.
 *
 * @since 6.4.0
 *
 * @param array $parsed_block The block being rendered.
 * @return string Returns the parsed block, unmodified.
 */
function block_core_query_disable_enhanced_pagination($parsed_block)
{
    static $enhanced_query_stack = array();
    static $dirty_enhanced_queries = array();
    static $render_query_callback = null;
    $block_name = $parsed_block['blockName'];
    $block_type = WP_Block_Type_Registry::get_instance()->get_registered($block_name);
    $has_enhanced_pagination = isset($parsed_block['attrs']['enhancedPagination']) && true === $parsed_block['attrs']['enhancedPagination'] && isset($parsed_block['attrs']['queryId']);
    /*
     * Client side navigation can be true in two states:
     *  - supports.interactivity = true;
     *  - supports.interactivity.clientNavigation = true;
     */
    $supports_client_navigation = isset($block_type->supports['interactivity']['clientNavigation']) && true === $block_type->supports['interactivity']['clientNavigation'] || isset($block_type->supports['interactivity']) && true === $block_type->supports['interactivity'];
    if ('core/query' === $block_name && $has_enhanced_pagination) {
        $enhanced_query_stack[] = $parsed_block['attrs']['queryId'];
        if (!isset($render_query_callback)) {
            /**
             * Filter that disables the enhanced pagination feature during block
             * rendering when a plugin block has been found inside. It does so
             * by adding an attribute called `data-wp-navigation-disabled` which
             * is later handled by the front-end logic.
             *
             * @param string   $content  The block content.
             * @param array    $block    The full block, including name and attributes.
             * @return string Returns the modified output of the query block.
             */
            $render_query_callback = static function ($content, $block) use (&$enhanced_query_stack, &$dirty_enhanced_queries, &$render_query_callback) {
                $has_enhanced_pagination = isset($block['attrs']['enhancedPagination']) && true === $block['attrs']['enhancedPagination'] && isset($block['attrs']['queryId']);
                if (!$has_enhanced_pagination) {
                    return $content;
                }
                if (isset($dirty_enhanced_queries[$block['attrs']['queryId']])) {
                    // Disable navigation in the router store config.
                    wp_interactivity_config('core/router', array('clientNavigationDisabled' => true));
                    $dirty_enhanced_queries[$block['attrs']['queryId']] = null;
                }
                array_pop($enhanced_query_stack);
                if (empty($enhanced_query_stack)) {
                    remove_filter('render_block_core/query', $render_query_callback);
                    $render_query_callback = null;
                }
                return $content;
            };
            add_filter('render_block_core/query', $render_query_callback, 10, 2);
        }
    } elseif (!empty($enhanced_query_stack) && isset($block_name) && !$supports_client_navigation) {
        foreach ($enhanced_query_stack as $query_id) {
            $dirty_enhanced_queries[$query_id] = true;
        }
    }
    return $parsed_block;
}

WordPress Version: 6.4

/**
 * Traverse the tree of blocks looking for any plugin block (i.e., a block from
 * an installed plugin) inside a Query block with the enhanced pagination
 * enabled. If at least one is found, the enhanced pagination is effectively
 * disabled to prevent any potential incompatibilities.
 *
 * @since 6.4.0
 *
 * @param array $parsed_block The block being rendered.
 * @return string Returns the parsed block, unmodified.
 */
function block_core_query_disable_enhanced_pagination($parsed_block)
{
    static $enhanced_query_stack = array();
    static $dirty_enhanced_queries = array();
    static $render_query_callback = null;
    $block_name = $parsed_block['blockName'];
    if ('core/query' === $block_name && isset($parsed_block['attrs']['enhancedPagination']) && true === $parsed_block['attrs']['enhancedPagination'] && isset($parsed_block['attrs']['queryId'])) {
        $enhanced_query_stack[] = $parsed_block['attrs']['queryId'];
        if (!isset($render_query_callback)) {
            /**
             * Filter that disables the enhanced pagination feature during block
             * rendering when a plugin block has been found inside. It does so
             * by adding an attribute called `data-wp-navigation-disabled` which
             * is later handled by the front-end logic.
             *
             * @param string   $content  The block content.
             * @param array    $block    The full block, including name and attributes.
             * @return string Returns the modified output of the query block.
             */
            $render_query_callback = static function ($content, $block) use (&$enhanced_query_stack, &$dirty_enhanced_queries, &$render_query_callback) {
                $has_enhanced_pagination = isset($block['attrs']['enhancedPagination']) && true === $block['attrs']['enhancedPagination'] && isset($block['attrs']['queryId']);
                if (!$has_enhanced_pagination) {
                    return $content;
                }
                if (isset($dirty_enhanced_queries[$block['attrs']['queryId']])) {
                    $p = new WP_HTML_Tag_Processor($content);
                    if ($p->next_tag()) {
                        $p->set_attribute('data-wp-navigation-disabled', 'true');
                    }
                    $content = $p->get_updated_html();
                    $dirty_enhanced_queries[$block['attrs']['queryId']] = null;
                }
                array_pop($enhanced_query_stack);
                if (empty($enhanced_query_stack)) {
                    remove_filter('render_block_core/query', $render_query_callback);
                    $render_query_callback = null;
                }
                return $content;
            };
            add_filter('render_block_core/query', $render_query_callback, 10, 2);
        }
    } elseif (!empty($enhanced_query_stack) && isset($block_name) && (!str_starts_with($block_name, 'core/') || 'core/post-content' === $block_name)) {
        foreach ($enhanced_query_stack as $query_id) {
            $dirty_enhanced_queries[$query_id] = true;
        }
    }
    return $parsed_block;
}