Вопрос или проблема
Я пытаюсь отобразить работающую версию стандартной формы входа в WordPress на одной из своих страниц. В файле functions.php есть код, который создаёт шорткод, и, насколько я знаю, он успешно работает, однако после отправки формы страница просто обновляется, и не происходит перенаправления на указанный мной URL… может, кто-то увидит, почему это может не работать так, как должно?
Вот функция, которую я добавил в файл functions.php:
//Шорткод формы входа
add_shortcode( 'login-form', 'my_login_form_shortcode' );
/**
* Отображает форму входа.
*
* @since 0.1.0
* @uses wp_login_form() Отображает форму входа.
*/
function my_login_form_shortcode( $atts, $content = null ) {
$defaults = array( "redirect" => site_url( $_SERVER['REQUEST_URI'] )
);
extract(shortcode_atts($defaults, $atts));
if (!is_user_logged_in()) {
$content = wp_login_form( array( 'echo' => false, 'redirect' => $redirect ) );
}
return $content;
}
Я затем размещаю его на нужной странице вот так:
[login-form redirect="https://myurl.com"]
Но вместо того, чтобы перенаправить меня на правильную страницу, он просто обновляет страницу, хотя я теперь успешно вошёл в систему… есть идеи?
Проблема, с которой вы сталкиваетесь, связана с природой перенаправления в WordPress. Он использует так называемое безопасное перенаправление, а именно с помощью функции wp_safe_redirect()
. Это ограничивает перенаправления только локальными URL.
Ваш обходной путь для этого следующий, когда вы вмешиваетесь в фильтр перенаправления входа и выполняете свое желаемое перенаправление перед тем, как WordPress сделает это за вас.
Оставьте весь ваш предыдущий код без изменений и добавьте следующее:
add_filter( 'login_redirect', 'my_login_form_redirect', 0, 1 );
function my_login_form_redirect( $redirect ) {
if ( !empty( $_POST[ 'redirect_to' ] ) && filter_var( $_POST[ 'redirect_to' ], FILTER_VALIDATE_URL ) ) {
wp_redirect( $_POST[ 'redirect_to' ] );
}
return $redirect;
}
wp_login_form перенаправляет только на URL текущего сайта. В противном случае по умолчанию перенаправляет на текущую страницу (если пользователь является администратором, перенаправляет на панель администратора)
function my_login_form_shortcode( $atts, $content = null ) {
$defaults = array( "redirect" => site_url( $_SERVER['REQUEST_URI'] ));
extract(shortcode_atts($defaults, $atts));
if (is_user_logged_in()) {
echo '';
} else {
$args = array(
'echo' => true,
'redirect' => $redirect,
'label_log_in' => __( 'Войти' ),
'form_id' => 'demo-login',
'label_username' => __( 'Имя пользователя' ),
'label_password' => __( 'Пароль' ),
'label_remember' => __( 'Запомнить меня' ),
'id_username' => 'user_login',
'id_password' => 'user_pass',
'id_submit' => 'wp-submit',
'remember' => true,
'value_username' => NULL,
'value_remember' => true
);
$content = wp_login_form($args);
}
echo $content;
}
add_shortcode( 'login-form', 'my_login_form_shortcode' );
[login-form redirect=”http://yourcurrenturl.info/any/”]
Ответ или решение
Чтобы решить проблему с перенаправлением после успешного входа в систему через шорткод логин-формы в WordPress, необходимо внести несколько изменений в вашу функцию и добавить фильтр для обработки перенаправления. Ниже представлен полный код с пояснениями.
Шаг 1: Изменение кода функции шорткода
Ваш текущий код функции шорткода уже содержит основы. Мы немного его модифицируем для корректной обработки URL перенаправления.
// Шорткод для формы входа
add_shortcode( 'login-form', 'my_login_form_shortcode' );
function my_login_form_shortcode( $atts, $content = null ) {
$defaults = array( "redirect" => site_url( $_SERVER['REQUEST_URI'] ) );
extract(shortcode_atts($defaults, $atts));
if (is_user_logged_in()) {
// Если пользователь уже вошёл, выводим приветственное сообщение
return '<div class="logout"><p>Здравствуйте! Вы уже вошли и можете перейти к <a href="http://вашпуть.ком/">онлайн-семинару</a>.</p><br /><p><a id="wp-submit" class="logout" href="' . wp_logout_url() . '" title="Выйти">Выйти</a></p></div>';
} else {
// Формируем аргументы для показа формы входа
$args = array(
'echo' => true,
'redirect' => $redirect,
'label_log_in' => __( 'Войти' ),
'form_id' => 'demo-login',
'label_username' => __( 'Имя пользователя' ),
'label_password' => __( 'Пароль' ),
'label_remember' => __( 'Запомнить меня' ),
'id_username' => 'user_login',
'id_password' => 'user_pass',
'id_submit' => 'wp-submit',
'remember' => true,
'value_username' => NULL,
'value_remember' => true
);
return wp_login_form($args);
}
}
Шаг 2: Добавление фильтра для перенаправления
Теперь вам нужно добавить фильтр, который будет обрабатывать перенаправление в зависимости от URL, указанного в параметре redirect
:
// Функция для фильтрации перенаправления после входа
add_filter( 'login_redirect', 'my_login_form_redirect', 10, 3 );
function my_login_form_redirect( $redirect_to, $requested_redirect_to, $user ) {
// Проверяем, установлено ли значение redirect_to в POST-запросе
if ( !empty( $_POST['redirect_to'] ) && filter_var( $_POST['redirect_to'], FILTER_VALIDATE_URL ) ) {
return $_POST['redirect_to'];
}
return $redirect_to; // Если нет, возвращаем стандартное значение
}
Шаг 3: Использование шорткода на странице
Теперь вы можете использовать шорткод на своей странице следующим образом:
[login-form redirect="https://вашпуть.ком/"]
Пояснение
-
Функция шорткода
my_login_form_shortcode
– Этот блок кода отвечает за отрисовку формы. Он проверяет, вошёл ли пользователь в систему или нет. Если вошёл, выводится приветствие, если нет – отображается форма входа. - Фильтр
my_login_form_redirect
– Данная функция перехватывает стандартный процесс перенаправления и заменяет его на URL, указанный вredirect_to
(который передается через POST-запрос), если он является корректным.
Заключение
Теперь, используя внедренные решения, ваша форма входа должна корректно перенаправлять пользователей после успешного входа. Убедитесь, что используете правильные URL и что все изменения были добавлены в файл functions.php
вашей темы.