Automattic\WooCommerce\Blocks\BlockTypes

ProductFilterPriceSlider::renderprotectedWC 1.0

Render the block.

Method of the class: ProductFilterPriceSlider{}

No Hooks.

Returns

String. Rendered block type output.

Usage

// protected - for code of main (parent) or child class
$result = $this->render( $attributes, $content, $block );
$attributes(array) (required)
Block attributes.
$content(string) (required)
Block content.
$block(WP_Block) (required)
Block instance.

ProductFilterPriceSlider::render() code WC 10.3.6

<?php
protected function render( $attributes, $content, $block ) {
	if ( is_admin() || wp_doing_ajax() || empty( $block->context['filterData'] ) || empty( $block->context['filterData']['price'] ) ) {
		return '';
	}

	$price_data = $block->context['filterData']['price'];
	$min_price  = $price_data['minPrice'];
	$max_price  = $price_data['maxPrice'];
	$min_range  = $price_data['minRange'];
	$max_range  = $price_data['maxRange'];

	if ( $min_range === $max_range ) {
		return;
	}

	$classes = '';
	$style   = '';

	$tags = new \WP_HTML_Tag_Processor( $content );
	if ( $tags->next_tag( array( 'class_name' => 'wc-block-product-filter-price-slider' ) ) ) {
		$classes = $tags->get_attribute( 'class' );
		$style   = $tags->get_attribute( 'style' );
	}

	$show_input_fields = isset( $attributes['showInputFields'] ) ? $attributes['showInputFields'] : false;
	$inline_input      = isset( $attributes['inlineInput'] ) ? $attributes['inlineInput'] : false;

	$wrapper_attributes = get_block_wrapper_attributes(
		array(
			'data-wp-interactive' => 'woocommerce/product-filters',
			'data-wp-key'         => wp_unique_prefixed_id( $this->get_full_block_name() ),
			'class'               => esc_attr( $classes ),
			'style'               => esc_attr( $style ),
		)
	);

	$content_class = 'wc-block-product-filter-price-slider__content';
	if ( $inline_input && $show_input_fields ) {
		$content_class .= ' wc-block-product-filter-price-slider__content--inline';
	}

	// CSS variables for the range bar style.
	$__low       = 100 * ( $min_price - $min_range ) / ( $max_range - $min_range );
	$__high      = 100 * ( $max_price - $min_range ) / ( $max_range - $min_range );
	$range_style = "--low: $__low%; --high: $__high%";

	wp_interactivity_state(
		'woocommerce/product-filters',
		array(
			'rangeStyle' => $range_style,
		)
	);

	/**
	 * Accessibility: Assign the left input to a variable to conditionally
	 * render it based on the inline input setting. We do this to have the
	 * correct focus order of the input fields.
	 */
	ob_start();
	?>
	<div class="wc-block-product-filter-price-slider__left text">
		<?php if ( $show_input_fields ) : ?>
			<input
				class="min"
				type="text"
				data-wp-bind--value="state.formattedMinPrice"
				data-wp-on--focus="actions.selectInputContent"
				data-wp-on--input="actions.debounceSetMinPrice"
				aria-label="<?php esc_attr_e( 'Filter products by minimum price', 'woocommerce' ); ?>"
			/>
		<?php else : ?>
			<span data-wp-text="state.formattedMinPrice"></span>
		<?php endif; ?>
	</div>
	<?php
	$left_input = ob_get_clean();

	ob_start();
	?>
	<div <?php echo $wrapper_attributes; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>>
		<div class="<?php echo esc_attr( $content_class ); ?>">
			<?php if ( $inline_input ) : ?>
				<?php echo $left_input; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
			<?php endif; ?>
			<div
				class="wc-block-product-filter-price-slider__range"
				data-wp-bind--style="state.rangeStyle"
			>
				<div class="range-bar"></div>
				<input
					type="range"
					class="min"
					min="<?php echo esc_attr( $min_range ); ?>"
					max="<?php echo esc_attr( $max_range ); ?>"
					data-wp-bind--value="state.minPrice"
					data-wp-on--input="actions.setMinPrice"
					data-wp-on--mouseup="actions.navigate"
					data-wp-on--keyup="actions.navigate"
					data-wp-on--touchend="actions.navigate"
					aria-label="<?php esc_attr_e( 'Filter products by minimum price', 'woocommerce' ); ?>"
				/>
				<input
					type="range"
					class="max"
					min="<?php echo esc_attr( $min_range ); ?>"
					max="<?php echo esc_attr( $max_range ); ?>"
					data-wp-bind--value="state.maxPrice"
					data-wp-on--input="actions.setMaxPrice"
					data-wp-on--mouseup="actions.navigate"
					data-wp-on--keyup="actions.navigate"
					data-wp-on--touchend="actions.navigate"
					aria-label="<?php esc_attr_e( 'Filter products by maximum price', 'woocommerce' ); ?>"
				/>
			</div>
			<?php if ( ! $inline_input ) : ?>
				<?php echo $left_input; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
			<?php endif; ?>
			<div class="wc-block-product-filter-price-slider__right text">
				<?php if ( $show_input_fields ) : ?>
					<input
						class="max"
						type="text"
						data-wp-bind--value="state.formattedMaxPrice"
						data-wp-on--focus="actions.selectInputContent"
						data-wp-on--input="actions.debounceSetMaxPrice"
						aria-label="<?php esc_attr_e( 'Filter products by maximum price', 'woocommerce' ); ?>"
					/>
				<?php else : ?>
				<span data-wp-text="state.formattedMaxPrice"></span>
				<?php endif; ?>
			</div>
		</div>
	</div>
	<?php
	return ob_get_clean();
}