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

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

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

Источник: misha.blog

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

Путешествует по миру и рассказывает всем о WordPress лично, у себя в блогах и на курсах в Санкт-Петербурге. Умеет просто объяснять сложные вещи, делает это красиво. Организовывает неплохие WordCamp's, но совсем не умеет слушать чужие доклады.

Добавить комментарий

%d такие блоггеры, как: