【发布时间】:2018-02-03 09:17:20
【问题描述】:
我们有一家服务 woocommerce 在线商店,拥有三位商店经理。
我们希望过滤新订单并将其分配给这三位经理之一。经理只能查看分配给他们的订单,而不能访问或查看其他订单。
也许这可以通过custom_field过滤后端视图(管理面板)来完成,但我不知道这是否是一个好方法。也许有一个基于角色能力的插件。
有什么建议吗?
谢谢。
【问题讨论】:
标签: filter woocommerce admin orders
我们有一家服务 woocommerce 在线商店,拥有三位商店经理。
我们希望过滤新订单并将其分配给这三位经理之一。经理只能查看分配给他们的订单,而不能访问或查看其他订单。
也许这可以通过custom_field过滤后端视图(管理面板)来完成,但我不知道这是否是一个好方法。也许有一个基于角色能力的插件。
有什么建议吗?
谢谢。
【问题讨论】:
标签: filter woocommerce admin orders
在遇到同样的问题后,我结合了类似的、已经回答的问题的解决方案并且它有效。我知道这个问题很老,但有人可能会觉得它有帮助。这是一种可能的解决方案:
function before_checkout_create_order($order, $data) {
$country = $order->billing_country;
$store_manager_id = '';
$belgium_region = ['BE', 'NL', 'DE'];
$czech_region = ['CZ', 'AT', 'SI', 'HU'];
$uk_region = ['GB'];
if (in_array($country, $belgium_region)) {
// Manually assigning the _store_manager_id using the user id, yours will differ
$store_manager_id = 7;
} else if (in_array($country, $czech_region)) {
$store_manager_id = 3;
} else if (in_array($country, $uk_region)) {
$store_manager_id = 2;
} else {
$store_manager_id = 1;
}
$order->update_meta_data('_store_manager_id', $store_manager_id);
}
add_action('woocommerce_checkout_create_order', 'before_checkout_create_order', 20, 2);
我找到了为订单分配自定义元键的方法ON THIS THREAD,您可以看到 woocommerce_checkout_create_order 和 $order->update_meta_data() 钩子和方法的作用在那里,它的作者已经很好地解释了
function custom_admin_shop_manager_orders($query) {
global $pagenow;
$qv = &$query->query_vars;
$currentUserRoles = wp_get_current_user()->roles;
$user_id = get_current_user_id();
if (in_array('shop_manager', $currentUserRoles)) {
if ( $pagenow == 'edit.php' &&
isset($qv['post_type']) && $qv['post_type'] == 'shop_order' ) {
// I use the meta key from step 1 as a second parameter here
$query->set('meta_key', '_store_manager_id');
// The value we want to find is the $user_id defined above
$query->set('meta_value', $user_id);
}
}
return $query;
}
add_filter('pre_get_posts', 'custom_admin_shop_manager_orders');
如您所见,我们检查当前用户角色是否为 shop_manager,因此如果您是管理员,则之后的所有逻辑都不会计算在内 - 您将看到所有订单,但如果您是 shop_manager,您将只获得你的命令。 edit.php 是 woocommerce 订单列表页面。
我在THIS THREAD 中找到了第二步,因此您也可以在那里找到更多信息。
希望对您有所帮助!
【讨论】:
此功能使订单仅显示给其自己的作者(商店经理):
function alter_the_edit_screen_query( $wp_query ) {
if ( ( strpos( $_SERVER[ 'REQUEST_URI' ], '/wp-admin/edit.php' ) !== false ) and ( strpos( $_SERVER[ 'REQUEST_URI' ], '/wp-admin/edit.php?post_type=unit' ) === false ) and ( strpos( $_SERVER[ 'REQUEST_URI' ], '/wp-admin/edit.php?post_type=course' ) === false ) ) {
if ( !current_user_can( 'activate_plugins' ) ) {
add_action( 'views_edit-post', 'remove_items_from_edit' );
global $current_user;
$wp_query->set( 'author', $current_user->id );
}
}
}
add_filter('parse_query', 'alter_the_edit_screen_query' );
function remove_items_from_edit( $views ) {
unset($views['all']);
unset($views['publish']);
unset($views['trash']);
unset($views['draft']);
unset($views['pending']);
return $views;
}
此其他功能对非管理员用户(作为商店经理)隐藏“所有订单”选项卡:
function my_custom_admin_head() {
if ( ! current_user_can( 'update_core' ) ) {
echo '<style type="text/css">
ul.subsubsub li.all { display:none!important; }
</style>';
}
}
add_action( 'admin_head', 'my_custom_admin_head' );
【讨论】: