Php 获取并显示电子商务中选定的变体SKU

Php 获取并显示电子商务中选定的变体SKU,php,jquery,wordpress,woocommerce,shortcode,Php,Jquery,Wordpress,Woocommerce,Shortcode,我的代码适用于简单的产品类型,但不适用于WooCommerce中的可变产品: add_shortcode( 'product_sku_div', 'wc_product_sku_div'); function wc_product_sku_div() { global $product; return sprintf( '<div class="widget" sp-sku="%s"></div>', $product->get_sku() )

我的代码适用于简单的产品类型,但不适用于WooCommerce中的可变产品:

add_shortcode( 'product_sku_div', 'wc_product_sku_div'); 
function wc_product_sku_div() { 
    global $product;

    return sprintf( '<div class="widget" sp-sku="%s"></div>', $product->get_sku() );
}
add_shortcode('product_sku_div'、'wc_product_sku_div');
函数wc_product_sku_div(){
全球$产品;
返回sprintf(“”,$product->get_sku());
}

如何使其同时适用于简单产品和可变产品?

您需要可变ID来获取可变产品的SKU

如果在下面的函数中传递变体ID,则可以获取其SKU

$product = new WC_Product_Variation($variation_id);
$product->get_sku();
下面的代码可用于获取产品的变体。然后对结果进行lopp以获得变体ID,然后在上述代码中使用该变体ID以获得结果

$variations = $product->get_available_variations();

您需要使用
get_available_variations()

add_shortcode('product_sku_div'、'wc_product_sku_div');
函数wc_product_sku_div(){
全球$产品;
$variations\u array=$product->get\u available\u variations();
对于($i=0;$i
参考:

  • 获取可用的变体()

要使其也适用于可变产品及其变体,需要Javascript(jQuery)为可变产品获取所选的变体SKU

尝试以下适用于简单可变产品类型的方法,显示可变产品的选定可变SKU:

add_shortcode( 'product_sku_div', 'wc_product_sku_div');
function wc_product_sku_div() {
    global $product;

    if( ! is_a('WC_Product', $product) ) {
        $product = wc_get_product( get_the_id() );
    }

    ## 1 - For variable products (and their variations)
    if( $product->is_type('variable') ) {
        ob_start(); // Starting buffering

        ?>
        <div class="widget" sp-sku=""></div>
        <script type="text/javascript">
        jQuery( function($){
            $('form.variations_form').on('show_variation', function( event, data ){
                $( 'div.widget' ).attr( 'sp-sku', data.sku );
                // For testing
                console.log( 'Variation Id: ' + data.variation_id + ' | Sku: ' + data.sku );
            });
            $('form.variations_form').on('hide_variation', function(){
                $( 'div.widget' ).attr( 'sp-sku', '' );
            });
        });
        </script><?php

        return ob_get_clean(); // return the buffered content
    }
    ## 2 - For other products types
    else {
        return sprintf( '<div class="widget" sp-sku="%s"></div>', $product->get_sku() );
    }
}
add_shortcode('product_sku_div'、'wc_product_sku_div');
功能wc_产品sku div(){
全球$产品;
如果(!is_a('WC_Product',$Product)){
$product=wc_get_product(get_the_id());
}
##1-对于可变产品(及其变体)
如果($product->is_类型('variable')){
ob_start();//开始缓冲
?>
jQuery(函数($){
$('form.variations\u form')。打开('show\u variations',函数(事件,数据){
$('div.widget').attr('sp sku',data.sku);
//用于测试
console.log('Variation Id:'+data.Variation_Id+'| Sku:'+data.Sku);
});
$('form.variations\u form')。在('hide\u variations',function()上{
$('div.widget').attr('sp sku','');
});
});

您好,我认为这会起作用,但当选择一个新变量时,div不会刷新。当选择另一个变量时,是否有方法刷新div?当选择一个新变量时,是否有方法刷新div?是的,您可以使用Ajax刷新div,或者您可以基于所选变量使用jQuery更改div的值选项。如果我上面的代码解决了您的问题,那么请接受它作为答案。谢谢,这是可行的,但由于我使用的脚本添加了其他类,所以失败了。“sp已启用”和“sp已禁用”一旦它锁定了这些类,SKU就会改变,但由于类没有改变,按钮就不会改变。有没有办法刷新脚本可能添加的所有类?@neptune我的答案是回答您的初始问题(以及您提供的代码和解释)。使用javascript是使其工作的唯一方法,因为它涉及客户端的实时事件。现在,当您使用其他正在制造麻烦的东西时,您应该提出一个新问题,提供所有必要的代码,以重现该问题。否则,任何人都无法提供帮助。
add_shortcode( 'product_sku_div', 'wc_product_sku_div');
function wc_product_sku_div() {
    global $product;

    if( ! is_a('WC_Product', $product) ) {
        $product = wc_get_product( get_the_id() );
    }

    ## 1 - For variable products (and their variations)
    if( $product->is_type('variable') ) {
        ob_start(); // Starting buffering

        ?>
        <div class="widget" sp-sku=""></div>
        <script type="text/javascript">
        jQuery( function($){
            $('form.variations_form').on('show_variation', function( event, data ){
                $( 'div.widget' ).attr( 'sp-sku', data.sku );
                // For testing
                console.log( 'Variation Id: ' + data.variation_id + ' | Sku: ' + data.sku );
            });
            $('form.variations_form').on('hide_variation', function(){
                $( 'div.widget' ).attr( 'sp-sku', '' );
            });
        });
        </script><?php

        return ob_get_clean(); // return the buffered content
    }
    ## 2 - For other products types
    else {
        return sprintf( '<div class="widget" sp-sku="%s"></div>', $product->get_sku() );
    }
}