Я использую woocommerce для своего веб-сайта, но, поскольку у меня есть только один основной продукт и два аксессуара (сопутствующие товары), мне не нужна ни классическая страница магазина, ни страницы с отдельным продуктом для каждого моего продукта. У моего основного продукта есть изменение цвета.
Мне нужна кнопка добавления в корзину с раскрывающимся списком вариантов цвета и полем количества на одной из моих обычных страниц постов. Точно так же, как на странице с одним продуктом, но встроенный в мою собственную страницу, и без частей страницы с одним продуктом мне не нужны (описание, ...).
Наконец-то я решил добиться этого, используя два пользовательских шорткода, которые я создал: [my_vc_product_price id="xxx"]
и [my_vc_add2cart_variable_product id="xxx"]
. Так что я могу положить их туда, куда хочу.
Но моя проблема в том, что поведение выпадающего меню + наличие вариантов + кнопка добавления в корзину отличается от поведения этих элементов на странице одного продукта:
- наличие варианта не отображается при выборе цвета в раскрывающемся меню;
- кнопка добавления в корзину не отключается, если в раскрывающемся меню не выбран цвет (она должна быть отключена и активна только при выборе цвета).
Показывать цену было легко, используя код, найденный в интернете:
/**
* Add shortcode to allow to display product price in a page
*/
function my_vc_display_product_price( $args ) {
$product_id = $args['id'];
$product = wc_get_product( $product_id );
echo '<p class="price">' . $product->get_price_html() . '</p>';
}
add_shortcode( 'my_vc_product_price', 'my_vc_display_product_price');
Чтобы получить такой же графический результат, мне просто нужно было добавить несколько классов CSS в строку: "woocommerce" и "product".
Код для отображения выпадающего меню + количество и кнопка добавления в корзину почти такие же, как в файле variable.php, который находится в плагинах / woocommerce / templates / single-product / add-to-cart / , Единственное, что действительно меняется, это то, что вам нужно получить «вариационные атрибуты» продукта, а не атрибуты.
$attributes = $product->get_variation_attributes();
$attribute_keys = array_keys( $attributes );
Итак, полный код функции:
/**
* Add shortcode to allow to display an add to cart button with dropdown menu for variation attributes
*/
function my_vc_add_to_cart_button_variable_product( $args ) {
global $product;
$product_id = $args['id'];
$product = wc_get_product( $product_id );
if( $product->is_type( 'variable' )) {
$attributes = $product->get_variation_attributes();
$attribute_keys = array_keys( $attributes );
$available_variations = array( $product->get_available_variations() );
do_action( 'woocommerce_before_add_to_cart_form' ); ?>
<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="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 ) );
?>
</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' );
?>
<script type="text/template" id="tmpl-variation-template">
<div class="woocommerce-variation-description">{{{ data.variation.variation_description }}}</div>
<div class="woocommerce-variation-price">{{{ data.variation.price_html }}}</div>
<div class="woocommerce-variation-availability">{{{ data.variation.availability_html }}}</div>
</script>
<script type="text/template" id="tmpl-unavailable-variation-template">
<p><?php _e( 'Sorry, this product is unavailable. Please choose a different combination.', 'woocommerce' ); ?></p>
</script>
<?php
/**
* 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' );
}
}
add_shortcode( 'my_vc_add2cart_variable_product', 'my_vc_add_to_cart_button_variable_product');
Есть идеи, что не так? Я не понимаю, если код такой же, почему он не выполняется так же. Чего-то не хватает, потому что этот код находится за пределами страниц woocommerce?