Получить количество активного выбранного варианта продукта в WooCommerce
Я строю интернет-магазин (с Woocommerce), в котором будут отображаться отдельные и переменные товары. Когда на странице с одним продуктом мне нужны выходные данные / текст, это зависит от того, какой продукт на странице одного продукта есть в наличии или нет. Я строю это условие в PHP.
Для отдельных продуктов это тривиально:
$qty = $product->get_stock_quantity();
if ( ( ... ) and ( $qty > 0 ) ) {
...
}
Я подключаюсь 'woocommerce_before_add_to_cart_button'
,
Однако для переменных продуктов я просто не знаю, как заставить это работать. В этом случае мне нужно получить выбранное / активное количество вариантов, и это должно справиться с возможностью изменения клиентом варианта на странице.
Этот вопрос был поднят до НО в основном для всех вариантов, а не для текущего / активного.
Я был бы признателен, если бы кто-то мог пролить свет.
1 ответ
Единственный способ получить выбранное количество запаса варианта - использовать jQuery/Javascript, поскольку это в основном живое событие на стороне клиента (не на стороне сервера).
Ваш вопрос не совсем понятен, связанный с тем, что вы хотите сделать, так что вот функция пользовательской функции подключена woocommerce_before_add_to_cart_button
Хук действия, предназначенный только для переменных продуктов.
В этой функции я передаю некоторые данные из php в javascript, например:
- Настраиваемое сообщение, которое будет отображаться для вариантов, которых нет в наличии (это может быть также для "В наличии")
- Все активные вариации количества на складе.
Код jQuery обнаруживает:
- Какой вариант выбран (идентификатор варианта),
- Статус запаса активного выбранного варианта
Оттуда этот код может:
- Получить количество на складе для выбранного варианта (я не знаю, что вы хотите с ним делать)
- Отображать пользовательское сообщение, когда выбранного варианта нет в наличии.
В коде jQuery есть функция, которая возвращает количество запаса для выбранного варианта.
Вот этот пример кода:
add_action( 'woocommerce_before_add_to_cart_button', 'get_selected_variation_stock', 11, 0 );
function get_selected_variation_stock() {
global $product, $wpdb;
// HERE set your custom message
$message_outofstock = __('My custom "out of stock" message');
// Get the visible product variations stock quantity
$variations_data = array();
$child_ids = $product->get_visible_children();
$child_ids = implode( ',',$child_ids );
$results = $wpdb->get_results( "
SELECT p.ID, pm.meta_value as stock_qty
FROM {$wpdb->prefix}posts as p
INNER JOIN {$wpdb->prefix}postmeta as pm ON p.ID = pm.post_id
WHERE p.post_type LIKE 'product_variation'
AND p.ID IN ($child_ids) AND pm.meta_key LIKE '_stock'
" );
foreach( $results as $result ){
// Set in an indexed array for each variation ID the corresponding stock qty
$variations_data[$result->ID] = $result->stock_qty;
}
?>
<script>
jQuery(document).ready(function($) {
var vData = <?php echo json_encode($variations_data); ?>,
stock = '.woocommerce-variation-availability > .stock';
// Function that get the selected variation stock quantity and returns it
function getTheStockQty( a=vData ){
$.each( a, function( index, value ){
if( index == $('input.variation_id').val() )
return value;
});
}
// Once loaded (if a variation is selected by default)
setTimeout(function(){
var stockQty = getTheStockQty();
if( 0 < $('input.variation_id').val() && $(stock).hasClass('out-of-stock')){ // OUT OF STOCK
// Output a custom message for "out of stock"
$(stock).text('<?php echo $message_outofstock; ?>');
// Testing output in the browser JS console
console.log('(1)'+$(stock).html()+' | Stock qty: '+stockQty);
} else if( 0 < $('input.variation_id').val() ) { // IN STOCK
// Testing output in the browser JS console
console.log('(2)'+$(stock).html()+' | Stock qty: '+stockQty);
}
}, 300);
// On live selected variation
$('select').blur( function(){
var stockQty = getTheStockQty();
if( 0 < $('input.variation_id').val() && $(stock).hasClass('out-of-stock')){ // OUT OF STOCK
// Output a custom message for "out of stock"
$(stock).text('<?php echo $message_outofstock; ?>');
// Testing output in the browser JS console
console.log('(1 live)'+$(stock).html()+' | Stock qty: '+stockQty);
} else if( 0 < $('input.variation_id').val() ) { // IN STOCK
// Testing output in the browser JS console
console.log('(2 live)'+$(stock).html()+' | Stock qty: '+stockQty);
}
});
});
</script>
<?php
}
Этот код находится в файле function.php вашей активной дочерней темы (или темы), а также в любом файле плагина.
Проверено и работает
С помощью этого кода вы получаете весь необходимый базовый код для настройки вещей так, как вы хотите.