Automattic\WooCommerce\Blocks\BlockTypes\ProductCollection
Controller::disable_enhanced_pagination
Check inner blocks of Product Collection block if there's one incompatible with the Interactivity API and if so, disable client-side navigation.
Метод класса: Controller{}
Хуков нет.
Возвращает
Строку. Returns the parsed block, unmodified.
Использование
$Controller = new Controller(); $Controller->disable_enhanced_pagination( $parsed_block );
- $parsed_block(массив) (обязательный)
- The block being rendered.
Код Controller::disable_enhanced_pagination() Controller::disable enhanced pagination WC 10.7.0
public function disable_enhanced_pagination( $parsed_block ) {
static $enhanced_query_stack = array();
static $dirty_enhanced_queries = array();
static $render_product_collection_callback = null;
$block_name = $parsed_block['blockName'];
$is_product_collection_block = $parsed_block['attrs']['query']['isProductCollectionBlock'] ?? false;
$force_page_reload_global =
$parsed_block['attrs']['forcePageReload'] ?? false &&
isset( $parsed_block['attrs']['queryId'] );
if (
$is_product_collection_block &&
'woocommerce/product-collection' === $block_name &&
! $force_page_reload_global &&
isset( $parsed_block['attrs']['queryId'] )
) {
$enhanced_query_stack[] = $parsed_block['attrs']['queryId'];
if ( ! isset( $render_product_collection_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_product_collection_callback = static function ( $content, $block ) use ( &$enhanced_query_stack, &$dirty_enhanced_queries, &$render_product_collection_callback ) {
$force_page_reload =
$parsed_block['attrs']['forcePageReload'] ?? false &&
isset( $block['attrs']['queryId'] );
if ( $force_page_reload ) {
return $content;
}
if ( isset( $block['attrs']['queryId'] ) && isset( $dirty_enhanced_queries[ $block['attrs']['queryId'] ] ) ) {
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_woocommerce/product-collection', $render_product_collection_callback, 5 );
$render_product_collection_callback = null;
}
return $content;
};
add_filter( 'render_block_woocommerce/product-collection', $render_product_collection_callback, 5, 2 );
}
} elseif (
! empty( $enhanced_query_stack ) &&
isset( $block_name ) &&
! $this->is_block_compatible( $block_name )
) {
foreach ( $enhanced_query_stack as $query_id ) {
$dirty_enhanced_queries[ $query_id ] = true;
}
}
return $parsed_block;
}