繁体   English   中英

防止用户角色更改 woocommerce 订单状态

[英]Prevent User Role from changing woocommerce order status

我们想阻止商店经理更改订单状态,我们在下面的链接中找到了帮助限制用户角色仅更改 Woocommerce 中的某些订单状态

但是这里的问题是它把某个角色(店长)限制在了一些订单状态,我们需要完全拒绝店长改变订单状态,而不是把它限制在一些订单状态。

另外,片断,我们提到从批量操作删除的订单状态下拉与此订单的详细信息: https://prnt.sc/mpfl3b ,我们需要从这里快速行动柱太删除状态https://开头snipboard .io/B6SYHb.jpg

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

此致

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

ps; 如果您将我的答案标记为解决方案,那么如果您还没有这样做,那么也投票给@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。 可能是您的安装中有其他特性会阻止上述代码或它的最小定制变体工作,但是,即使它比通过函数删除选项更不干净,这种事情通常会在紧要关头工作。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM