У меня возникла задача: на отдельной карточке товара необходимо реализовать следующие условия: при отсутствии вариации на складе (остаток 0) отображать кнопку "Сообщить о появлении", а при первичной загрузке страницы, когда вариант товара не выбран, показывать сообщение "Выберите параметры". У нас уже все работает для товаров, не имеющих вариаций, но возникла трудность с тем, как проверить остаток и цену конкретной вариации.
Вот какие подходы я использовал:
<pre><code class="php">if ($product->stock_status == 'instock') {
<button>...
}
if ($product->get_price() > 0) {
...
} else {
<button>...
}
add_filter( 'woocommerce_product_single_add_to_cart_text', 'woocommerce_custom_single_add_to_cart_text', 10, 2 );
function woocommerce_custom_single_add_to_cart_text( $text, $product ) {
return $product->get_price() ? $text : __( 'Выберите параметры', 'woocommerce' );
}</code></pre>
Проблема заключается в том, что если хотя бы одна вариация имеет цену, отличную от нуля, выполняется первая часть условия, а значит, кнопка назначается всем вариациям. Также остаток учитывается только в целом, а не для каждой отдельно взятой вариации. Как можно получить и проверить значения для конкретной вариации? Попытки изменить текст кнопки через JavaScript по классу также не увенчались успехом.
Ваша задача заключается в отображении различных кнопок на карточке товара в зависимости от наличия вариаций, их остатка и цены. Для реализации такого функционала вам необходимо проверить статус каждой вариации отдельно. В WooCommerce вы можете сделать это, используя фильтры и хуки, а также JavaScript для динамического изменения текста кнопки.
### Шаги для реализации:
1. **Обработка вариаций на сервере**:
Используйте хук `woocommerce_variation_options_pricing` для отображения состояния цены и остатка для каждой вариации. Также вам нужно будет использовать хук `woocommerce_single_variation` для вывода нужной кнопки в зависимости от состояния выбранной вариации.
Пример кода:
```php
add_action('woocommerce_single_variation', 'custom_variation_button');
function custom_variation_button() {
global $product;
$available_variations = $product->get_available_variations();
$variations_count = count($available_variations);
if ($variations_count > 0) {
foreach ($available_variations as $variation) {
$variation_id = $variation['variation_id'];
$variation_obj = new WC_Product_Variation($variation_id);
$stock_quantity = $variation_obj->get_stock_quantity();
$price = $variation_obj->get_price();
if ($stock_quantity > 0 && $price > 0) {
echo '<button class="add-to-cart">Добавить в корзину</button>';
} elseif ($stock_quantity == 0) {
echo '<button class="notify-me">Сообщить о появлении</button>';
}
}
} else {
echo '<p>Выберите параметры</p>';
}
}
```
2. **Динамическое обновление кнопки при выборе вариации**:
Используйте JavaScript/jQuery для управления состоянием кнопки при изменении вариации:
```javascript
jQuery(document).ready(function($) {
$('form.variations_form').on('change', '.variations select', function() {
const variation = $('form.variations_form').data('product_variations');
const attributes = $('form.variations_form').find('.variations select');
let selectedVariation = {};
attributes.each(function() {
const attributeName = $(this).attr('name');
const attributeValue = $(this).val();
if (attributeValue) {
selectedVariation[attributeName] = attributeValue;
}
});
const matchedVariation = variation.find(variation =>
Object.keys(selectedVariation).every(key =>
selectedVariation[key] == variation.attributes[key]
)
);
if (matchedVariation) {
const stockQuantity = matchedVariation.max_qty;
const price = matchedVariation.display_price;
if (stockQuantity > 0 && price > 0) {
$('.add-to-cart').show();
$('.notify-me').hide();
} else if (stockQuantity == 0) {
$('.add-to-cart').hide();
$('.notify-me').show();
}
} else {
$('.add-to-cart').hide();
$('.notify-me').hide();
alert('Выберите параметры');
}
});
});
```
### Заключение:
Таким образом, при первичной загрузке карточки товара будет выводиться текст "Выберите параметры", а при выборе вариации состояние кнопки будет изменяться в зависимости от наличия остатка и цены конкретной вариации товара. Убедитесь, что у вас правильно инициализированы jQuery и другие необходимые библиотеки, а также подключены ваш скрипт и стили для корректного отображения.
Как можно вытащить для проверки отдельно значение каждой вариации?
Метод get_available_variations()
Ну и дальше в зависимости от количества товара в вариации выводите кнопку