Automattic\WooCommerce\Blocks\BlockTypes

ProductFilters::renderprotectedWC 1.0

Include and render the block.

Метод класса: ProductFilters{}

Возвращает

Строку. Rendered block type output.

Использование

// protected - в коде основоного (родительского) или дочернего класса
$result = $this->render( $attributes, $content, $block );
$attributes(массив) (обязательный)
Block attributes.
По умолчанию: empty array
$content(строка) (обязательный)
Block content.
По умолчанию: empty string
$block(WP_Block) (обязательный)
Block instance.

Код ProductFilters::render() WC 11.0.1

<?php
protected function render( $attributes, $content, $block ) {
	if ( ! $block instanceof WP_Block ) {
		return $content;
	}

	wp_enqueue_script( 'wc-settings' );

	$query_id      = $block->context['queryId'] ?? 0;
	$filter_params = $this->get_filter_params( $query_id );

	wp_interactivity_config( $this->get_full_block_name(), [ 'canonicalUrl' => $this->get_canonical_url_no_pagination( $filter_params ) ] );

	/**
	 * Filter hook to modify the selected filter items.
	 *
	 * @since 9.7.0
	 */
	$active_filters = apply_filters( 'woocommerce_blocks_product_filters_selected_items', array(), $filter_params );

	usort(
		$active_filters,
		function ( $a, $b ) {
			return strnatcmp( $a['activeLabel'], $b['activeLabel'] );
		}
	);

	$block_context         = array_merge(
		$block->context,
		array(
			'filterParams'  => $filter_params,
			'activeFilters' => $active_filters,
		),
	);
	$inner_blocks          = array_reduce(
		$block->parsed_block['innerBlocks'],
		function ( $carry, $parsed_block ) use ( $block_context ) {
			$carry .= ( new \WP_Block( $parsed_block, $block_context ) )->render();
			return $carry;
		},
		''
	);
	$interactivity_context = array(
		'params'          => $filter_params,
		'activeFilters'   => $active_filters,
		// Null when not a descendant of a Product Collection block, so the
		// frontend can fall back to the global interactivity config.
		'forcePageReload' => isset( $block->context['forcePageReload'] ) ? (bool) $block->context['forcePageReload'] : null,
	);

	$show_filter_drawer = ! isset( $attributes['showFilterDrawer'] ) || false !== $attributes['showFilterDrawer'];
	$wrapper_classes    = array( 'wc-block-product-filters' );
	if ( ! $show_filter_drawer ) {
		$wrapper_classes[] = 'is-filter-drawer-disabled';
	}

	$wrapper_attributes = array(
		'class'                         => implode( ' ', $wrapper_classes ),
		'data-wp-interactive'           => $this->get_full_block_name(),
		'data-wp-init--colors'          => 'callbacks.initColors',
		'data-wp-watch--active-filters' => 'callbacks.syncActiveFiltersWithServer',
		'data-wp-context'               => (string) wp_json_encode( $interactivity_context, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP ),
		'style'                         => $this->get_css_variables( $attributes ),
	);

	if ( $show_filter_drawer ) {
		$wrapper_attributes['data-wp-watch--scrolling']         = 'callbacks.scrollLimit';
		$wrapper_attributes['data-wp-on--keyup']                = 'actions.closeOverlayOnEscape';
		$wrapper_attributes['data-wp-class--is-overlay-opened'] = 'context.isOverlayOpened';
	}

	// TODO: Remove this conditional once the fix is released in WP. https://github.com/woocommerce/gutenberg/pull/4.
	if ( ! isset( $block->context['productCollectionLocation'] ) ) {
		$wrapper_attributes['data-wp-router-region'] = $this->generate_navigation_id( $block );
	}

	ob_start();
	?>
	<div <?php echo get_block_wrapper_attributes( $wrapper_attributes ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>>
		<?php if ( $show_filter_drawer ) : ?>
			<button
				type="button"
				class="wc-block-product-filters__open-overlay"
				data-wp-on--click="actions.openOverlay"
			>
				<?php echo $this->get_svg_icon( 'filter-icon-2' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
				<span><?php echo esc_html__( 'Filter products', 'woocommerce' ); ?></span>
			</button>
			<div class="wc-block-product-filters__overlay">
				<div class="wc-block-product-filters__overlay-wrapper">
					<div
						class="wc-block-product-filters__overlay-dialog"
						role="dialog"
						aria-label="<?php echo esc_html__( 'Product Filters', 'woocommerce' ); ?>"
					>
						<header class="wc-block-product-filters__overlay-header">
							<button
								type="button"
								class="wc-block-product-filters__close-overlay"
								data-wp-on--click="actions.closeOverlay"
							>
								<span><?php echo esc_html__( 'Close', 'woocommerce' ); ?></span>
								<?php echo $this->get_svg_icon( 'close' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
							</button>
						</header>
						<div class="wc-block-product-filters__overlay-content">
							<?php echo $inner_blocks; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
						</div>
						<footer
							class="wc-block-product-filters__overlay-footer"
						>
							<button
								type="button"
								class="wc-block-product-filters__apply wp-element-button"
								data-wp-interactive="<?php echo esc_attr( $this->get_full_block_name() ); ?>"
								data-wp-on--click="actions.closeOverlay"
							>
								<span><?php echo esc_html__( 'Apply', 'woocommerce' ); ?></span>
							</button>
						</footer>
					</div>
				</div>
			</div>
		<?php else : ?>
			<div class="wc-block-product-filters__content">
				<?php echo $inner_blocks; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
			</div>
		<?php endif; ?>
	</div>
	<?php
	return ob_get_clean();
}