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;
}