【问题标题】:Display product badges based for specific shipping classes in Woocommerce在 Woocommerce 中显示基于特定运输类别的产品徽章
【发布时间】:2019-08-07 16:43:14
【问题描述】:

在 Woocommerce 中,我试图显示一个根据定义的运输类别进行更新的运输徽章。

我遇到的问题是当我有一个变量产品具有不同类别的变体时。我需要根据选择更新徽章。

例如,当可变产品具有单件和纸箱选项并且单件具有 10 类并且纸盒具有 bulk1 类时,我需要在从选项中选择纸盒时更新徽章。

我不确定如何获得变体运输类别而不是单一产品运输类别。

这是我已经走了多远:

 function rod_shipping_banner() {

        if( $product->is_type( 'simple' ) ){
            $product = wc_get_product();

            $shipping_class = $product->get_shipping_class();

            switch ( $shipping_class ) {
                case '10':
                    echo '<div class="woocommerce-info"><a href="/shipping-policy/"target="_blank"><img src="/wp-content/uploads/2019/03/10-shipping-small.gif" alt="$10 Flat Rate"></a></div>';
                    break;

                case 'bulk1':
                    echo '<div class="woocommerce-info"><a href="/shipping-policy/"target="_blank"><img src="/wp-content/uploads/2019/03/Bulky1.gif"alt="Bulky class 1"></a></div>';
                    break;

                case 'bulk2':
                    echo '<div class="woocommerce-info"><a href="/shipping-policy/"target="_blank"><img src="wp-content/uploads/2019/03/Bulky_2.gif"alt="Bulky class 2"></a></div>';
                    break;
            }
        } elseif( $product->is_type( 'variable' ) ){

            $product = wc_get_product();
            $shipping_class = $product->get_shipping_class();
            switch ( $shipping_class ) {
                case '10':
                    echo '<div class="woocommerce-info"><a href="/shipping-policy/"target="_blank"><img src="/wp-content/uploads/2019/03/10-shipping-small.gif" alt="$10 Flat Rate"></a></div>';
                    break;

                case 'bulk1':
                    echo '<div class="woocommerce-info"><a href="/shipping-policy/"target="_blank"><img src="/wp-content/uploads/2019/03/Bulky1.gif"alt="Bulky class 1"></a></div>';
                    break;

                case 'bulk2':
                    echo '<div class="woocommerce-info"><a href="/shipping-policy/"target="_blank"><img src="wp-content/uploads/2019/03/Bulky_2.gif"alt="Bulky class 2"></a></div>';
                    break;
            }

        }

    }
    add_action( 'woocommerce_single_product_summary_price', 

【问题讨论】:

    标签: php wordpress woocommerce product badge


    【解决方案1】:

    您的代码中存在一些错误和错误:

    • 钩子woocommerce_single_product_summary_price 不存在;
    • 您需要添加global $product; 以获取WC_Product 对象,因为wc_get_product()null
    • 简单产品和可变产品没有区别,获取产品运输等级。
    • 对于徽章,请使用 &lt;span class="onsale"&gt; … &lt;/span&gt; 而不是 Woocommerce 通知使用的 &lt;div class="woocommerce-info"&gt; … &lt;/div&gt;...
    • 您可以将 2 个函数合并为一个,因为它们使用相同的钩子和优先级

    你的问题也不是很容易理解和清楚。

    以下重新访问的代码将为特定定义的运输类别和产品标签以及简单产品而不是可变产品有条件地显示自定义徽章:

    add_action( 'woocommerce_before_single_product_summary', 'additional_single_product_badges', 10 );
    function additional_single_product_badges() {
        global $product;
    
        ##  ----  SHIPPING CLASSES  ----  ##
    
        // Define the related shipping classes data in this multidimensional array
        $shipping_class_badges_data = [
            '10'    => ['2019/03/10-shipping-small.gif' => '$10 Flat Rate'],
            'bulk1' => ['2019/03/Bulky1.gif'            => 'Bulky class 1'],
            'bulk2' => ['2019/03/Bulky2.gif'            => 'Bulky class 2'],
        ];
    
        if( $shipping_class = $product->get_shipping_class() ) {
            foreach( $shipping_class_badges_data as $key => $badge ) {
                if ( $shipping_class == $key ) {
                    foreach( $badge as $img_src => $alt_text ) {
                        $html  = '<a href="'.home_url("/shipping-policy/").'" "target="_blank">';
                        $html .= '<img src="'.home_url("/wp-content/uploads/".$img_src).'" alt="'.$alt_text.'" />';
                        $html .= '</a>';
                    }
                    echo ' <span class="onsale shipping-badge">'.$html.'</span>';
                    break;
                }
            }
        }
    
    
        ##  ----------  TAGS  ----------  ##
    
        // Define the related product tags data in this multidimensional array
        $product_tags_badges_data = [
            'amarock'  => ['2019/03/Asset-4.png' => 'Tag (test)'],
        ];
    
        // Get the product tag(s) set in the current product
        $product_tags_slugs = wp_get_post_terms( $product->get_id(), 'product_tag', ['fields' => 'slugs'] );
    
        if( sizeof($product_tags_slugs) > 0 ) {
            foreach( $product_tags_badges_data as $key => $badge ) {
                if ( in_array($key, $product_tags_slugs) ) {
                    foreach( $badge as $img_src => $alt_text ) {
                        $html = '<img src="'.home_url("/wp-content/uploads/".$img_src).'" alt="'.$alt_text.'" />';;
                    }
                    echo ' <span class="onsale tag-badge">'.$html.'</span>';
                }
            }
        }
    }
    

    代码进入您的活动子主题(或活动主题)的 function.php 文件中。经过测试并且可以工作。


    在这个可变产品屏幕截图上查看它的实际效果:


    与您的 cmets 相关,对于产品变体:

    要使其适用于产品变体
    您可以在父变量 product 中设置默认运输类别

    如果每个产品变体都有不同的运输等级,这将不起作用
    它需要与 javascript 不同且相当复杂的东西,因为产品变体是在客户端选择/更改的(实时事件),因此 PHP 无法单独处理。

    【讨论】:

    • 如果一个变量产品的运输等级为 10 美元,而下一个变量的运输等级为大件 1,运输标签会改变吗?
    • 好吧,不完全是。徽章不是从变体购物类中提取类,只有父类,上面的代码适用于单一产品运输类而不是可变类,这就是我有 if 变量组件的原因。如果变量产品具有不同的类别,我如何使其工作。在您的示例中,这意味着不同尺寸的不同运输等级?
    • 它适用于可变产品 (您在问题中提出的问题),但不适用于产品变体可变产品(由于在客户端选择/更改变体,现场活动,因此还需要 javascript 并且事情变得复杂)......产品变体不是可变产品,它们只是其中的一部分。所以你可以做的是accept这个答案,因为它回答了你的问题(这与可变产品相关,但与产品变体无关)......然后尝试询问“产品变体” 的新问题
    猜你喜欢
    • 1970-01-01
    • 2016-03-08
    • 2022-01-02
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    相关资源
    最近更新 更多