Похоже, что хук 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'));
}






Во-первых, 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;
}
Теперь он будет работать со всеми типами продуктов, включая их разновидности.