Я создаю тему woocommerce, и у меня есть вариации продукта, т. Е. Размер, который отображается на странице сведений о продукте, но проблема в том, что я хочу получить все варианты моей пользовательской php-страницы с помощью идентификатора продукта, может ли кто-нибудь мне помочь.
Заранее спасибо.
Вы можете использовать: $available_variations = $product->get_available_variations();
Если это единственный шаблон стиля, убедитесь, что вы добавили global $product;
рядом с вершиной.
Оттуда вы можете пройти через вариации и сделать то, что вы хотите … так как у вас не было никакого конкретного выхода, я надеюсь, что это приведет вас к правильному пути.
Вы можете использовать следующий код:
global $woocommerce, $product, $post; // test if product is variable if ($product->is_type( 'variable' )) { $available_variations = $product->get_available_variations(); foreach ($available_variations as $key => $value) { //get values HERE } }
Следующий код:
$variations = $product->get_available_variations();
вернет все варианты продукта
Эта функция помещается туда, где вы показываете все варианты:
\wp-content\plugins\woocommerce\templates\single-product\add-to-cart\variable.php
Частая проблема часто начинается с замены ярлыков «В наличии» или «Нет на складе» для одного продукта. Там есть несколько решений, где вам нужно изменить файл functions.php и добавить новый фильтр.
Проблемы усложняются, когда вам нужно изменить это для вариантов продукта.
Это может быть ваше решение: http://bucketpress.com/changing-stock-availability-text-for-product-variations
Чтобы отобразить доступные варианты продукта, вам нужно изменить файл variable.php, который можно найти в / wp-content / plugins / woocommerce / templates / single-product / add-to-cart /
Найдите это:
<form class="variations_form cart" method="post" enctype='multipart/form-data' data-product_id="<?php echo absint( $product->id ); ?>" data-product_variations="<?php echo htmlspecialchars( json_encode( $available_variations ) ) ?>">
и перед тегом вставьте этот код:
foreach( $available_variations as $i => $variation ) { //check if variation has stock or not if ( $variation['is_in_stock'] ) { // Get max qty that user can purchase $max_qty = $variation['max_qty']; // Prepare availability html for stock available instance $availability_html = '<p class="stock in-stock">' . $max_qty . ' units available for your purchase.' . '</p>'; } else { // Prepare availability html for out of stock instance $availability_html = '<p class="stock out-of-stock">Oops, we have no stock left.</p>'; } $available_variations[$i]['availability_html'] = $availability_html; }
Не забудьте переместить тег php end «?>» Из этой строки
do_action( 'woocommerce_before_add_to_cart_form' ); ?>
после вашего нового кода.
Таким образом, полный файл переменной.php должен выглядеть примерно так (WooCommerce 3.2.4):
<?php /** * Variable product add to cart * * This template can be overridden by copying it to yourtheme/woocommerce/single-product/add-to-cart/variable.php. * * HOWEVER, on occasion WooCommerce will need to update template files and you * (the theme developer) will need to copy the new files to your theme to * maintain compatibility. We try to do this as little as possible, but it does * happen. When this occurs the version of the template file will be bumped and * the readme will list any important changes. * * @see https://docs.woocommerce.com/document/template-structure/ * @author WooThemes * @package WooCommerce/Templates * @version 3.0.0 */ if ( ! defined( 'ABSPATH' ) ) { exit; } global $product; $attribute_keys = array_keys( $attributes ); do_action( 'woocommerce_before_add_to_cart_form' ); // Your New Code goes here: foreach( $available_variations as $i => $variation ) { // check if variation has stock or not if ( $variation['is_in_stock'] ) { // Get max qty that user can purchase $max_qty = $variation['max_qty']; // Prepare availability html for stock available instance $availability_html = '<p class="stock in-stock">Available: ' . $max_qty . '</p>'; } else { // Prepare availability html for out of stock instance $availability_html = '<p class="stock out-of-stock">Out of stock!</p>'; } $available_variations[$i]['availability_html'] = $availability_html; } ?> <form class="variations_form cart" method="post" enctype='multipart/form-data' data-product_id="<?php echo absint( $product->get_id() ); ?>" data-product_variations="<?php echo htmlspecialchars( wp_json_encode( $available_variations ) ) ?>"> <?php do_action( 'woocommerce_before_variations_form' ); ?> <?php if ( empty( $available_variations ) && false !== $available_variations ) : ?> <p class="stock out-of-stock"><?php _e( 'This product is currently out of stock and unavailable.', 'woocommerce' ); ?></p> <?php else : ?> <table class="variations" cellspacing="0"> <tbody> <?php foreach ( $attributes as $attribute_name => $options ) : ?> <tr> <td class="label"><label for="<?php echo sanitize_title( $attribute_name ); ?>"><?php echo wc_attribute_label( $attribute_name ); ?></label></td> <td class="value"> <?php $selected = isset( $_REQUEST[ 'attribute_' . sanitize_title( $attribute_name ) ] ) ? wc_clean( stripslashes( urldecode( $_REQUEST[ 'attribute_' . sanitize_title( $attribute_name ) ] ) ) ) : $product->get_variation_default_attribute( $attribute_name ); wc_dropdown_variation_attribute_options( array( 'options' => $options, 'attribute' => $attribute_name, 'product' => $product, 'selected' => $selected ) ); echo end( $attribute_keys ) === $attribute_name ? apply_filters( 'woocommerce_reset_variations_link', '<a class="reset_variations" href="#">' . esc_html__( 'Clear', 'woocommerce' ) . '</a>' ) : ''; ?> </td> </tr> <?php endforeach;?> </tbody> </table> <?php do_action( 'woocommerce_before_add_to_cart_button' ); ?> <div class="single_variation_wrap"> <?php /** * woocommerce_before_single_variation Hook. */ do_action( 'woocommerce_before_single_variation' ); /** * woocommerce_single_variation hook. Used to output the cart button and placeholder for variation data. * @since 2.4.0 * @hooked woocommerce_single_variation - 10 Empty div for variation data. * @hooked woocommerce_single_variation_add_to_cart_button - 20 Qty and cart button. */ do_action( 'woocommerce_single_variation' ); /** * woocommerce_after_single_variation Hook. */ do_action( 'woocommerce_after_single_variation' ); ?> </div> <?php do_action( 'woocommerce_after_add_to_cart_button' ); ?> <?php endif; ?> <?php do_action( 'woocommerce_after_variations_form' ); ?> </form> <?php do_action( 'woocommerce_after_add_to_cart_form' );
Все кредиты "Кевину" от: http://bucketpress.com/author/base-admin
Попробуй это,
<?php $name_size = get_post_meta($_GET['pr_id'],'product_size', true); $t_shirt_sizes_array = wp_get_post_terms($_GET['pr_id'],'pa_size'); $t_shirt_size = array(); $t_shirt_price = array(); for($scnt = 0; $scnt < count($t_shirt_sizes_array); $scnt++){ $t_shirt_size[] = $t_shirt_sizes_array[$scnt]->name; $t_shirt_price[] = $t_shirt_sizes_array[$scnt]->slug; $t_shirt_size_id[] = $t_shirt_sizes_array[$scnt]->term_id; } $cnt = 1; for($i = 0; $i < count($t_shirt_size); $i++){ $name_size = $t_shirt_size[$i]; $result = $wpdb->get_col( "SELECT slug FROM {$wpdb->prefix}terms WHERE name = '".$t_shirt_size[$i]."'" ); $term_slug = ( !empty( $result ) ) ? $result[0] : $term; $query = "SELECT postmeta.post_id AS product_id FROM {$wpdb->prefix}postmeta AS postmeta LEFT JOIN {$wpdb->prefix}posts AS products ON ( products.ID = postmeta.post_id ) WHERE postmeta.meta_key LIKE 'attribute_%' AND postmeta.meta_value = '$term_slug' AND products.post_parent = ".$_GET['pr_id']; $variation_id = $wpdb->get_col( $query ); $parent = wp_get_post_parent_id( $variation_id[0] ); if ( $parent > 0 ) { echo $name_size; $_product = new WC_Product_Variation( $variation_id[0] ); echo $_product->get_price(); } $price = $t_shirt_price[$i]; $cnt++; } ?>