Вопрос или проблема
Я хочу разместить экран входа в wordpress на своей главной странице. Если пользователь не авторизован, я хочу, чтобы он ввел свое имя пользователя и пароль в поле (или зарегистрировался).. а если он авторизован, я хочу, чтобы его перенаправили на страницу обзора.
Все работает нормально, если пользователь не авторизован, но если он авторизован, перенаправление не работает..
Может ли кто-нибудь сказать, что не так с моим php кодом ниже.
/* добавьте шорткод для входа */
add_action( 'init', 'my_add_shortcodes' );
function my_add_shortcodes() {
add_shortcode( 'my-login-form', 'my_login_form_shortcode' );
}
function my_login_form_shortcode( $attr ) {
if ( is_user_logged_in()) {
wp_redirect('http://michellemarcus.co.za/thinkingmachines/overview/') ;
}
if ( ! is_user_logged_in() )
/* Установите некоторые значения по умолчанию. */
$defaults = array(
'label_username' => 'Имя пользователя',
'label_password' => 'Пароль'
);
/* Объедините входные аргументы пользователя с значениями по умолчанию. */
$attr = shortcode_atts( $defaults, $attr );
/* Установите 'echo' на 'false', потому что мы хотим, чтобы он всегда возвращал значение, а не выводил его для шорткодов. */
$attr['echo'] = false;
return wp_login_form( $attr );
}
Я верю, что вы могли бы использовать template_redirect для обработки этапа перенаправления:
function my_page_template_redirect() {
if ( !is_page( 'overview' ) && is_user_logged_in() ) {
wp_redirect( home_url( '/thinkingmachines/overview/' ) );
die;
}
}
add_action( 'template_redirect', 'my_page_template_redirect' );
Ответ или решение
Вопрос о том, как корректно реализовать редирект пользователей на странице входа в WordPress, имеет важное значение для удобства и функциональности сайта. Давайте подробно разберем ваши проблемы с кодом и как их решить, используя оптимальные методы WordPress.
Понимание проблемы
Ваша основная задача заключается в следующем:
- Если пользователь не авторизован, он должен увидеть форму для входа.
- Если пользователь авторизован, он должен быть перенаправлен на страницу «обзор».
Ваш код, кажется, приближен к решению, однако есть две ключевые проблемы, которые мешают корректной реализации:
- Использование
wp_redirect
до завершения выполнения скрипта: После вызоваwp_redirect
необходимо использоватьdie()
илиexit
для прекращения дальнейшего выполнения PHP-скрипта, иначе код продолжит выполняться. - Редирект должен происходить вне контекста обработки шорткода: Лучше использовать хук
template_redirect
для обработки редиректов, так как это более подходящий способ для этой задачи.
Рекомендованное решение
Вот как можно переписать ваш код для достижения желаемого поведения:
- Создайте функцию для выполнения проверки и редиректа.
- Используйте хук
template_redirect
. - Проверьте, находится ли пользователь на нужной странице, прежде чем перенаправлять его.
Ниже приведен исправленный код:
// Регистрируем шорткод для формы логина
add_action( 'init', 'my_add_shortcodes' );
function my_add_shortcodes() {
add_shortcode( 'my-login-form', 'my_login_form_shortcode' );
}
// Функция для обработки шорткода
function my_login_form_shortcode( $attr ) {
// Задаем стандартные параметры
$defaults = array(
'label_username' => 'Имя пользователя',
'label_password' => 'Пароль',
'echo' => false
);
// Объединяем параметры
$attr = shortcode_atts( $defaults, $attr );
// Если пользователь авторизован, выводим информацию, иначе показываем форму
if ( is_user_logged_in() ) {
return '<p>Вы уже авторизованы.</p>'; // Или можно вернуть cancel ссылки
} else {
return wp_login_form( $attr );
}
}
// Перенаправляем авторизованных пользователей
function my_page_template_redirect() {
// Проверяем, авторизован ли пользователь и не находитесь ли на странице "overview"
if ( is_user_logged_in() && !is_page( 'overview' ) ) {
wp_redirect( home_url( '/thinkingmachines/overview/' ) );
exit; // Завершаем выполнение
}
}
add_action( 'template_redirect', 'my_page_template_redirect' );
Пояснения к коду
- Шорткод
my-login-form
: Он отвечает за отображение формы логина. Если пользователь уже вошел в систему, выводится сообщение, что он авторизован. В противном случае отображается форма. - Функция
my_page_template_redirect
: Здесь происходит проверка, авторизован ли пользователь. Если да и он не на странице «обзор», выполняется перенаправление с помощьюwp_redirect
, за которым следуетexit
для завершения выполнения кода.
Заключение
С помощью приведенного кода вы сможете обеспечить корректный редирект пользователей на нужную страницу в зависимости от их статуса авторизации. Это не только улучшит пользовательский опыт, но и повысит безопасность вашего сайта, ограничивая доступ к контенту для неавторизованных пользователей. Не забудьте протестировать изменения на тестовом сайте перед внедрением их на рабочем сайте.