Automattic\WooCommerce\Blocks\BlockTypes

ProductButton::renderprotectedWC 1.0

Include and render the block.

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

Возвращает

Строку. 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.

Код ProductButton::render() WC 9.9.5

protected function render( $attributes, $content, $block ) {
	// This workaround ensures that WordPress loads the core/button block styles.
	// For more details, see https://github.com/woocommerce/woocommerce/pull/53052.
	( new \WP_Block( array( 'blockName' => 'core/button' ) ) )->render();

	global $product;
	$previous_product = $product;

	// Try to load the product from the block context, if not available,
	// use the global $product.
	$post_id = isset( $block->context['postId'] ) ? $block->context['postId'] : '';
	$post    = $post_id ? wc_get_product( $post_id ) : null;
	if ( $post instanceof \WC_Product ) {
		$product = $post;
	} elseif ( ! $product instanceof \WC_Product ) {
		return '';
	}

	$is_descendent_of_add_to_cart_form = isset( $block->context['woocommerce/isDescendantOfAddToCartWithOptions'] ) ? $block->context['woocommerce/isDescendantOfAddToCartWithOptions'] : false;

	if ( $is_descendent_of_add_to_cart_form && Utils::is_not_purchasable_simple_product( $product ) ) {
		$product = $previous_product;

		return '';
	}

	$this->initialize_cart_state();

	wp_interactivity_state(
		'woocommerce/product-button',
		array(
			'addToCartText' => function () {
				$context = wp_interactivity_get_context();
				$quantity = $context['tempQuantity'];
				$addToCartText = $context['addToCartText'];
				return $quantity > 0 ? sprintf(
					/* translators: %s: product number. */
					__( '%s in cart', 'woocommerce' ),
					$quantity
				) : $addToCartText;
			},
			'inTheCartText' => sprintf(
				/* translators: %s: product number. */
				__( '%s in cart', 'woocommerce' ),
				'###'
			),
			'noticeId'      => '',
		)
	);

	$number_of_items_in_cart  = $this->get_cart_item_quantities_by_product_id( $product->get_id() );
	$cart_redirect_after_add  = get_option( 'woocommerce_cart_redirect_after_add' ) === 'yes';
	$ajax_add_to_cart_enabled = get_option( 'woocommerce_enable_ajax_add_to_cart' ) === 'yes';
	$is_ajax_button           = $ajax_add_to_cart_enabled && ! $cart_redirect_after_add && $product->supports( 'ajax_add_to_cart' ) && $product->is_purchasable() && $product->is_in_stock();
	$html_element             = $is_ajax_button ? 'button' : 'a';
	$styles_and_classes       = StyleAttributesUtils::get_classes_and_styles_by_attributes( $attributes, array(), array( 'extra_classes' ) );
	$classname                = StyleAttributesUtils::get_classes_by_attributes( $attributes, array( 'extra_classes' ) );
	$custom_width_classes     = isset( $attributes['width'] ) ? 'has-custom-width wp-block-button__width-' . $attributes['width'] : '';
	$custom_align_classes     = isset( $attributes['textAlign'] ) ? 'align-' . $attributes['textAlign'] : '';
	$html_classes             = implode(
		' ',
		array_filter(
			array(
				'wp-block-button__link',
				'wp-element-button',
				'wc-block-components-product-button__button',
				$product->is_purchasable() && $product->is_in_stock() ? 'add_to_cart_button' : '',
				$is_ajax_button ? 'ajax_add_to_cart' : '',
				'product_type_' . $product->get_type(),
				esc_attr( $styles_and_classes['classes'] ),
			)
		)
	);

	$is_descendent_of_add_to_cart_form = isset( $block->context['woocommerce/isDescendantOfAddToCartWithOptions'] ) ? $block->context['woocommerce/isDescendantOfAddToCartWithOptions'] : false;

	$default_quantity = 1;

	if ( ! $is_descendent_of_add_to_cart_form ) {
		/**
		 * Filters the change the quantity to add to cart.
		 *
		 * @since 10.9.0
		 * @param number $default_quantity The default quantity.
		 * @param number $product_id The product id.
		 */
		$default_quantity = apply_filters( 'woocommerce_add_to_cart_quantity', $default_quantity, $product->get_id() );
	}

	$add_to_cart_text = null !== $product->add_to_cart_text() ? $product->add_to_cart_text() : __( 'Add to cart', 'woocommerce' );

	if ( $is_descendent_of_add_to_cart_form && null !== $product->single_add_to_cart_text() ) {
		$add_to_cart_text = $product->single_add_to_cart_text();
	}

	$context = array(
		'quantityToAdd'   => $default_quantity,
		'productId'       => $product->get_id(),
		'addToCartText'   => $add_to_cart_text,
		'tempQuantity'    => $number_of_items_in_cart,
		'animationStatus' => 'IDLE',
	);

	$attributes = array(
		'type' => $is_descendent_of_add_to_cart_form ? 'submit' : 'button',
	);

	if ( 'a' === $html_element ) {
		$attributes = array(
			'href' => esc_url( $product->add_to_cart_url() ),
			'rel'  => 'nofollow',
		);
	}

	/**
	 * Allow filtering of the add to cart button arguments.
	 *
	 * @since 9.7.0
	 */
	$args = apply_filters(
		'woocommerce_loop_add_to_cart_args',
		array(
			'class'      => $html_classes,
			'attributes' => array_merge(
				$attributes,
				array(
					'data-product_id'  => $product->get_id(),
					'data-product_sku' => $product->get_sku(),
					'aria-label'       => $product->add_to_cart_description(),
				),
			),
		),
		$product
	);

	if ( isset( $args['attributes']['aria-label'] ) ) {
		$args['attributes']['aria-label'] = wp_strip_all_tags( $args['attributes']['aria-label'] );
	}

	if ( isset( WC()->cart ) && ! WC()->cart->is_empty() ) {
		$this->prevent_cache();
	}

	$div_directives = '
		data-wp-interactive="woocommerce/product-button"
		data-wp-context=\'' . wp_json_encode( $context, JSON_NUMERIC_CHECK | JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP ) . '\'
		data-wp-init="actions.refreshCartItems"
	';

	$button_directives = $is_descendent_of_add_to_cart_form ? '' : 'data-wp-on--click="actions.addCartItem"';
	$anchor_directive  = 'data-wp-on--click="woocommerce/product-collection::actions.viewProduct"';

	$span_button_directives = '
		data-wp-text="state.addToCartText"
		data-wp-class--wc-block-slide-in="state.slideInAnimation"
		data-wp-class--wc-block-slide-out="state.slideOutAnimation"
		data-wp-on--animationend="actions.handleAnimationEnd"
		data-wp-watch="callbacks.startAnimation"
		data-wp-run="callbacks.syncTempQuantityOnLoad"
	';

	$wrapper_attributes = get_block_wrapper_attributes(
		array(
			'class' => implode(
				' ',
				array_filter(
					[
						'wp-block-button wc-block-components-product-button',
						esc_attr( $classname . ' ' . $custom_width_classes . ' ' . $custom_align_classes ),
					]
				)
			),
		)
	);

	/**
	 * Filters the add to cart button class.
	 *
	 * @since 8.7.0
	 *
	 * @param string $class The class.
	 */
	$html = apply_filters(
		'woocommerce_loop_add_to_cart_link',
		strtr(
			'<div {wrapper_attributes}
				{div_directives}
			>
				<{html_element}
					class="{button_classes}"
					style="{button_styles}"
					{attributes}
					{button_directives}
				>
				<span {span_button_directives}>{add_to_cart_text}</span>
				</{html_element}>
				{view_cart_html}
			</div>',
			array(
				'{wrapper_attributes}'     => $wrapper_attributes,
				'{html_element}'           => $html_element,
				'{button_classes}'         => isset( $args['class'] ) ? esc_attr( $args['class'] . ' wc-interactive' ) : 'wc-interactive',
				'{button_styles}'          => esc_attr( $styles_and_classes['styles'] ),
				'{attributes}'             => isset( $args['attributes'] ) ? wc_implode_html_attributes( $args['attributes'] ) : '',
				'{add_to_cart_text}'       => $is_ajax_button ? '' : $add_to_cart_text,
				'{div_directives}'         => $is_ajax_button ? $div_directives : '',
				'{button_directives}'      => $is_ajax_button ? $button_directives : $anchor_directive,
				'{span_button_directives}' => $is_ajax_button ? $span_button_directives : '',
				'{view_cart_html}'         => $is_ajax_button && CartCheckoutUtils::has_cart_page() ? $this->get_view_cart_html() : '',
			)
		),
		$product,
		$args
	);

	$product = $previous_product;

	return $html;
}