Защита записей и страниц паролем

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

Также рекомендую свой видеокурс по созданию темы WordPress на основе готовой вёрстки.

Как поставить пароль на запись или страницу сайта

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

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

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

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

Пароль также можно установить через быстрое редактирование записи:

установка пароля в быстром редактировании записи

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

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

Как защитить паролем мета-поля?

По умолчанию действие защиты паролем не распространяется на произвольные поля постов. Защищать их придётся вручную при помощи функции post_password_required().

if ( ! post_password_required() ) {
    // выводим значение произвольного поля только если защита снята
    echo 'Адрес: ' . get_post_meta( get_the_ID(), 'addr', true );
}

Изменяем время действия пароля

По умолчанию введённый пользователем пароль запоминается на 10 дней, но вы можете изменить это значение при помощи фильтра post_password_expires:

add_filter( 'post_password_expires', 'true_change_pass_exp', 25 );
 
function true_change_pass_exp( $exp ){
 
	return time() + 5 * DAY_IN_SECONDS; // 5 дней к примеру (текущее время + 5 дней)
 
}

Не знаете, куда вставлять сниппет кода?

Как изменить форму ввода пароля на страницах сайта?

Я находил несколько чересчур хитрых решений на не буду говорить каких сайтах, но на самом деле всё делается очень очень просто:

add_filter( 'the_password_form', 'true_new_post_pass_form' ); // вешаем функцию на фильтр the_password_form
 
function true_new_post_pass_form() {
	/*
	 * в принципе тут нужно обратить внимание на три вещи:
	 * 1) куда ссылается форма, а также method=post
	 * 2) значение атрибута name поля для ввода - post_password
	 * 3) атрибуты size и maxlength поля для ввода должны быть меньше или равны 20 (про длину пароля я писал выше)
	 * Во всём остальном у вас полная свобода действий!
	 */
	return '<form action="' . 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>';
}

Не знаете, куда вставлять сниппет кода?

Как изменить текст цитаты защищённой паролем записи

Тут мы опять обращаемся к помощи функции post_password_required(), а также фильтру the_excerpt.

add_filter( 'the_excerpt', 'true_protected_excerpt_text' );
 
function true_protected_excerpt_text( $excerpt ) {
 
	if ( post_password_required() ) {
		$excerpt = '<em>[Запись заблокирована. Для получения пароля обратитесь к администратору.]</em>';
	}
 
	return $excerpt; // если запись не защищена, будет выводиться стандартная цитата
}

Кроме того, используя предыдущий пример, вы даже сможете вывести форму ввода пароля.

Как полностью скрыть с сайта все записи, защищенные паролем

В этом нам поможет потрясающий хук pre_get_posts. Использование этого хука не вызовет проблем с постраничной навигацией, что важно.

/*
 * Небольшая модификация для SQL запроса, получающего посты
 */
function true_exclude_pass_posts( $where ) {
	global $wpdb;
	return $where .= " AND {$wpdb->posts}.post_password = '' "; 
}
 
/*
 * При помощи этого фильтра определим, на каких именно страницах будет скрывать защищенные посты
 */
add_action( 'pre_get_posts', 'true_where_to_exclude' );
 
function true_where_to_exclude( $query ) {
	if( is_home() || is_archive() ) {
		add_filter( 'posts_where', 'true_exclude_pass_posts' );
	}
}

Миша

Впервые познакомился с WordPress в 2009 году. Организатор и спикер на конференциях WordCamp. Преподаватель в школе Нетология.

Если вам нужна помощь с сайтом или разработка с нуля на WordPress / WooCommerce — пишите. Я и моя команда будем рады вам помочь!

Комментарии — 14

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

Если вы хотите добавить код, не забудьте обернуть его в <pre lang="php"></pre>, если же код – меньше одной строчки, то можно и в <code></code>.