Как скрыть контент WordPress с помощью функции защиты паролем
Как правило, записи в WordPress публикуются со статусом доступно для всех. Но что делать, если мы хотим разместить в блоге запись, доступную только для близких друзей, членов семьи или для редакторов сайта? Скрыть контент от широкой публики возможно, для этого не нужно прибегать к помощи плагинов.
Независимо от того, хотите ли вы скрыть содержимое записи, комментарии, пользовательские поля или любые другие элементы. В этой статье мы рассмотрим несколько способов скрыть различные компоненты записи.
Как скрыть контент, выдержки и комментарии
На странице редактирования записи есть метабокс с тремя вариантами видимости записи. Нажмите кнопку "Изменить" рядом с полем "Видимость: публичная" и в раскрывшейся панели вы увидите три варианта для этого параметра на выбор: «Открыто», «Защищена паролем» и «Личная»:
- Если вы установите флажок для опции «Защищена паролем», вам откроется поле для ввода пароля, который будет запрашиваться для просмотра этой записи. Обратите внимание, что пароль не может быть длиннее 20 символов;
- Если вы выберите вариант «Личная», то данная запись будет доступна только для пользователей вашего сайта с ролями «Администратор» или «Редактор».
Нажмите кнопку "OK", чтобы обновить настройки видимости записи.
Нажмите кнопку "Опубликовать" (или "Обновить", если запись уже опубликована) и сохраните запись, чтобы принять изменения:

Теперь WordPress будет отображать запись следующим образом:
- Перед заголовком записи будет выводиться надпись "Защищено";
- Если запись содержит фрагмент, вместо него будет выводиться надпись "Нет выдержки, потому что эта запись защищена";
- Вместо содержимого записи будет выводиться форма для ввода пароля с текстом: "Эта запись защищена паролем. Для ее просмотра введите, пожалуйста, пароль:"

Защита пользовательских полей
В приведенном выше примере реквизиты ресторана отображаются еще до того, как пользователь введет пароль. Причина этого заключается в том, что в данном случае информация хранится в метаданных записи.
Чтобы не выводить пользовательские поля на экран, вы можете «обернуть» вызов get_post_meta() в условный оператор, который оценивает значение, возвращаемое функцией post_password_required(). Он проверяет, требуется ли для данной записи пароль, а также был ли он введен верно:
<?php
if ( ! post_password_required() ) {
$restaurant address = get_post_meta( $post->ID, 'address', true );
echo $restaurant address;
}
?>
Функция post_password_required() также может использоваться, чтобы не допустить вывод защищенных паролем записей в списках, например в результатах поиска.
Защита текста фрагмента
Скрытие фрагментов от просмотра похоже на защиту пользовательских полей тем, что WordPress предоставляет для этих целей фильтр the_excerpt:
<?php
function hide_excerpt( $excerpt ) {
if ( post_password_required() ) {
$excerpt = '<em>[This post is password-protected.]</em>';
}
return $excerpt;
}
add_filter( 'the_excerpt', 'hide_excerpt' );
?>
Можно просто вывести форму для ввода пароля, вызвав метод:
get_the_password_form().
<?php
function show_password_form_for_excerpt( $excerpt ) {
if ( post_password_required() ) {
$excerpt = get_the_password_form();
}
return $excerpt;
}
add_filter( 'the_excerpt', 'show_password_form_for_excerpt' );
?>
Настройка формы ввода пароля
Фильтр the_password_form позволяет настроить форму для ввода пароля. Для этого форма возвращается из функции, а не с помощью echo, и для поля пароля устанавливается атрибут maxlength="20", чтобы соответствовать ограничению WordPress по длине пароля:
<?php
function show_custom_password_form() {
global $post;
$label = 'pwbox-'.( empty( $post->ID ) ? rand() : $post->ID );
$form = '<form action="' . esc_url( site_url( 'wp-login.php?action=postpass', 'login_post' ) ) . '" method="post">
' . __( "To view this protected post, enter the password below:" ) . '
<label for="' . $label . '">' . __( "Password:" ) . ' </label><input name="post_password" id="' . $label . '" type="password" size="20" maxlength="20" /><input type="submit" name="Submit" value="' . esc_attr__( "Submit" ) . '" />
</form>';
return $form;
}
add_filter( 'the_password_form', 'show_custom_password_form' );
?>
Как полностью скрыть защищенные паролем записи
Может потребоваться полностью исключить защищенные паролем записи из результатов поиска, страниц архивов и так далее. Это можно сделать с помощью комбинации действия pre_get_posts и фильтра posts_where. Сначала мы проверяем, содержит ли страница несколько записей, и не находимся ли мы в панели администрирования. После этого мы удаляем защищенные паролем записи из всех SQL-запросов, выполняемых WordPress, используя фильтр posts_where:
<?php
// Фильтр, чтобы скрыть защищенные записи
function exclude_protected($where) {
global $wpdb;
return $where .= " AND {$wpdb->posts}.post_password = '' ";
}
// Решаем, где выводить их
function exclude_protected_posts($query) {
if( !is_single() && !is_page() && !is_admin() ) {
add_filter( 'posts_where', 'exclude_protected' );
}
}
// Действие, чтобы поставить фильтр в очередь в нужное время
add_action('pre_get_posts', 'exclude_protected_posts');
?>
Заключение
Благодаря подключению фильтров и действий в WordPress можно защитить содержимое записей без использования сторонних плагинов.