Хук фильтра woocommerce_product_get_weight не работает с вариантами продукта

Похоже, что хук woocommerce_product_get_weight, который я использовал для переопределения веса продукта (с целью влияния на расчет доставки), не срабатывает ни для одного из моих вариантов продукта. Однако для простых продуктов это работает.

В приведенном ниже коде вы увидите, что я пишу в журнал, как только вызывается функция. Ничего не пишется, когда продукт является вариацией продукта. Единственный выход — это когда продукт является простым продуктом.

Я также начинаю задаваться вопросом, не является ли это неправильным способом переопределения веса для этой цели. Есть идеи?

Мой код здесь:

function custom_weight($weight, $product)
{
    logvar($weight, "weight before");
    logvar($product, "variant terms - weight");
    if (!is_admin()) {

        $product_id = $product->get_id();
        if (has_term('weight-sheer', 'product_tag', $product_id))
            $weight = 1.5/16;
        elseif (has_term('weight-light', 'product_tag', $product_id))
            $weight = 7.5/16;
        elseif (has_term('weight-medium', 'product_tag', $product_id))
            $weight = 12/16;
        elseif (has_term('weight-heavy', 'product_tag', $product_id))
            $weight = 30/16;
        elseif (has_term('Thread', 'product_cat', $product_id))
            $weight = 0;
        elseif (has_term('Gift Cards', 'product_cat', $product_id))
            $weight = 0;
    }
    logvar($weight, "weight after");

    return $weight;
}

add_filter('woocommerce_product_get_weight', 'custom_weight', 25, 2);

//helper function for easy logging
function logvar($var, $label = null)
{
    if ($label != null) {
        wc_get_logger()->debug($label, array('source' => 'mylog'));
    }
    wc_get_logger()->debug(var_export($var, true), array('source' => 'mylog'));
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
0
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во-первых, woocommerce_product_get_weight — это крючок составного фильтра для метода WC_Productget_weight(), но для вариантов продукта необходимо дополнительно использовать крючок фильтра woocommerce_product_variation_get_weight.

Кроме того, поскольку вариант продукта не обрабатывает категории или теги продуктов WooCommerce, вам необходимо получить идентификатор продукта родительской переменной, чтобы он работал с функцией WordPress has_term(), например:

add_filter( 'woocommerce_product_get_weight', 'filter_product_weight', 10, 2 );
add_filter( 'woocommerce_product_variation_get_weight', 'filter_product_weight', 10, 2 );
function filter_product_weight( $weight, $product ) {
    if ( is_admin() ) {
       return $weight;
    }
    $product_id = $product->is_type('variation') ? $product->get_parent_id() : $product->get_id();
        
    if ( has_term('weight-sheer', 'product_tag', $product_id) ) {
        $weight = 1.5/16;
    } elseif ( has_term('weight-light', 'product_tag', $product_id) ) {
        $weight = 7.5/16;
    } elseif ( has_term('weight-medium', 'product_tag', $product_id) ) {
        $weight = 12/16;
    } elseif ( has_term('weight-heavy', 'product_tag', $product_id) ) {
        $weight = 30/16;
    } 

    if ( has_term(array('Thread', 'Gift Cards'), 'product_cat', $product_id) ) {
        $weight = 0;
    } 
    return $weight;
}

Теперь он будет работать со всеми типами продуктов, включая их разновидности.

Другие вопросы по теме