Запретить роли пользователя от изменения статуса заказа woocommerce - PullRequest
1 голос
/ 28 марта 2020

Мы хотели бы запретить менеджеру магазина изменять статус заказа. Справку можно найти по ссылке ниже Ограничить роль пользователя, чтобы изменить только некоторые статусы заказа в Woocommerce

Но проблема здесь, когда он ограничивает определенную роль (менеджера магазина) некоторыми статусами заказов, нам нужно запретить менеджеру магазина полностью изменять статус заказа, а не ограничивать его некоторыми статусами заказов.

Также упомянутый фрагмент снимает удаление статусы заказа из выпадающего списка массовых действий и детали заказа здесь: https://prnt.sc/mpfl3b, нам нужно удалить статусы также из столбца быстрого действия здесь https://snipboard.io/B6SYHb.jpg

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

С наилучшими пожеланиями

Ответы [ 2 ]

3 голосов
/ 28 марта 2020

Как вы можете видеть в примере кода, условия статусов определяются в операторе if, потому что вы хотите применить это без ограничения, достаточно просто удалить оператор if и вернуть пустые массивы

пс; если вы пометите мой ответ как решение, то также проголосуйте за @ LoicTheAzte c оригинальный ответ, если вы еще этого не сделали, поскольку его код почти содержал решение.

// 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 голос
/ 29 марта 2020

// Поскольку предлагаемый ответ, по-видимому, вызывает некоторые новые проблемы и не решает исходную проблему в нескольких других случаях, есть варианты скрытия элементов в соответствии с типом пользователя, что-то вроде приведенного ниже - что-то вроде 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;
}

Вы сохраните это в папке вашей темы css в новом shop_manager_styles. css.

Теперь у вас может возникнуть необходимость показать статус заказа менеджерам магазина без возможности их редактирования. Это также было бы выполнимо с CSS, если также (даже больше) клудж. Может случиться так, что у вас есть другие особенности в вашей установке, которые будут препятствовать тому, чтобы вышеупомянутый код или минимально настроенный его вариант работал, но, даже если он немного менее чист, чем удаление опции через функцию, такого рода вещи обычно будут работать в крайнем случае.

(отредактировано для предоставления опции для добавления таблицы стилей на внешний интерфейс - в случае, если соответствующие опции появляются в админ-панели, в противном случае нет необходимости ставить дополнительный сценарий без прав администратора.)

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