2

我正在尝试按角色在 wordpress 过滤器中应用特定的税类。此税种适用于变体产品以及常规单一产品。我只需要通过 id 排除特定变体产品或生产变体。这是我到目前为止所拥有的:

 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) 因为“降低税率”的税级适用于所有产品,包括我试图排除的产品。任何建议将不胜感激。

4

1 回答 1

0

您的代码中的主要问题是get_the_id()它不能用于变量产品页面上的产品变体,因为它提供了可变产品 ID,但没有提供任何产品变体 ID...

相反,正如您在代码中看到的那样,挂钩函数有 2 个可用参数,因此您可以使用该变量$product使用以下方法从中获取 Id 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 文件中。它应该有效。

于 2020-10-12T19:29:50.207 回答