Есть несколько способов приблизиться к логике в этом, но вот функция сначала:
function vnm_remove_woo_statuses($statuses) {
$currentUser = wp_get_current_user();
$removeStatusesArray = array('pending', 'completed', 'cancelled', 'refunded', 'failed', 'refund-issued', 'shipping-progress', 'on-hold');
// If it's any role other than administrator, remove the status
if (!in_array('administrator', $currentUser->roles)) {
foreach ($removeStatusesArray as $status) {
if (isset($statuses['wc-' . $status])) {
unset($statuses['wc-' . $status]);
}
}
}
// ALWAYS need to return the status array regardless
return $statuses;
}
add_filter('wc_order_statuses', 'vnm_remove_woo_statuses', 5, 1);
Обратите внимание на последнюю строку функции: вам всегда нужно возвращать значение фильтра, независимо от логики в нем - иначе все пойдет не так. Я также установил высокий приоритет 5
на случай, если что-то еще будет подключено.
Условная логика в настоящее время настроена на удаление статусов, если ЛЮБАЯ роль, отличная от administrator
, пыталась изменить ордер:
if (!in_array('administrator', $currentUser->roles)) { /* Do stuff */ }
В вашем примере вы удаляли статусы только для администраторов. Вы можете изменить это так, чтобы это происходило только для stock_user
пользователей:
if (in_array('stock_user', $currentUser->roles)) { /* Do stuff */ }
... однако, имейте в виду, что если у вас есть возможность добавить несколько ролей для пользователя и добавить Stock User
к администратору, их доступ к статусам ордеров также будет здесь ограничен.