Бесплатный курс по натяжке вёрстки на WordPress на моём YouTube канале!

Всё про защиту записей паролем

Если вы администратор, редактор на блоге или автор поста, то вы можете установить на него (на пост) пароль (под постом в данном случае я буду подразумевать запись, страницу или пост произвольного типа — то есть защита паролем работает для всех них).

Так как же можно защитить пост паролем в WP?

На самом деле защитить запись паролем не сложнее, чем создать эту самую запись. Всё, что вам потребуется это:

  1. Как я уже писал выше — нужно быть администратором, редактором или автором (этого поста).
  2. Переходим на страницу редактирования поста и в блоке «Опубликовать» жмём «Видимость > Изменить».
  3. Выбираем Защищено паролем, устанавливаем свой пароль и жмём «Ок», затем «Обновить».
    Защитить пост паролем не сложнее, чем опубликовать его.

По сути всё. Если теперь мы перейдём на страницу поста, то увидим:

Так выглядит форма ввода пароля для записи на страницах сайта

Та же картина будет отображаться и на других страницах блога, где присутствует эта запись, например: главная страница, рубрики, метки, архивы.

Несколько вещей про защиту паролем, про которые вам следует знать

Итак:

  • Максимальная длина пароля — 20 символов, минимальная — 1 символ.
  • После того, как вы ввели пароль к записи, он запомнится, и вам не придется вводить его каждый раз после обновления страницы. Кроме того, он будет действовать также и для других записей с таким же паролем.
  • Также вам следует знать, что за раз в кукисах запоминается только один пароль, к последней просмотренной записи.
  • Если пароль будет изменён в админке, то его придется вводить заново.
  • Настроить пароль можно также и через Свойства (быстрое редактирование записей).
    Свойства (быстрое редактирование) записи

    Нажимаем на ссылку «Свойства» и:

    Установка или изменение пароля через свойства записи
  • Защита паролем влияет на три составляющие поста:
    1. Перед заголовком записи добавляется слово «Защищено: ».
    2. Вместо содержимого поста выводится форма для ввода пароля.
    3. Вместо цитаты выводится сообщение, что типо цитаты нет, так как запись защищена паролем.
  • Из предыдущего пункта понятно, что действие защиты не распространяется на произвольные поля поста. Это не проблема, их вы можете защитить функцией 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() и другие условные теги.

Миша Рудрастых

Впервые познакомился с WordPress в 2009 году. С 2014 года меня можно встретить на WordCamp — официальной конфе по WordPress, иногда там выступаю. Также в настоящее время веду курсы по WordPress в Epic Skills.

Если вам нужна помощь с вашим сайтом или разработка с нуля, то могу порекомендовать хороших ребят. Просто напишите мне.