Если вы администратор, редактор на блоге или автор поста, то вы можете установить на него (на пост) пароль (под постом в данном случае я буду подразумевать запись, страницу или пост произвольного типа — то есть защита паролем работает для всех них).
Так как же можно защитить пост паролем в WP?
На самом деле защитить запись паролем не сложнее, чем создать эту самую запись. Всё, что вам потребуется это:
- Как я уже писал выше — нужно быть администратором, редактором или автором (этого поста).
- Переходим на страницу редактирования поста и в блоке «Опубликовать» жмём «Видимость > Изменить».
- Выбираем Защищено паролем, устанавливаем свой пароль и жмём «Ок», затем «Обновить».
По сути всё. Если теперь мы перейдём на страницу поста, то увидим:
Та же картина будет отображаться и на других страницах блога, где присутствует эта запись, например: главная страница, рубрики, метки, архивы.
Несколько вещей про защиту паролем, про которые вам следует знать
Итак:
- Максимальная длина пароля — 20 символов, минимальная — 1 символ.
- После того, как вы ввели пароль к записи, он запомнится, и вам не придется вводить его каждый раз после обновления страницы. Кроме того, он будет действовать также и для других записей с таким же паролем.
- Также вам следует знать, что за раз в кукисах запоминается только один пароль, к последней просмотренной записи.
- Если пароль будет изменён в админке, то его придется вводить заново.
- Настроить пароль можно также и через Свойства (быстрое редактирование записей).
Нажимаем на ссылку «Свойства» и:
- Защита паролем влияет на три составляющие поста:
- Перед заголовком записи добавляется слово «Защищено: ».
- Вместо содержимого поста выводится форма для ввода пароля.
- Вместо цитаты выводится сообщение, что типо цитаты нет, так как запись защищена паролем.
- Из предыдущего пункта понятно, что действие защиты не распространяется на произвольные поля поста. Это не проблема, их вы можете защитить функцией
post_password_required()
:/* * функция post_password_required() проверяет, установлен ли пароль для поста и вводил ли его пользователь * работает для текущего поста в цикле, но позволяет также в качестве параметра передать ID или объект какой-то конкретной записи */ if ( ! post_password_required() ) { // выводим значение произвольного поля только если защита снята echo 'Адрес: ' . get_post_meta( $post->ID, 'addr', true ); }
- По умолчанию введённый пользователем пароль запоминается на 10 дней, но вы можете изменить это значение при помощи фильтра
post_password_expires
:function true_change_pass_exp( $exp ){ return time() + 5 * DAY_IN_SECONDS; // 5 дней к примеру } add_filter('post_password_expires', 'true_change_pass_exp', 10, 1);
Как изменить форму ввода пароля на страницах сайта?
Я находил несколько очень мудрёных решений на не буду говорить каких сайтах, но на самом деле всё делается очень очень просто:
function true_new_post_pass_form() { /* * в принципе тут нужно обратить внимание на три вещи: * 1) куда ссылается форма, а также method=post * 2) значение атрибута name поля для ввода - post_password * 3) атрибуты size и maxlength поля для ввода должны быть меньше или равны 20 (про длину пароля я писал выше) * Во всём остальном у вас полная свобода действий! */ return '<form action="' . esc_url( site_url( 'wp-login.php?action=postpass', 'login_post' ) ) . '" method="post"> <input name="post_password" type="password" size="20" placeholder="Пароль к записи" maxlength="20" /> <input type="submit" name="Submit" value="Разблокировать" /> </form>'; } add_filter( 'the_password_form', 'true_new_post_pass_form' ); // вешаем функцию на фильтр the_password_form |
Ах да, если не знаете, куда вставлять код — вставляйте в functions.php
(в тот, который находится в вашей активной теме WP).
А можно ли изменить стандартное сообщение для цитат?
Конечно, в этом вам поможет этот хук:
function true_protected_excerpt_text( $excerpt ) { if ( post_password_required() ) $excerpt = '<em>[Запись заблокирована. Для получения пароля обратитесь к администратору.]</em>'; return $excerpt; // если запись не защищена, будет выводиться стандартная цитата } add_filter( 'the_excerpt', 'true_protected_excerpt_text' ); |
Кроме того, используя предыдущий пример, вы даже сможете вывести форму ввода пароля.
Как полностью скрыть с сайта все записи, защищенные паролем
В этом нам поможет потрясающий хук pre_get_posts. Использование этого хука не вызовет проблем с постраничной навигацией, что важно.
/* * Небольшая модификация для SQL запроса, получающего посты */ function true_exclude_pass_posts($where) { global $wpdb; return $where .= " AND {$wpdb->posts}.post_password = '' "; } /* * При помощи этого фильтра определим, на каких именно страницах будет скрывать защищенные посты */ function true_where_to_exclude($query) { if( is_front_page() ) { // например на главной странице add_filter( 'posts_where', 'true_exclude_pass_posts' ); } } add_action('pre_get_posts', 'true_where_to_exclude'); |
Читайте подробнее про is_front_page() и другие условные теги.
Источник: misha.blog