Удалите указанные c вкладки из настроек администратора WooCommerce - PullRequest
1 голос
/ 18 апреля 2020

Я бы хотел, чтобы указанные c пользователи видели только меню WooCommerce -> Настройки -> Доставка. Мне удалось удалить другие вкладки, например, «Продукты», «Платежи» и т. Д. c, но я остановился на следующих 2 вещах, которые я хочу выполнить sh:

  1. Удалите вкладку «ОБЩИЕ» в Настройки WooCommerce.
  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
         }

    }

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

Правильный хук, который нужно использовать: woocommerce_settings_tabs_array.

Сначала вам нужно найти, какие ключи массива необходимо удалить из массива tabs в вашем коде.

Для этого вы сначала будете использовать следующую функцию, которая будет отображать все данные массива в настройках Admin WooCommerce (только для тестирования, подлежит удалению) :

<code>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 '
'; return $ tabs_array; }

Будет отображаться что-то вроде (со всеми необходимыми ключами массива) :

enter image description here

Теперь вы можете получить слагаемые ключей массива, чтобы убрать соответствующие настройки вкладки. Так что теперь вы сможете найти правильный слаг ключа массива для себя. Вкладка настроек стороннего плагина WooCommerce, которую вы будете использовать в приведенном ниже коде функции.

Для нацеливания указать c роль пользователя , вы можете использовать global $ current_user; $ Current_user-> роли; или выделенная функция Wordpress current_user_can()

Таким образом, рабочий код, который удалит определенные c вкладки настроек для роли пользователя, выглядит так:

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;
}

Код идет в функции. php файл вашей активной дочерней темы (или активной темы). Проверено и работает.

0 голосов
/ 18 апреля 2020
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;
}

Попробуйте этот фрагмент кода

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...