将特定国家/地区的订单分配给特定的商店经理(Woocommerce)



我只想向ID为136的某个商店经理显示来自德国和奥地利(DE/AT(的批发商客户订单。我在这里找到了一些代码。我发现并制作了以下内容,但它不起作用?

function before_checkout_create_order($order, $data) {
$country = $order->billing_country;
$store_manager_id = '136';
$german_region = ['DE', 'AT'];
if (in_array($country, $german_region)) {
$store_manager_id = 136;
}
$order->update_meta_data('_store_manager_id', $store_manager_id);
}
add_action('woocommerce_checkout_create_order', 'before_checkout_create_order', 20, 2);

更新:不带自定义post_meta的简化解决方案(也适用于以前创建的订单(。

您可以直接使用pre_get_posts操作来根据订单计费国家/地区代码更改meta_query。如果您想使用此解决方案,可以安全地删除before_checkout_create_order函数,因为它不再需要。

function store_manager_orders_query( $query ) {
global $pagenow, $typenow;
$store_manager_id = 136;
$store_manager_countries = array('DE', 'AT');
if( !$query->is_main_query() ) {
return;
}
if( get_current_user_id() === $store_manager_id && $query->is_admin && 'edit.php' === $pagenow && 'shop_order' === $typenow ){
// Get and alter meta query
$meta_query = (array)$query->get('meta_query');
$meta_query[] = array(
'key'     => '_billing_country',
'value'   => $store_manager_countries,
'compare' => 'IN',
);
// Set altered meta query
$query->set('meta_query',$meta_query);
}
}
add_action( 'pre_get_posts', 'store_manager_orders_query', 20 );

旧解决方案:(使用原始问题中多余的自定义订单元(

您的代码基本上将_store_manager_id元添加到每个创建的订单中,因为您的if条件什么都不做(它只将店长ID重新分配给与之前指定的值相同的值(,然后您更新每个订单的订单元,而不需要任何条件逻辑。您应该在if条件内运行update_meta_data函数:

function before_checkout_create_order( $order, $data ) {

$country = $order->billing_country;
$german_region = ['DE', 'AT'];
if( in_array( $country, $german_region ) ) {
$store_manager_id = 136;
$order->update_meta_data('_store_manager_id', $store_manager_id);
}
}
add_action( 'woocommerce_checkout_create_order', 'before_checkout_create_order', 20, 2 );

现在,只有所需的(DE,AT(订单的_store_manager_id元设置为136。现在,您需要限制该商店经理的查询订单:

function store_manager_orders_query( $query ) {
global $pagenow, $typenow;
$store_manager_id = 136;
if( !$query->is_main_query() ) {
return;
}
if( get_current_user_id() === $store_manager_id && $query->is_admin && 'edit.php' === $pagenow && 'shop_order' === $typenow ){
// Get and alter meta query
$meta_query = (array)$query->get('meta_query');
$meta_query[] = array(
'key'     => '_store_manager_id',
'value'   => $store_manager_id,
'compare' => '=',
);
// Set altered meta query
$query->set('meta_query',$meta_query);
}
}
add_action( 'pre_get_posts', 'store_manager_orders_query', 20 );

测试并工作。代码的两个部分都位于活动主题或子主题的functions.php中。

请注意您当前的代码可能会将此元值分配给每个创建的订单(不仅仅是德国订单(,因此可能存在_store_manager_id元设置为136的非德国订单。您应该清理这些数据库记录,更改meta_key,或者忽略过去的订单。

提示:如果未来特定商店经理的位置会受到更多限制(例如,启用/禁用用户级别的限制,然后使用与get_current_user_id()值相同的_store_manager_id元自动显示订单(,您可以使此代码更加通用。适合您的情况。

相关内容

最新更新