Исключить конкретный вариант продукта из хука фильтра налогового класса в WooCommerce

Я пытаюсь применить определенный налоговый класс по ролям в фильтре wordpress. Этот налоговый класс применяется к вариативным продуктам, а также к обычным отдельным продуктам. Мне просто нужно исключить конкретный вариант продукта или вариант производства по идентификатору. Вот что у меня есть на данный момент:

 function wc_diff_rate_for_user( $tax_class, $product ) {
  $user_id = get_current_user_id();
  $user = get_user_by( 'id', $user_id );
  if ( is_user_logged_in() && ! empty( $user ) && in_array( 'MEMBER', $user->roles ) &&  is_product() && get_the_id() != 1337)   {
    $tax_class = 'Reduced rate';
  }
  return $tax_class;
 }
 add_filter( 'woocommerce_product_get_tax_class', 'wc_diff_rate_for_user', 1, 2 );
 add_filter( 'woocommerce_product_variation_get_tax_class', 'wc_diff_rate_for_user', 1, 2 );

Я думаю, что я не справлюсь со следующей частью: is_product() && get_the_id() != 1337), поскольку налоговый класс «Сниженная ставка» применяется ко всем продуктам, включая тот, который я пытаюсь исключить. Любые предложения будут очень признательны.


person hansfranz    schedule 12.10.2020    source источник


Ответы (1)


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

Вместо этого, как вы можете видеть в своем коде, подключенная функция имеет 2 доступных аргумента, поэтому вы можете использовать переменную $product, чтобы получить от нее идентификатор, используя метод get_id() следующим образом:

add_filter( 'woocommerce_product_get_tax_class', 'change_tax_class_user_role', 10, 2 );
add_filter( 'woocommerce_product_variation_get_tax_class', 'change_tax_class_user_role', 10, 2 );
function change_tax_class_user_role( $tax_class, $product ) {
    $excluded_variation_id = 1337;
    $targeted_user_role    = 'MEMBER';

    if ( $product->is_type('variation') && $product->get_id() == $excluded_variation_id ) {
        return $tax_class;
    } 
    elseif ( current_user_can( $targeted_user_role ) ) {
        return 'Reduced rate';
    }
    return $tax_class;
}

Код находится в файле functions.php вашей активной дочерней темы (или активной темы). Должно сработать.

person LoicTheAztec    schedule 12.10.2020
comment
Спасибо @LoicTheAztec, но я боюсь, что это не работает должным образом. Сниженная ставка применяется только в том случае, если я оставлю часть `&& is_product () && $ product-› get_id ()! = $ Excluded_variation_id`. Все выбранные товары должны иметь пониженную цену, только товар с идентификатором 1337 должен иметь стандартную цену. Налог на роль участника составляет 7% для всего, кроме продукта, на который я пытаюсь настроить таргетинг с идентификатором варианта 1337, который имеет налог в размере 16%. Мне нужно исправить это с помощью другого фильтра? Возможно ли это даже из-за противоречивых правил, касающихся роли пользователя и налога на продукт? - person hansfranz; 13.10.2020
comment
Большое спасибо, это помогает, и я многому научился в процессе. Хорошего дня и еще раз спасибо. - person hansfranz; 13.10.2020