Удалить кнопки действий с панели управления подписками WooCommerce для определенной роли пользователя

Я ищу виртуального помощника, который поможет управлять обращениями в службу поддержки. Этому виртуальному помощнику потребуется доступ для чтения к ограниченным областям WooCommerce (Подписки).

Я использую «редактор ролей пользователя», чтобы удалить все ненужные возможности. К сожалению, одна возможность (edit_shop_orders) дает доступ к функциям, к которым я не хочу, чтобы агент имел доступ. Я вынужден предоставить агенту возможность иметь доступ к меню подписки в серверной части.


Что я пытаюсь сделать:

Удаление доступа к кнопкам "Приостановить" и "Отмена" для определенной роли пользователя (va_support)

введите здесь описание изображения



Мой текущий код (не работает):

function change_va_support_role(){
    global $wp_roles;
    $wp_roles->remove_cap( 'va_support', 'suspend_subscriptions' );
    $wp_roles->remove_cap( 'va_support', 'cancel_subscriptions' );

}
add_action('init', 'change_va_support_role');

Я предполагаю, что ввел неверные возможности, но я не могу их нигде найти.
Я понимаю, что я, вероятно, легко могу скрыть эти кнопки с помощью CSS, но это можно просто поменять местами и не будет зависеть от роли пользователя. Я открыт для решения этой проблемы другим способом, если он есть!


person cactusboat    schedule 25.04.2020    source источник


Ответы (2)


Используя Javascript / jQuery, следующее удалит все "зависшие" кнопки действий для определенной роли пользователя на панели администратора подписок из столбца статуса:

add_action( 'admin_footer', 'admin_dashboard_subscriptions_filter_callback' );
function admin_dashboard_subscriptions_filter_callback() {
    global $pagenow, $post_type;

    $targeted_user_role = 'va_support'; // <== Your defined user role slug

    // Targeting subscriptions admin dashboard for specific user role
    if( $pagenow === 'edit.php' && $post_type === 'shop_subscription' 
    && current_user_can( $targeted_user_role ) ) :
    ?>
    <script>
    jQuery(function($){
        $('td.column-status > div.row-actions').each(function() {
            $(this).remove();
        });
    });
    </script>
    <?php
    endif;
}

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

person LoicTheAztec    schedule 27.04.2020
comment
Потрясающе, отлично работает! Спасибо, что нашли время ответить. Если в ближайшем будущем мне понадобится помощь с большим проектом, я свяжусь с вами :) - (ps я не могу назначить вам награду за пыльник 19 часов) - person cactusboat; 27.04.2020
comment
Это только скроет ссылки действий. Если кто-то перейдет по ссылке напрямую, она сработает :) - person mujuonly; 28.04.2020
comment
Не могу сказать, что я бы очень стеснялся использовать это решение в крайнем случае, но это своего рода обман;) - person CK MacLeod; 28.04.2020
comment
@CKMacLeod Иногда обман лучше, чем ничего :) - person LoicTheAztec; 28.04.2020
comment
Привет, @LoicTheAztec. Я пытался связаться с вами по вашей ссылке «свяжитесь со мной» в вашем профиле, не уверен, что вы получили мое сообщение? - person cactusboat; 20.11.2020

На данный момент нет фильтра для обработки этого триггера действия. Вы можете добавить фильтр самостоятельно, чтобы справиться с этим.

/woocommerce-subscriptions/includes/admin/class-wcs-admin-post-types.php внутри этой функции около строки № 330 - public function parse_bulk_actions()

/*
 * Use below hook for handling custom user role permission for action from subscription listing page
 */
$can_change_status = apply_filters('wcs_can_change_subscription_status', true, $subscription_ids);
if(!$can_change_status){
    return;
}

В теме вы можете проверить, есть ли у текущего пользователя роль, а затем вернуть true / false соответственно. Вы можете знать, что при обновлении плагина изменения будут потеряны. Но что касается проверки кода, то перед запуском этих функций фильтра нет.

add_filter( 'wcs_can_change_subscription_status', 'alter_can_change_subscription_status' );

function alter_can_change_subscription_status( $can_change_status ) {

    $user = wp_get_current_user();
    if ( in_array( 'va_support', (array) $user->roles ) ) {
        //The user has the "va_support" role
        return false;
    }
    return  $can_change_status;
}
person mujuonly    schedule 25.04.2020
comment
Привет, спасибо за ваш вклад! Я только что протестировал ваш код, поместив его в «публичную функцию parse_bulk_actions ()». Затем я добавил «can_change_status» в качестве настраиваемой возможности в «Редактор ролей пользователя» и оставил его неотмеченным. К сожалению, я не вижу изменений! Я делаю что-то неправильно? - person cactusboat; 25.04.2020
comment
@cactusboat - Добавить второй фрагмент в functions.php - person mujuonly; 25.04.2020
comment
Привет, @mujuonly, я только что попробовал, но все еще не работает :( Я очень ценю, что ты нашел время, чтобы ответить на мой вопрос! - person cactusboat; 25.04.2020
comment
@cactusboat - попробуйте просто вернуть false в начале функции фильтра, если она работает. тогда вы можете подтвердить, что проблема связана с проверкой ролей, в противном случае проблема связана с позицией кода, добавленного в указанный файл. - person mujuonly; 25.04.2020
comment
Я заменил истину на ложь в первом коде, ничего не изменилось. Я также попробовал изменить положение в «публичной функции parse_bulk_actions ()». Ничего не изменилось, служба поддержки VA по-прежнему видит отмену / приостановку - person cactusboat; 25.04.2020
comment
Я думаю, что WordPress способ справиться с этой ситуацией скорее будет форкнуть, чем взломать плагин, предполагая, что удаление и замена функции (или заставить разработчика добавить фильтр!) Нецелесообразно. - person CK MacLeod; 28.04.2020
comment
@CKMacLeod Другое решение - просто скрыть кнопку, но не ограничивать ее функциональность. Я предлагаю либо разветвить, либо добавить фильтр напрямую в плагин (поскольку OP знает, что делает) - person mujuonly; 28.04.2020