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

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

Так как же можно защитить пост паролем в 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() и другие условные теги.

Подпишитесь, чтобы раз в неделю получать свежие статьи с блога по email.

Также по теме

Комментарии 4

  • Ольга3 августа 2015 в 21:08 #

    Огромное спасибо! Как раз было нужно, чтобы и пароль был на страницу (желательно, стандартными средствами), и время его запоминания было минут 15. Ну, и изменение стандартной формы ввода пароля тоже пригодилось.

  • Ромаха ауе8 октября 2015 в 12:10 #

    От души брат

  • Роман8 декабря 2015 в 17:12 #

    "По умолчанию введённый пользователем пароль запоминается на 10 дней, но вы можете изменить это значение при помощи фильтра post_password_expires..." - это все в function.php копировать текст?

Оставить комментарий / вопрос

phpjsHTMLCSSSQLПросто код
  Для того, чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или авторизуйтесь на сайте.
Получайте новости блога по email или следите за мной в социальных сетях.
  • Владимир: и на третьей строке не хватает скобки ) закрывающей if :)

  • Миша: Добрый вечер! Рекомендую получить ID пользователя через функцию get_current_user_id().

  • Дмитрий: Миша, подскажите пожалуйста, я использую такой редирект, но он не срабатывает: add_action( 'template_redirect', funct...

  • Миша: Ну как не определена - это аргумент функции. Или я просто вас не до конца понимаю.

  • Артем: Ага, понял. Вот только почему $args? Она же нигде не определена, по логике должна быть переменная $true_field_params или...