Restrict admin orders for specific user roles and order statuses in WooCommerce

Restrict admin orders for specific user roles and order statuses in WooCommerce on child sites.

Snippet Type

Execute on Child Sites

Snippet

// Custom conditional fuction to target specific user roles
function user_roles_allowed_orders() {
    $targeted_roles = array('shop_manager'); // Here define your targeted user roles
    return (bool) array_intersect( wp_get_current_user()->roles, $targeted_roles );
}

// Admin orders list: bulk order status change dropdown
add_filter( 'bulk_actions-edit-shop_order', 'filter_dropdown_bulk_actions_shop_order', 100 );
function filter_dropdown_bulk_actions_shop_order( $actions ) {
    if ( user_roles_allowed_orders() ) {
        $allowed_actions = array('mark_on-hold', 'mark_processing');

        foreach( $actions as $key => $option ){
            if( ! in_array( $key, $allowed_actions ) ){
                unset($actions[$key]);
            }
        }
    }
    return $actions;
}

// Admin order pages: Order status change dropdown
add_filter('wc_order_statuses', 'filter_order_statuses', 100 );
function filter_order_statuses( $statuses ) {
    global $pagenow, $typenow;

    if( in_array( $pagenow, array('post.php', 'post-new.php') )
    && 'shop_order' === $typenow && user_roles_allowed_orders() ) {
        $allowed_statusses = array('wc-on-hold', 'wc-processing');

        foreach ($statuses as $key => $option ) {
            if( ! in_array( $key, $allowed_statusses ) ){
                unset($statuses[$key]);
            }
        }
    }
    return $statuses;
}

// Filter admin orders for shop managers based
add_action( 'pre_get_posts', 'filter_shop_manager_orders', 100 );
function filter_shop_manager_orders( $query ) {
    global $pagenow, $post_type;
    //'shop_manager'
    if( $query->is_admin && 'edit.php' === $pagenow && 'shop_order' === $post_type
    && user_roles_allowed_orders() ){
        $allowed_statusses = array('wc-on-hold', 'wc-processing');

        $query->set( 'post_status', $allowed_statusses );
    }
}
1 Like