返回

如何在 WooCommerce 中针对特定用户和产品隐藏“发送到不同地址”选项?

php

WooCommerce:针对特定用户角色和产品隐藏“发送到不同地址”选项

问题陈述

在 WooCommerce 结账页面中,“发送到不同地址”选项允许客户将订单中的商品发送到多个地址。然而,有时需要针对特定用户角色或购物车的特定产品隐藏此选项。

解决方案方法

1. 创建条件函数

function check_hide_shipping_address( $needs_shipping ) {
    // 针对的用户角色
    $targeted_user_roles = ['team', 'team2'];

    // 针对的商品 ID 数组
    $targeted_product_ids = [414, 617];

    // 标志位
    $found = false;

    // 循环购物车中的商品
    foreach ( WC()->cart->get_cart() as $cart_item ) {
        // 如果商品 ID 或变体 ID 在目标数组中
        if ( in_array($cart_item['product_id'], $targeted_product_ids) || in_array($cart_item['variation_id'], $targeted_product_ids) ) {
            $found = true;
            break;
        }
    }

    // 如果找到了目标商品,且用户角色在目标数组中
    if ($found && array_intersect(wp_get_current_user()->roles, $targeted_user_roles)) {
        $needs_shipping = false;
    }

    return $needs_shipping;
}

2. 添加过滤器

add_filter( 'woocommerce_cart_needs_shipping_address', 'check_hide_shipping_address', 10, 1 );

代码示例

// 针对的用户角色
$targeted_user_roles = ['team', 'team2'];

// 针对的商品 ID 数组
$targeted_product_ids = [414, 617];

// 循环购物车中的商品
foreach ( WC()->cart->get_cart() as $cart_item ) {
    // 如果商品 ID 或变体 ID 在目标数组中,且用户角色在目标数组中
    if ( (in_array($cart_item['product_id'], $targeted_product_ids) || in_array($cart_item['variation_id'], $targeted_product_ids)) && array_intersect(wp_get_current_user()->roles, $targeted_user_roles) ) {
        // 隐藏“发送到不同地址”选项
        add_filter( 'woocommerce_cart_needs_shipping_address', function($needs_shipping) {
            return false;
        }, 10, 1 );
        break;
    }
}

常见问题解答

Q1:如何针对多个用户角色隐藏“发送到不同地址”选项?

A1:将用户角色添加到 $targeted_user_roles 数组中。

Q2:如何针对多个商品 ID 隐藏“发送到不同地址”选项?

A2:将商品 ID 添加到 $targeted_product_ids 数组中。

Q3:为什么 array_intersect 函数在这里使用?

A3:它用于检查用户角色和目标角色数组之间的交集,只有当两者都有交集时,才隐藏“发送到不同地址”选项。

Q4:我如何在代码中使用变量?

A4:将变量名称放在 {} 内,例如 {$targeted_user_roles}

Q5:如何调试代码?

A5:可以使用 var_dump() 函数或在函数中设置断点。