Вопрос или проблема
Я просто тестировал функцию постов, защищённых паролем, и когда я ввожу пароль, меня перекидывает на страницу 404. Введённый пароль был правильным, я проверил. В адресной строке указано: www.mydomain.com/wp-pass.php
, но отображается страница 404. Независимо от того, правильный или неправильный пароль, должна быть показана информация о том, что пароль неверный или пост, который защищен. А не просто страница 404.
В чем может быть причина этого? Заранее благодарю за любые идеи.
Ок, сам разобрался! Я использовал add_filter, чтобы настроить форму ввода пароля и добавить CSS-классы. Всё в add_filter было либо старым, либо просто неправильным. Я нашел это в руководстве, но это был урок для меня. Никогда не доверяйте коду, найденному в интернете, если он не из Codex или от абсолютного эксперта.
ИЗМЕНЕНИЕ: Только что нашел этот же код и в Codex *facepalm. Над ним написано “ЭТО БОЛЬШЕ НЕ РАБОТАЕТ”, но зачем он всё ещё в Codex? Всем, у кого такая же проблема: если вы использовали код отсюда: Использование защиты паролем: текст формы пароля, у вас будут проблемы в новых версиях WordPress.
mfw когда правильный ответ от Wombat имеет -3
Извините, что не комментирую, но у меня пока нет никакого репозитория, и я просто хочу понять, что происходит на wordpress.stackexchange.com
Что именно Wombat должен добавить к этому? У нас есть установка WP с некоторым старым кодом (между прочим, Codex должен быть правильным для текущей версии WP) из codex.wordpress.com в файле functions.php
нашей темы, чтобы настроить форму ввода пароля, например, как показано ниже:
<?php
function my_password_form() {
global $post;
$label="pwbox-".( empty( $post->ID ) ? rand() : $post->ID );
$o = '<form action="' . esc_url( site_url( 'wp-pass.php', 'login_post' ) ) . '" method="post">
' . __( "Чтобы просмотреть этот защищенный пост, введите пароль ниже:" ) . '
<label for="' . $label . '">' . __( "Пароль:" ) . ' </label><input name="post_password" id="' . $label . '" type="password" size="20" maxlength="20" /><input type="submit" name="Submit" value="' . esc_attr__( "Отправить" ) . '" />
</form>
';
return $o;
}
add_filter( 'the_password_form', 'my_password_form' );
?>
На каком-то обновлении WP форму изменили, но так как мы её перезаписываем нашим фильтром в functions.php
, мы теперь получаем ошибку, описанную ОП после обновления. И теперь мы меняем wp-pass.php
на /wp-login.php?action=postpass
, как сказал Wombat (и как показано на текущей странице Codex), следующим образом:
<?php
function my_password_form() {
global $post;
$label="pwbox-".( empty( $post->ID ) ? rand() : $post->ID );
$o = '<form action="' . esc_url( site_url( 'wp-login.php?action=postpass', 'login_post' ) ) . '" method="post">
' . __( "Чтобы просмотреть этот защищенный пост, введите пароль ниже:" ) . '
<label for="' . $label . '">' . __( "Пароль:" ) . ' </label><input name="post_password" id="' . $label . '" type="password" size="20" maxlength="20" /><input type="submit" name="Submit" value="' . esc_attr__( "Отправить" ) . '" />
</form>
';
return $o;
}
add_filter( 'the_password_form', 'my_password_form' );
?>
Проблема решена. (Для тех, кто уже реализовал пользовательский фильтр, который вызвал эту проблему, никакой проблемы быть не должно с информацией, предоставленной Wombat… так почему же вы, ребята, его недооцениваете??)
Столкнулся с тем же устаревшим кодом. Независимо от того, как вы изменяете защищённую паролем форму, wp-pass.php
больше не существует. Ваше действие в форме должно быть, как предлагает Wombat:
<form action="<?php echo get_option('siteurl'); ?>/wp-login.php?action=postpass">
Используйте это действие формы, чтобы отправить переменную пост-пароль для проверки.
Замените wp-pass.php на /wp-login.php?action=postpass
.
Ответ или решение
Проблема с возникновением ошибки 404 после попытки доступа к защищённым паролем постам на платформе WordPress может быть довольно распространённой, особенно при использовании устаревшего или неправильно настроенного кода. Описание проблемы демонстрирует ключевую ошибку, связанную с конфигурацией формы паролей и неправильным указанием ресурсов, используемых для обработки этих форм. Разберем подробнее.
Теория
Ошибка 404 указывает на то, что запрашиваемый ресурс не найден на сервере. В контексте WordPress, это может указывать на проблемный путь к файлу или несуществующий файл в системе. До определённого момента WordPress использовал файл wp-pass.php
для обработки введённых паролей к защищённым постам. Однако, в более современных версиях WordPress этот способ был заменён, и аналогичная функциональность теперь реализуется через wp-login.php?action=postpass
.
Проблема возникает, когда устаревший код содержится в файлах темы или плагина, которые не были обновлены в соответствии с последними изменениями API WordPress. Особенно часто это происходит при копировании или использовании кода из негарантированных источников, когда изменения в современной версии приложения не учитываются.
Пример
Неправильный код, который вызывает ошибку 404, может выглядеть так:
<form action="<?php echo esc_url( site_url( 'wp-pass.php', 'login_post' ) ); ?>" method="post">
<!-- Другие элементы формы -->
</form>
Этот код указывает на несуществующее в современных версиях WordPress место назначения обработки формы, что и приводит к ошибке 404. Альтернативный, корректный пример, который следует использовать, может выглядеть следующим образом:
<form action="<?php echo esc_url( site_url( 'wp-login.php?action=postpass', 'login_post' ) ); ?>" method="post">
<!-- Другие элементы формы -->
</form>
Этот код направляет запрос на существующий и поддерживаемый WordPress метод обработки ввода пароля, что позволяет избежать ошибки 404.
Применение
Чтобы решить проблему и гарантировать правильное поведение защищённых паролем постов на WordPress, следуйте следующим шагам:
-
Обновление кода: Идентифицируйте все места в своей теме или плагинах, где используется старая форма для ввода паролей и замените
wp-pass.php
наwp-login.php?action=postpass
. Это необходимо сделать везде, где проникается значениеaction
для формы пользователя. -
Проверка совместимости: Убедитесь, что все используемые плагины и темы совместимы с вашей текущей версией WordPress. Всегда используйте официальные источники информации для получения последней документации и рекомендаций.
-
Регулярное обновление: Важная часть любого процесса управления сайтами — это поддержание всего программного обеспечения в актуальном состоянии. Регулярные обновления тем и плагинов помогают не только улучшить функциональность сайта, но и минимизировать появление таких ошибок в будущем.
-
Использование официальных ресурсов: Код и примеры решений всегда должны черпаться из проверенных источников, таких как Codex или другие официальные документы WordPress. Если вы находите код в интернете, внимательно проверяйте его актуальность и применимость к вашей версии WordPress.
Следуя этим шагам, вы не только устраните текущую проблему, но и создадите более устойчивую и надёжную платформу для вашего сайта. Это поможет укрепить как безопасность, так и функциональную целостность вашего сайта, предоставляя пользователям оптимальный опыт взаимодействия.