Закрытый раздел для клиентов в WordPress: 30 минут и один файл
Гость попадает на форму входа, клиент с логином видит свой раздел. Настройка занимает около получаса: несколько страниц, небольшой PHP-файл и учётная запись с ролью «Подписчик».

Через полчаса у вас будет раздел «Клиентам»: гость, открывший его адрес, попадёт на форму входа, а клиент с логином и паролем увидит нужную страницу. Платные плагины не нужны: хватит одного небольшого PHP-файла и нескольких кликов в админке. Руководство написано для WordPress 6.x и PHP 7.4 и новее.
Что нужно иметь до начала
- Сайт на WordPress 6.x и права администратора. Версию PHP покажет раздел Инструменты → Здоровье сайта → Информация.
- Доступ к файлам по SFTP или через файловый менеджер хостинга: нужно положить один файл в
wp-content/plugins/. - Список клиентов: логин и email каждого.
Сразу о границах. Способ закрывает страницы сайта, и все вошедшие клиенты видят один и тот же раздел. Отдельная страница для каждого клиента здесь не рассматривается. Кроме того, файлы из медиабиблиотеки открываются по прямой ссылке без входа, а текст опубликованных страниц отдаёт REST API по адресу /wp-json/wp/v2/pages. Для прайса партнёрам или инструкций этого достаточно. Для договоров и счетов с персональными данными нет.
Закрыть страницу и закрыть данные - не одно и то же. Редирект прячет адрес от гостя, но не прячет файлы, которые лежат рядом.
Что куда вписать
| Где | Поле | Значение |
|---|---|---|
| Страницы → Добавить | Заголовок | Клиентам |
| Страницы → Добавить | Слаг [1] | klientam, латиницей |
| Дочерняя страница | Родитель | Клиентам |
| Пользователи → Добавить нового | Имя пользователя | латиница, например ivanov-company |
| Пользователи → Добавить нового | Роль | Подписчик |
| Пользователи → Добавить нового | Пароль | сгенерированный WordPress |
| Настройки → Общие | Членство | флажок «Любой может зарегистрироваться» снят |
| Файл плагина | CAG_PARENT_SLUG | klientam, тот же слаг, что у страницы |
Пошаговая инструкция
Закройте самостоятельную регистрацию. Откройте Настройки → Общие, найдите пункт «Членство» и снимите флажок «Любой может зарегистрироваться». Иначе любой посетитель сам станет «клиентом» и получит доступ к разделу.
Проверка: после сохранения флажок остался снятым, а на странице входа нет ссылки «Регистрация».
Создайте страницы раздела. Сделайте страницу «Клиентам» и опубликуйте её. WordPress предложит слаг кириллицей, поменяйте его на
klientam. Затем создайте одну-две дочерние страницы и выберите родителем «Клиентам». Код ниже проверяет родителя и всех его потомков, поэтому новые страницы раздела закрываются сами.Проверка: в списке страниц дочерняя помечена тире перед названием, а её адрес содержит
/klientam/.Создайте файл плагина. Сохраните код ниже как
client-area-gate.phpи загрузите вwp-content/plugins/. Плагин переживёт смену темы, а код вfunctions.phpпри смене темы пропадёт.<?php /** * Plugin Name: Client Area Gate * Description: Закрывает страницу «Клиентам» и её дочерние страницы от гостей. * Version: 1.0.0 */ // Запрет прямого вызова файла в обход WordPress. if ( ! defined( 'ABSPATH' ) ) { exit; } // Слаг родительской страницы раздела. Должен совпадать со слагом в админке. define( 'CAG_PARENT_SLUG', 'klientam' ); add_action( 'template_redirect', 'cag_protect_client_area' ); function cag_protect_client_area() { // Интересуют только отдельные страницы и только гости. if ( ! is_page() || is_user_logged_in() ) { return; } $parent = get_page_by_path( CAG_PARENT_SLUG ); if ( ! $parent ) { return; } // Текущая страница: сам раздел или один из его потомков? $current_id = get_queried_object_id(); $in_area = ( $current_id == $parent->ID ) || in_array( $parent->ID, get_post_ancestors( $current_id ) ); if ( ! $in_area ) { return; } // После входа клиент вернётся на ту страницу, которую открывал. wp_safe_redirect( wp_login_url( get_permalink( $current_id ) ) ); exit; }Проверка: в разделе Плагины → Установленные появился «Client Area Gate» с описанием.
Активируйте плагин. Нажмите «Активировать» в строке плагина.
Проверка: вместо «Активировать» появилась ссылка «Деактивировать», красного сообщения об ошибке нет.
Заведите клиента. Пользователи → Добавить нового, значения из таблицы выше. Роль «Подписчик» даёт минимум прав: в админке такой пользователь видит только свой профиль.
Проверка: в списке пользователей клиент отображается с ролью «Подписчик».
Проверьте как гость. Откройте приватное окно браузера и адрес
https://ВАШ-САЙТ/klientam/. Под администратором проверять бесполезно: вы вошли в систему, и редирект для вас не сработает.Проверка: откроется
wp-login.php, а в адресной строке будет параметрredirect_to. После ввода логина и пароля клиента откроется страница «Клиентам», а не профиль и не админка.
Если не получилось
- Гость видит содержимое, редиректа нет. Проверьте, что плагин активен, слаг в коде совпадает со слагом страницы и вы смотрите из приватного окна. Если всё верно, дело в кеше: исключите раздел из кеша страниц.
- ERR_TOO_MANY_REDIRECTS («страница перенаправила вас слишком много раз»). Скорее всего, собственная страница входа оказалась дочерней к «Клиентам», и гость зацикливается. Вынесите её из раздела.
- PHP Fatal error: Cannot redeclare cag_protect_client_area(). Функция объявлена дважды, например код вставили и в плагин, и в
functions.php. Оставьте один вариант. - Клиент вошёл, но видит 404. Страница в статусе «Личное» (Private). Такие страницы видят только редакторы и администраторы. Поставьте видимость «Опубликовано».
- Письмо с паролем не пришло. Почта с WordPress часто попадает в спам. Передайте пароль другим каналом или попросите клиента нажать «Забыли пароль?» на странице входа.
Что делать дальше
- Откройте в приватном окне
/wp-json/wp/v2/pagesи ссылку на любой файл из раздела. Так вы увидите, что видно гостю в обход редиректа. Закрытие файлов - отдельная тема. - Добавьте «Клиентам» в меню: Внешний вид → Меню. Гость, нажав на пункт, попадёт на вход.
- Раз в квартал фильтруйте Пользователи по роли «Подписчик» и удаляйте тех, кто перестал быть клиентом.
- Свою форму входа и скрытие админ-панели для клиентов делайте отдельным шагом, здесь они не затронуты.
[1] Слаг (slug) - последняя часть адреса страницы. В адресе https://example.com/klientam/ это klientam. Для кириллического заголовка WordPress предлагает кириллический слаг, поэтому его лучше задать вручную латиницей.
Транскрибатор встреч: Запись созвона или диктофона — в текст с разделением по спикерам, протоколом и списком задач.
Спросить за 25 ₽Источники: WordPress Developer Resources: хук template_redirect, WordPress Developer Resources: функция wp_login_url()
Частые вопросы
А если у меня другая версия WordPress или PHP?
Не сработало: что проверить в первую очередь?
Можно ли обойтись встроенной защитой паролем?
Почему не подходит видимость «Личное»?
Что учесть на проде с кешированием?
Какую роль выдавать клиентам?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.