WordPress как предоставить доступ к странице только подписчикам

#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') );  }  } }