Получить количество активного выбранного варианта продукта в 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 вашей активной дочерней темы (или темы), а также в любом файле плагина.

Проверено и работает

С помощью этого кода вы получаете весь необходимый базовый код для настройки вещей так, как вы хотите.

Другие вопросы по тегам