【问题标题】:Prevent User Role from changing woocommerce order status防止用户角色更改 woocommerce 订单状态
【发布时间】:2020-03-28 17:30:38
【问题描述】:

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

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

还有我们提到的 sn-p 从批量操作下拉列表中删除订单状态和此处的订单详细信息:https://prnt.sc/mpfl3b,我们还需要从此处的快速操作列中删除状态https://snipboard.io/B6SYHb.jpg

我们只是尝试让商店经理在他尝试从批量、订单详细信息页面或操作列更改订单状态时发现没有订单状态可以选择更改或完全禁用它。

最好的问候

【问题讨论】:

    标签: php wordpress woocommerce hook-woocommerce


    【解决方案1】:

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

    附言;如果您将我的答案标记为解决方案,那么如果您还没有这样做,也请投票给@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 );
    

    【讨论】:

      【解决方案2】:

      //由于建议的答案显然会导致一些新问题并且在其他几种情况下并不能解决原始问题,因此可以选择根据用户类型隐藏元素,如下所示 - 这有点杂乱无章,但可能会服务:

      首先,加载仅适用于车间经理的管理样式表:

      /**
       * 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 隐藏它以不引起任何问题的想法.. 也非常感谢您在这里的帮助 (Y)
      • 等一下 - 哪个答案最适合他们?如果@7uc1f3r 的作品,我可能会更喜欢它!
      • 是的,他修改了代码以充分发挥作用,这就是我选择他的解决方案作为答案的原因,也非常感谢您的帮助,我们非常感谢
      • 看来你在应用 css 规则方面很有经验,你能帮忙吗:stackoverflow.com/questions/60915361/…
      猜你喜欢
      • 2021-01-30
      • 2021-06-02
      • 2017-05-24
      • 2022-11-04
      • 2017-08-14
      • 1970-01-01
      • 1970-01-01
      • 2018-03-04
      • 2019-07-27
      相关资源
      最近更新 更多