WC_Shortcodes::product_page()public staticWC 1.0

Show a single product page.

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

Возвращает

Строку.

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

$result = WC_Shortcodes::product_page( $atts );
$atts(массив) (обязательный)
Attributes.

Код WC_Shortcodes::product_page() WC 8.7.0

<?php
public static function product_page( $atts ) {
	if ( empty( $atts ) ) {
		return '';
	}

	if ( ! isset( $atts['id'] ) && ! isset( $atts['sku'] ) ) {
		return '';
	}

	$product_id = isset( $atts['id'] ) ? absint( $atts['id'] ) : 0;
	if ( ! $product_id && isset( $atts['sku'] ) ) {
		$product_id = wc_get_product_id_by_sku( $atts['sku'] );
	}

	$product_status = empty( $atts['status'] ) ? 'publish' : $atts['status'];
	/**
	 * Filters the list of invalid statuses for the `product_page` shortcode.
	 *
	 * @since 8.6.0
	 * @param array $invalid_statuses List of invalid statuses.
	 * @param int   $product_id       Product ID.
	 * @return array
	 */
	$invalid_statuses = apply_filters( 'woocommerce_shortcode_product_page_invalid_statuses', array( 'trash' ), $product_id );
	if ( in_array( $product_status, $invalid_statuses, true ) ) {
		return '';
	}
	/**
	 * Filters whether to override read permissions for unpublished products.
	 *
	 * @since 8.6.0
	 * @param bool   $force_rendering Whether to override read permissions for unpublished products. `true` to force rendering the product page, `false` to block rendering, or `null` to use the default behavior.
	 * @param int    $product_id                Product ID.
	 * @return bool
	 */
	$force_rendering = apply_filters( 'woocommerce_shortcode_product_page_force_rendering', null, $product_id );
	if ( isset( $force_rendering ) && ! $force_rendering ) {
		return '';
	}

	$args = array(
		'posts_per_page'      => 1,
		'post_type'           => 'product',
		'post_status'         => $product_status,
		'ignore_sticky_posts' => 1,
		'no_found_rows'       => 1,
	);

	if ( isset( $atts['sku'] ) ) {
		$args['meta_query'][] = array(
			'key'     => '_sku',
			'value'   => sanitize_text_field( $atts['sku'] ),
			'compare' => '=',
		);

		$args['post_type'] = array( 'product', 'product_variation' );
	}

	if ( isset( $atts['id'] ) ) {
		$args['p'] = absint( $atts['id'] );
	}

	// Don't render titles if desired.
	if ( isset( $atts['show_title'] ) && ! $atts['show_title'] ) {
		remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_title', 5 );
	}

	// Change form action to avoid redirect.
	add_filter( 'woocommerce_add_to_cart_form_action', '__return_empty_string' );

	$single_product = new WP_Query( $args );

	if (
		! isset( $force_rendering ) &&
		$single_product->have_posts() &&
		'publish' !== $single_product->post->post_status &&
		! current_user_can( 'read_product', $single_product->post->ID )
	) {
		return '';
	}

	$preselected_id = '0';

	// Check if sku is a variation.
	if ( isset( $atts['sku'] ) && $single_product->have_posts() && 'product_variation' === $single_product->post->post_type ) {

		$variation  = wc_get_product_object( 'variation', $single_product->post->ID );
		$attributes = $variation->get_attributes();

		// Set preselected id to be used by JS to provide context.
		$preselected_id = $single_product->post->ID;

		// Get the parent product object.
		$args = array(
			'posts_per_page'      => 1,
			'post_type'           => 'product',
			'post_status'         => 'publish',
			'ignore_sticky_posts' => 1,
			'no_found_rows'       => 1,
			'p'                   => $single_product->post->post_parent,
		);

		$single_product = new WP_Query( $args );
		?>
		<script type="text/javascript">
			jQuery( function( $ ) {
				var $variations_form = $( '[data-product-page-preselected-id="<?php echo esc_attr( $preselected_id ); ?>"]' ).find( 'form.variations_form' );

				<?php foreach ( $attributes as $attr => $value ) { ?>
					$variations_form.find( 'select[name="<?php echo esc_attr( $attr ); ?>"]' ).val( '<?php echo esc_js( $value ); ?>' );
				<?php } ?>
			});
		</script>
		<?php
	}

	// For "is_single" to always make load comments_template() for reviews.
	$single_product->is_single = true;

	ob_start();

	global $wp_query;

	// Backup query object so following loops think this is a product page.
	$previous_wp_query = $wp_query;
	// @codingStandardsIgnoreStart
	$wp_query          = $single_product;
	// @codingStandardsIgnoreEnd

	wp_enqueue_script( 'wc-single-product' );

	while ( $single_product->have_posts() ) {
		$single_product->the_post()
		?>
		<div class="single-product" data-product-page-preselected-id="<?php echo esc_attr( $preselected_id ); ?>">
			<?php wc_get_template_part( 'content', 'single-product' ); ?>
		</div>
		<?php
	}

	// Restore $previous_wp_query and reset post data.
	// @codingStandardsIgnoreStart
	$wp_query = $previous_wp_query;
	// @codingStandardsIgnoreEnd
	wp_reset_postdata();

	// Re-enable titles if they were removed.
	if ( isset( $atts['show_title'] ) && ! $atts['show_title'] ) {
		add_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_title', 5 );
	}

	remove_filter( 'woocommerce_add_to_cart_form_action', '__return_empty_string' );

	return '<div class="woocommerce">' . ob_get_clean() . '</div>';
}