从WooCommerce管理设置中删除特定的标签。

问题描述 投票:1回答:1

我希望特定的用户只能看到WooCommerce -> Settings -> Shipping菜单。我已经成功地删除了其他标签,如产品,支付等,但卡在以下2件事上,我想完成。

  1. 删除WooCommerce设置中的 "GENERAL "标签。
  2. 删除插件中的 "订单状态 "标签。(注意:这并不是一个标签,弹头是'edit.php?post_type=wc_order_status')

enter image description here

当我尝试删除 "一般 "标签时,它消除了整个 "设置 "菜单。至于 "订单状态",我的代码根本就不起作用。

add_filter( 'woocommerce_settings_tabs_array', 'remove_woocommerce_setting_tabs', 200, 1 );
function remove_woocommerce_setting_tabs( $array ) {

    global $current_user;

    //Declare the tabs we want to hide
    $tabs_to_hide = array(
        'general'         => 'General', //this one removes the entire Settings menu
        'wc_order_status' => 'Order Statuses'// this doesn't work, maybe bc it's a post_type
        );

    // Remove tab if user role is shipping_manager
    if ( in_array("shipping_manager", $$current_user->roles) ) {
        $array = array_diff_key($array, $tabs_to_hide);
    }
}

我也试过用下面的代码来删除 "订单状态 "选项卡,但还是不行。

    add_action( 'admin_menu', 'remove_order_statuses_tab', 999);
    function remove_order_statuses_tab() 
    {
      global $current_user;

      if ( in_array("shipping_manager", $current_user->roles) ) {
            remove_menu_page( 'edit.php?post_type=wc_order_status' ); //not working either
         }

    }
php wordpress woocommerce settings hook-woocommerce
1个回答
1
投票

正确的钩子使用的是 woocommerce_settings_tabs_array.

首先你需要找到哪些是 阵列键 你需要从你的代码中的标签数组中删除。

为此,您将首先使用以下函数,该函数将在Admin WooCommerce设置中显示所有数组数据。(仅用于测试,将被删除):

add_filter( 'woocommerce_settings_tabs_array', 'filter_wc_settings_tabs_array', 990, 1 );
function filter_wc_settings_tabs_array( $tabs_array ) {
    // Display raw array data
    echo '<pre>'; print_r( $tabs_array ); echo '</pre>';

    return $tabs_array;
}

它将显示这样的内容 (含所有必要的数组键):

enter image description here

现在你可以得到你所需要的数组键slugs,来删除相应的标签设置。所以现在 你将能够找到正确的数组键lug。 为您的第三方插件WooCommerce设置标签,您将在下面的功能代码中使用。

要针对特定的用户角色你可以使用全局的$current_user;$current_user->角色;或者Wordpress的专用函数。current_user_can()

因此,工作代码,将删除特定的设置标签的用户角色是。

add_filter( 'woocommerce_settings_tabs_array', 'filter_wc_settings_tabs_array', 200, 1 );
function filter_wc_settings_tabs_array( $tabs_array ) {
    // Only for "shipping_manager" user role
    if( current_user_can( 'shipping_manager' ) ) {
        // Remove some specific tabs
        unset( $tabs_array['general'], $tabs_array['order_status'] ); // <== replace 'order_status' by 
    }

    return $tabs_array;
}

代码在你的活动子主题(或活动主题)的function.php文件中。经过测试和工作。


1
投票
add_filter( 'woocommerce_settings_tabs_array', 'remove_woocommerce_setting_tabs', 200, 1 );

function remove_woocommerce_setting_tabs( $array ) {

        global $current_user;

        // Remove tab if user role is shipping_manager

        if ( in_array( "shipping_manager", $current_user->roles ) ) {
            unset( $array[ 'general' ] );
            ?>
                <script>
            document.querySelector("[href='<?php echo esc_url( admin_url( 'edit.php?post_type=wc_order_status' ) ); ?>']").style.display = 'none';

            </script>
        <?php
    }
    return $array;
}

试试这段代码

© www.soinside.com 2019 - 2024. All rights reserved.