Отображать значки продуктов для определенных классов доставки в Woocommerce - PullRequest
2 голосов
/ 17 марта 2019

В 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 Ответ

1 голос
/ 17 марта 2019

В вашем коде есть ошибки и ошибки:

  • Крюк woocommerce_single_product_summary_price не существует;
  • Вам нужно добавить global $product;, чтобы получить WC_Product объект, так как wc_get_product() равен null.
  • Нет разницы между простым и переменным товаром, чтобы получить класс отгрузки товара.
  • Для значков используйте <span class="onsale"> … </span> вместо <div class="woocommerce-info"> … </div>, который используется в уведомлениях Woocommerce ...
  • Вы можете объединить ваши 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 вашей активной дочерней темы (или активной темы). Проверено и работает.


Посмотрите его в действии на этом переменном продукте снимок экрана:

enter image description here


Связано с вашими комментариями , для вариантов продукта:

Чтобы заставить его работать для вариантов продукта :
Вы можете установить класс доставки по умолчанию в родительской переменной product.

Если каждый вариант продукта имеет свой класс доставки, это не будет работать .
Это требует чего-то другого и довольно сложного с javascript, поскольку варианты продукта выбираются / изменяются на стороне клиента (прямое событие) , поэтому PHP не может справиться с этим в одиночку.

...