阻止用户角色更改wooccommerce订单状态



我们想防止店长更改订单状态,我们在下面的链接中找到了一个帮助:限制用户角色只更改Wooccommerce 中的一些订单状态

但这里的问题是,它将某些角色(店长(限制在某些订单状态,我们需要拒绝店长完全更改订单状态,而不是将其限制在某些订购状态。

此外,我们提到的片段从批量操作下拉列表中删除了订单状态&订单详情如下:https://prnt.sc/mpfl3b,我们也需要从此处的快速操作列中删除状态https://snipboard.io/B6SYHb.jpg

简单地说,当商店经理试图从批量、订单详细信息页面或操作列更改订单状态时,我们会尝试让他选择,以发现没有订单状态可以选择更改或完全禁用它。

致以最诚挚的问候

正如您在示例代码中看到的那样,状态的条件是在if语句中确定的,因为您想无限制地应用它,只需要删除if语句并返回空数组

p.s;如果你把我的答案标记为解决方案,那么如果你还没有这样做,也可以投票给@LoicTheAztec的原始答案,因为他的代码几乎包含了解决方案。

// Admin orders list: bulk order status change dropdown
function filter_dropdown_bulk_actions_shop_order( $actions ) {
// Targeting shop_manager
if( current_user_can( 'shop_manager' ) ) {
$actions = (array) null;
}
return $actions;
}
add_filter( 'bulk_actions-edit-shop_order', 'filter_dropdown_bulk_actions_shop_order', 20, 1 );
// Admin orders list: quick action
function filter_order_actions( $actions, $order ) {
// Targeting shop_manager
if( current_user_can( 'shop_manager' ) ) {
$actions = (array) null;
}
return $actions;
}
add_filter( 'woocommerce_admin_order_actions', 'filter_order_actions', 10, 2 );
// Admin order pages: order status dropdown
function filter_order_statuses( $order_statuses ) { 
global $post, $pagenow;
if( $pagenow === 'post.php' || $pagenow === 'post-new.php' ) {
// Get ID
$order_id = $post->ID;
// Get an instance of the WC_Order object
$order = wc_get_order( $order_id );
// TRUE
if ( $order ) { 
// Get current order status
$order_status = 'wc-' . $order->get_status();
// New order status
$new_order_statuses = array();
foreach ($order_statuses as $key => $option ) {
// Targeting "shop_manager"
if( current_user_can('shop_manager') && $key == $order_status ) {
$new_order_statuses[$key] = $option;
}
}
if( sizeof($new_order_statuses) > 0 ) {
return $new_order_statuses;
}
}
}
return $order_statuses;
}
add_filter('wc_order_statuses', 'filter_order_statuses', 10, 1 );

//由于建议的答案显然会导致一些新问题,并且在其他几种情况下无法解决原始问题,因此可以根据用户类型隐藏元素,如下所示-这有点草率,但可能有用:

首先,加载仅适用于商店经理的管理样式表:

/**
* SHOP MANAGER STYLES 
* Front (Optional) and Back End stylesheet 
* Style interface for users logged in with'shop_manager' role
* Add to theme functions.php
*/
add_action('admin_enqueue_scripts', 'shop_manager_styles');
//if front end stylesheet needs to be added to cover admin bar:
//add_action('wp_enqueue_scripts', 'shop_manager_styles' ) ; 
function shop_manager_styles() {  
$user = wp_get_current_user() ;
//uncomment following and remove next if not confined to admin  
//if ( $user && in_array( 'shop_manager', $user->roles )  ) { 
if ( in_array( 'shop_manager', $user->roles ) ) {
//time() as stylesheeet version to help bust caching - may not be necessary but doesn't hurt:
wp_enqueue_style( 
'shop_manager_styles', get_stylesheet_directory_uri() 
. '/css/shop_manager_styles.css', array(), time() 
); 
} 
}

以及完全隐藏订单状态标签和菜单的css,以及shop_order子页面中的相关列:

/** HIDE ORDER STATUS LABEL, SELECTION MENU IN ORDER EDIT
* AND RELATED COLUMNS IN shop_order SUB-PAGE
*/
.wc-order-status, 
.column-order_status,
.column-wc_actions {
display: none;
}

您可以将其保存在新的shop_manager_styles.css.中的主题css文件夹中

现在,你可能需要在商店经理无法编辑的情况下向他们显示订单状态。这在CSS中也是可行的,如果也是(甚至更多(一个拼凑的。这可能是因为你的安装中有其他特性,会阻止上面的代码或其最低限度的自定义变体工作,但是,即使它比通过功能删除选项稍微不干净,这种事情通常也会在紧要关头工作。

(编辑后提供选项在前端添加样式表-以防相关选项出现在管理栏中,否则无需将额外的非管理脚本排入队列。(

最新更新