显示基于Woocommerce中特定运输类别的产品徽章

时间:2019-03-16 22:56:02

标签: php wordpress woocommerce product badge

在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', 

1 个答案:

答案 0 :(得分:1)

您的代码中有一些错误和错误:

  • 钩子woocommerce_single_product_summary_price不存在;
  • 您需要添加global $product;才能获得WC_Product对象,因为wc_get_product()null
  • 简单产品和可变产品之间没有区别,以获取产品运输类别。
  • 对于徽章,请使用<span class="onsale"> … </span>代替Woocommerce通知中使用的<div class="woocommerce-info"> … </div>
  • 您可以将两个函数合并为一个,因为它们使用相同的钩子和优先级

您的问题也不是真正可以理解和清楚的。

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

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文件中。经过测试,可以正常工作。


查看此可变产品屏幕截图的操作:

enter image description here


与您的评论有关,以了解产品变化:

  

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

     

如果每种产品型号具有不同的运输类别,则将无法使用
  它需要使用JavaScript进行一些不同且相当复杂的操作,因为在客户端(实时事件)中选择/更改了产品变体,因此PHP无法单独处理。