微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将特定用户角色的 WooCommerce 管理员订单限制为特定订单状态

如何解决将特定用户角色的 WooCommerce 管理员订单限制为特定订单状态

有没有办法显示特定角色的特定订单状态?例如。管理员可以看到待处理、处理中、已完成、垃圾箱等。但店长只能看到待处理、处理中和已完成。

看截图:

enter image description here

到目前为止,我已经尝试了在此线程 here 上找到的代码,但它仍然显示商店经理的所有状态:

// 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;
}

解决方法

您确定要使用“current_user_can”吗?尝试 in_array('user_role") 指定为单用户角色。

,

我以更好的方式重新访问了您的代码,并添加了缺失的功能,该功能可通过管理员订单列表中特定用户角色的允许订单状态来过滤订单:

// 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 );
    }
}

代码位于活动子主题(或活动主题)的functions.php 文件中。经测试有效。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。