Если вы администратор, редактор на блоге или автор поста, то вы можете установить на него пароль (под постом в данном случае я буду подразумевать запись, страницу или пост произвольного типа — то есть защита паролем работает для всех них).
Также рекомендую свой видеокурс по созданию темы WordPress на основе готовой вёрстки.
На самом деле защитить запись паролем не сложнее, чем создать эту самую запись. Всё, что вам потребуется это:
По сути всё. Если теперь мы перейдём на страницу поста, то увидим:
Содержимое и цитата этого поста также скроется и с других страниц сайта, например главная, категории и т.д. Но вы сможете изменить текст, отображаемый вместо цитаты.
Пароль также можно установить через быстрое редактирование записи:
Ещё несколько вещей про защиту паролем, про которые вам следует знать:
wp_posts
.По умолчанию действие защиты паролем не распространяется на произвольные поля постов. Защищать их придётся вручную при помощи функции 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' ); } }
Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.
Огромное спасибо! Как раз было нужно, чтобы и пароль был на страницу (желательно, стандартными средствами), и время его запоминания было минут 15. Ну, и изменение стандартной формы ввода пароля тоже пригодилось.
От души брат
"По умолчанию введённый пользователем пароль запоминается на 10 дней, но вы можете изменить это значение при помощи фильтра post_password_expires..." - это все в function.php копировать текст?
ага
А как защитить паролем поля от ACF?
С ACF никогда не работал и не планирую.
А вообще что-то типо этого:
Здравствуйте!
Помогите, пожалуйста, решить мою проблему :)
У меня есть одна запароленная страница. С помощью фильтра the_password_form в всплывающем окне я показываю форму для ввода пароля на всех других страницах и постах.
Как сделать редирект на запароленную страницу после того, как был введен корректный пароль?
Здравствуйте,
А другие страницы сами по себе не защищены паролем? Там, где форму выводите
Спасибо за ответ и желание помочь.
Нет, остальные страницы не защищены, это страницы продуктов woocommerce.
После того, как обратился к вам за помощью, смог решить свою задачу, разместив в function.php весь код относящийся к case 'postpass': из https://core.trac.wordpress.org/browser/tags/5.7.2/src/wp-login.php#L630
В итоге получилось так:
Может быть кому-нибудь понадобится.
Но, если есть более лучшее решение, буду рад, если поделитесь :)
Спасибо, что поделились кодом! 🙏🏼
Пожалуйста!
У меня новая трудность, простите, что она не по теме, пока не смог найти решение, может быть сможете или ссылкой поделиться или подсказать, как в вариативный товар woocommerce добавить произвольное поле, но не просто текстовое поле, с помощью
woocommerce_wp_text_input()
, а загрузчик изображений?У меня есть только такой урок, не знаю, поможет ли он вам
Спасибо, буду разбираться
Привет!
Возможно ли на запароленной странице после ввода пользователем пароля вывести все посты? Изначально посты скрыты
Привет!
Думаю да, можно добавить условие на функцию
post_password_required()
.Привет, как можно поменять минимальную длину пароля для поста через админку? Чтобы запретить указывать пароли длиной в 1-5 символов?
Привет, подозреваю, что плагином, готового кода у меня к сожалению нет.
Здравствуйте, мне нужно поставить доступ на определеную страницу сайта для определенной role. А также содать эту не станартную роль. Если возможность без дополнительных готовых плагинов это сделать? В принципе мен нужна простая фронтенд роль с доступом к определенной странице, и своей логин страницей которая должна быть скрыта в фонтенде для нормального форнтенд пользователя. Логин страницу я вроде бы создала. Но не нашла как создать кастомную роль без плагинов. Спасибо!
Здравствуйте, да, конечно,
1. Создаём роль
2. Используем проверку функцией current_user_can(), чтобы либо отображать страницу, либо форму входа.