【问题标题】:Remove specific tabs in from WooCommerce admin settings从 WooCommerce 管理员设置中删除特定选项卡
【发布时间】:2020-07-31 12:43:45
【问题描述】:

我希望特定用户只看到 WooCommerce -> 设置 -> 运输菜单。我设法删除了其他标签,例如产品、付款等,但坚持以下两件我想要完成的事情:

  1. 删除 WooCommerce 设置中的“常规”选项卡。
  2. 从插件中删除“订单状态”选项卡。 (注意:这不是一个标签,蛞蝓是 'edit.php?post_type=wc_order_status')

当我尝试删除常规选项卡时,它会删除整个设置菜单。至于“订单状态”,我的代码不起作用。

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
         }

    }

【问题讨论】:

  • 抱歉耽搁了。所以它并没有一直起作用,并且不确定是否将其标记为整个问题的答案。现在回应所有的 cmets。

标签: php wordpress woocommerce settings hook-woocommerce


【解决方案1】:

要使用的正确钩子是woocommerce_settings_tabs_array

首先,您需要找到需要从代码中的 tabs 数组中删除的 数组键

为此,您将首先使用以下函数,该函数将在 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;
}

它将显示类似 (带有所有必需的数组键)

现在您可以获得所需的数组键 slug,以删除相应的选项卡设置。所以现在您将能够为您找到正确的数组键 第三方插件 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;
}

代码在您的活动子主题(或活动主题)的functions.php 文件中。经过测试并且可以工作。

【讨论】:

  • 这适用于删除标准 WC 标签。但是,即使在我使用了建议的 JS 之后,我也无法删除插件附带的选项卡。
  • @Les 在return $tabs_array; 之前尝试包含echo '&lt;div&gt;&lt;pre&gt;'; print_r( $tabs_array ); echo '&lt;/pre&gt;&lt;/div&gt;'; 只是为了获取所有可用的数组键,找出您需要的正确键。获得后将其删除并在代码中进行必要的更改。
  • 它只打印标准 WC 选项卡的名称,但不打印自定义插件中的选项卡。我认为它不被视为严格意义上的标签。当我悬停或单击标准 WC 选项卡时,我会看到 URL 显示为 wp-admin/admin.php?page=wc-settings(在设置选项卡的示例中)。但是,在自定义插件选项卡上,它显示为 wp-admin/edit.php?post_type=wc_order_status
  • @Les 您应该尝试进入插件源代码以了解它们如何在 WooCommerce 设置中显示自定义选项卡...
  • 让它工作,但自定义选项卡必须用 jQuery 隐藏,如下面的答案所示。谢谢。
【解决方案2】:
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;
}

试试这个代码sn-p

【讨论】:

  • 这不起作用,和我的效果一样。当我删除“常规”选项卡时,整个设置菜单。 wc_order_status 并不是真正的标签,如一般标签,它指向:admin.php?page=wc-settings&tab=general。相反,网址显示为:wp-admin/edit.php?post_type=wc_order_status
  • @Les 如果你注释掉这一行 - unset( $array[ 'wc_order_status' ] ); - 它会工作。我认为这是您添加的自定义选项卡。此代码已通过 WP 5.4 和 WC 4.0.1 测试正常
  • 还是没有运气。可能与用户角色有关吗?订单状态设置是第 3 方插件,访问方式如下:'edit.php?post_type=wc_order_status'。例如,与以 'admin.php?page=wc-settings&tab=shipping' 访问的其他选项卡不同。知道如何消除该标签吗?
  • @Les 哪个插件?
  • 插件被称为“WooCommerce 订单状态管理器”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多