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

时间:2020-03-28 17:30:38

标签: php wordpress woocommerce hook-woocommerce

我们想阻止商店经理更改订单状态,我们在Restrict user role to change only some order statuses in Woocommerce下面的链接中找到了帮助

但是这里的问题是将某些角色(商店经理)限制为某些订单状态,我们需要拒绝商店经理完全更改订单状态,而不是将其限制为某些订单状态。

我们提到的代码段也从批量操作下拉列表中删除了订单状态以及此处的订单详细信息:https://prnt.sc/mpfl3b,我们也需要从此处https://snipboard.io/B6SYHb.jpg的快速操作列中删除状态/ p>

当我们尝试从批量,订单详细信息页面或操作列中更改订单状态时,我们试图让商店经理来查找没有订单状态来选择更改或完全禁用它。

最好的问候

2 个答案:

答案 0 :(得分:4)

如您在示例代码中看到的那样,状态条件是在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 );

答案 1 :(得分:1)

//由于建议的答案显然会引起一些新问题,而在其他两种情况下却无法解决原始问题,因此可以根据用户类型选择隐藏元素的选项,如下所示-这有点kludge,但可能会起作用:

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

/**
 * 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也可以(甚至更多),那对CSS也是可行的。可能是您在安装过程中还有其他特性会阻止上面的代码或其最小化的定制版本无法正常工作,但是,即使它比通过功能删除选项要干净的多,这种情况通常也会在紧要关头工作。

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