is there a way to show certain order statuses for specific roles? E.g. Admin can see On-Hold, Processing, Completed, Trash, etc. But Shop Manager can only see On-Hold, Processing, and Completed.
So far I’ve tried this code that I found on this thread here but it still showing all statuses for shop managers:
// Admin orders list: bulk order status change dropdown
add_filter( 'bulk_actions-edit-shop_order', 'filter_dropdown_bulk_actions_shop_order', 20, 1 );
function filter_dropdown_bulk_actions_shop_order( $actions ) {
$new_actions = [];
foreach( $actions as $key => $option ){
// Targeting "shop_manager" | order statuses "on-hold" and "processing"
if( current_user_can('shop_manager') && in_array( $key, array('mark_on-hold', 'mark_processing') ) ){
$new_actions[$key] = $option;
}
}
if( sizeof($new_actions) > 0 ) {
return $new_actions;
}
return $actions;
}
// Admin order pages: Order status change dropdown
add_filter('wc_order_statuses', 'filter_order_statuses');
function filter_order_statuses($order_statuses) {
global $pagenow;
if( $pagenow === 'post.php' || $pagenow === 'post-new.php' ) {
$new_order_statuses = array();
foreach ($order_statuses as $key => $option ) {
// Targeting "shop_manager" | order statuses "on-hold" and "processing"
if( current_user_can('shop_manager') && in_array( $key, array('wc-on-hold', 'wc-processing') ) ){
$new_order_statuses[$key] = $option;
}
}
if( sizeof($new_order_statuses) > 0 ) {
return $new_order_statuses;
}
}
return $order_statuses;
}
2
Answers
Are you sure you want to use "current_user_can"? try in_array(‘user_role") to specify as single user role.
I have revisited your code in a better way and added the missing function that filter orders by allowed order statusses for specific user roles in admin orders list:
Code goes in functions.php file of the active child theme (or active theme). Tested and works.