wordpress 在WooCommerce中获取活跃的所选产品变化的数量

o8x7eapl  于 2022-11-22  发布在  WordPress
关注(0)|答案(1)|浏览(155)

我正在建立一个网上商店(与Woocommerce),将显示单一和可变的产品。当在单一产品页面,我需要一些输出/文本,以取决于所选的产品在单一产品页面是在或缺货。我正在建立这个条件在PHP中。
对于单一产品,这是微不足道的:

$qty = $product->get_stock_quantity();
if ( ( ... ) and ( $qty > 0 ) ) {
    ...
}

我正在连接'woocommerce_before_add_to_cart_button'
然而,对于变量产品,我不知道如何使它工作。在这种情况下,我需要得到选择的/活动的变化量,这必须科普客户端更改页面中的变化的可能性。
这个问题以前已经提出过,但主要是针对所有变体,而不是当前/活跃的变体。
如果有人能给我点启示我会很感激的。

tvokkenx

tvokkenx1#

获得所选变异库存数量的唯一方法是使用jQuery/Javascript,因为它主要是客户端(而不是服务器端)的实时事件。
你的问题与你想做什么的关系并不清楚,所以这里有一个自定义函数function,它挂接在woocommerce_before_add_to_cart_button操作钩子中,只针对可变产品。
在该函数中,我将一些数据从php传递到javascript,如下所示:

  • 显示缺货变化的自定义消息 (也可显示“有货”)
  • 所有活动变化的库存数量。

jQuery代码检测:

  • 选择了哪个变体(变体ID),
  • 激活的所选变异的库存状态

在那里,此代码能够:

  • 获取所选变化的库存数量 (我不知道您要如何处理它)
  • 当所选变体缺货时显示自定义消息。
  • 在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文件中,也可以位于任何插件文件中。*

经过测试并正常工作
通过这些代码,您可以获得所有必要的基本代码,以便按照您的需要进行自定义。

相关问题