#php #wordpress #woocommerce #hook-woocommerce
Вопрос:
Я работаю над сайтом WordPress с несколькими ролями. Моя цель-перенаправить пользователя с определенной ролью, когда он запрашивает страницы, такие как заказы, в области администратора, чтобы перейти по отфильтрованному URL-адресу с их идентификатором.
пример: Запросы пользователей: www.site.com/wp-admin/edit.php?post_type=shop_order
User redirects to: www.site.com/wp-admin/edit.php?post_type=shop_orderamp;wcb2bsa_sales_agent_search={current user id}
Это относится только к роли «тестировщик».
Мой подход был:
add_filter( 'user_has_cap', 'only_let_user_see', 10, 3 );
function only_let_user_see( $allcaps, $cap, $args ) {
if($args[0] === 'edit_posts' amp;amp; is_admin()) {
$url = "https://";
$url.= $_SERVER['HTTP_HOST'];
$url.= $_SERVER['REQUEST_URI'];
$url.= 'wcb2bsa_sales_agent_search=';
$url.= '100'; //fixed number for test purpose
}
if(current_user_can('tester')) {
wp_redirect ($url);
exit;
}else
{ return $allcaps;}}
Переписывание кода теперь дало мне ошибку, хотя, когда я его тестировал, он просто работал, но проблема заключалась в том, что пользователь получает ошибку: слишком много перенаправлений.
Мне действительно нужна помощь в этом, поэтому буду признателен за любые предложения. Заранее спасибо.
Ответ №1:
Проблема заключается в user_has_cap
фильтре, в котором для возврата требуются пользовательские возможности. В вашем коде вы перенаправляете tester
пользователя без передачи возможностей, поэтому вместо этого вы должны использовать admin_init
действие для перенаправления пользователя.
function redirect_users_by_role() {
global $pagenow;
if ($pagenow == 'edit.php' amp;amp; $_REQUEST['post_type'] == 'shop_order' amp;amp; current_user_can('shop_manager')) {
$url = "https://";
$url.= $_SERVER['HTTP_HOST'];
$url.= $_SERVER['REQUEST_URI'];
$url.= 'amp;wcb2bsa_sales_agent_search=';
$url.= '100'; //fixed number for test purpose
wp_redirect ($url);
exit;
}
}
add_action( 'admin_init', 'redirect_users_by_role' );
Приведенный выше код протестирован и работает нормально!