#php #wordpress #redirect #woocommerce #custom-wordpress-pages
Вопрос:
Я пытаюсь предоставить доступ к определенной странице только для моей роли пользователя-подписчика, если кто-то другой с другой ролью подписчика или не являющийся пользователем роли хочет получить доступ к этой странице, перенаправьте их на пользовательскую страницу входа, я попытался использовать приведенный ниже фрагмент, но я думаю, что с ним что-то не так, пожалуйста, помогите мне исправить это
Пример : Ограничение доступа к определенным страницам
add_action( 'template_redirect', function() { // Get global post global $post; // Prevent access to page with ID 1052 $page_id = 1052; if ( is_page() amp;amp; ( $post-gt;post_parent == $page_id || is_page( $page_id ) ) ) { // Set redirect to true by default $redirect = true; // If logged in do not redirect // You can/should place additional checks here based on user roles or user meta if ( current_user_can( 'subscriber' ) || !is_user_logged_in()) { $redirect = false; } // Redirect people without access to login page if ( $redirect ) { wp_redirect( get_site_url().'/custom-url-login' ); exit; } } } );
Комментарии:
1. Так почему же вы думаете, что «с этим что-то не так»? 1 — Вы получаете какие-либо ошибки? 2 — Он вел себя так, как вы не ожидали?
2. @Ruvee проблема с этим кодом в том, что я получаю слишком много перенаправлений, он сохраняет перенаправление на одной и той же странице (пользовательский URL-логин)
3.
is_page()
в вашем условном нет необходимости. Вам нужны только два других.4. @jahn Код, который вы предоставили нам в своем вопросе, не дает представления о том, почему происходит такой цикл перенаправления. Мое дикое предположение-это ваш .htaccess или в вашем коде есть другое перенаправление в другом месте.
Ответ №1:
Вы могли бы реорганизовать свой код следующим образом:
add_action( 'template_redirect', 'checking_current_user' ); function checking_current_user() { global $post; global $current_user; $page_id = 1052; if ( ( $post-gt;post_parent == $page_id || is_page( $page_id ) ) amp;amp; ( !in_array('subscriber', $current_user-gt;roles) ) ) { wp_safe_redirect( site_url('/custom-url-login') ); exit; } }
Этот ответ был протестирован и отлично работает!
Ответ №2:
Разве это не сделает то, о чем ты просил?
// If user role 'subscriber' amp; logged in do not redirect // You can/should place additional checks here based on user roles or user meta if ( current_user_can( 'subscriber' ) amp;amp; is_user_logged_in()) { $redirect = false; }
Комментарии:
1. спасибо за ваш ответ, но проблема в том, что другая роль пользователя также имеет доступ к странице (идентификатор страницы = 1052) Я хочу, чтобы только роль подписчика имела доступ к этой странице, а не к другой роли пользователя
2. @jahn Ах, хорошо, я посмотрю на это еще раз
3. теперь он сохраняет перенаправление на той же странице ( пользовательский URL-логин)
4. @Jahn Извините, но я не понимаю, что именно вы имели в виду в последнем комментарии.
5. когда я попытался войти в систему с другой ролью пользователя, страница (пользовательский URL-логин) непрерывно перезагружалась
Ответ №3:
Прежде всего, вам необходимо проверить, вошел пользователь в систему или нет, Если пользователь не вошел в систему, то вам нужно перенаправить пользователя на страницу входа в систему, после входа в систему вам нужно применить кодовый код, тогда он будет работать нормально.
add_action( 'template_redirect', 'check_current_user' ); function check_current_user(){ global $post, $current_user; $page_id = 1052; if ( is_page() amp;amp; ( $post-gt;post_parent == $page_id || is_page( $page_id ) ) ) { if ( is_user_logged_in() ) { /*==Now check user is subscriber==*/ $current_user = wp_get_current_user(); $role = $current_user-gt;roles; $currentRole = $role[0]; if($currentRole == "subscriber"){ $redirect = false; }else{ $redirect = true; } }else{ wp_safe_redirect( site_url('/custom-url-login') ); } } }