Закрытый раздел для клиентов в WordPress: ошибки новичков
Закрытый раздел для клиентов в WordPress собирается за 20-30 минут на встроенных ролях и приватных страницах, без плагина членства. Шаги и четыре ошибки, из-за которых «закрытое» остаётся открытым.

Через 20-30 минут у вас будет раздел /klientam/, который открывается только вошедшим клиентам: гость попадает на форму входа, клиент после входа сразу видит свои страницы и не видит админку. Хватит встроенных ролей и приватных страниц WordPress, плагин членства не нужен. Новички чаще всего теряют время не на настройке, а на «закрытиях», которые только выглядят закрытыми: скрытый пункт меню, пароль на странице, опубликованная вложенная страница, файлы в медиатеке.
Что нужно до начала
- WordPress 6.x и PHP 8.x. Код использует только функции ядра. Названия пунктов админки даны по русскому интерфейсу.
- Роль администратора и доступ к файлам (SFTP или файловый менеджер хостинга): нужно положить один файл в wp-content/plugins.
- Постоянные ссылки вида «Название записи» (Настройки → Постоянные ссылки).
- Второй браузер или приватное окно. Каждый шаг ниже заканчивается проверкой, и делать её нужно именно там.
Пошаговая настройка
- Создайте плагин. Положите код ниже в файл wp-content/plugins/client-area/client-area.php и активируйте плагин в разделе «Плагины». Роль с правом read_private_pages1 нужна, чтобы клиент видел приватные страницы, а остальной код отправляет гостей на вход и убирает админку у клиентов.
Проверка: в списке плагинов есть Client Area со статусом «Активен», а в Пользователи → Добавить новую в списке ролей появился пункт «Клиент».<?php /** * Plugin Name: Client Area * Description: Роль «Клиент», редирект гостей на вход, без админки для клиентов. * Version: 1.0.0 */ if ( ! defined( 'ABSPATH' ) ) { exit; } // Слаг страницы-раздела: должен совпадать со слагом в админке. const CLIENT_AREA_SLUG = 'klientam'; // При активации создаём роль; если она уже есть, добавляем недостающее право. register_activation_hook( __FILE__, function () { $role = get_role( 'client' ); if ( null === $role ) { add_role( 'client', 'Клиент', array( 'read' => true, 'read_private_pages' => true ) ); } else { $role->add_cap( 'read_private_pages' ); } } ); // Гостя на адресе раздела отправляем на вход, а не на 404. add_action( 'template_redirect', function () { global $wp; if ( is_user_logged_in() || ! is_404() ) { return; } $path = trim( $wp->request, '/' ); if ( CLIENT_AREA_SLUG === $path || 0 === strpos( $path, CLIENT_AREA_SLUG . '/' ) ) { wp_safe_redirect( wp_login_url( home_url( '/' . $path . '/' ) ) ); exit; } } ); // После входа клиент попадает в раздел, если не шёл на другую страницу. add_filter( 'login_redirect', function ( $redirect_to, $requested, $user ) { if ( $user instanceof WP_User && in_array( 'client', (array) $user->roles, true ) && empty( $requested ) ) { return home_url( '/' . CLIENT_AREA_SLUG . '/' ); } return $redirect_to; }, 10, 3 ); // Клиентам не нужны админ-панель и верхняя полоска. Заодно они пропадут у подписчиков. add_filter( 'show_admin_bar', function ( $show ) { return current_user_can( 'edit_posts' ) ? $show : false; } ); add_action( 'admin_init', function () { if ( wp_doing_ajax() || current_user_can( 'edit_posts' ) ) { return; } wp_safe_redirect( home_url( '/' . CLIENT_AREA_SLUG . '/' ) ); exit; } ); - Создайте страницу-раздел. Страницы → Добавить новую, заголовок «Клиентам», слаг klientam, в блоке «Сводка» видимость «Приватная», затем «Опубликовать». Приватную страницу WordPress показывает только тем, у кого есть право read_private_pages, для остальных её нет ни в поиске, ни в карте сайта. Проверка: в списке страниц рядом с названием стоит «Приватная», а в приватном окне адрес /klientam/ ведёт на форму входа.
- Добавьте вложенные страницы. В блоке «Атрибуты страницы» выберите родителя «Клиентам» и до публикации поставьте видимость «Приватная». Приватность не наследуется: опубликованная вложенная страница открыта всем, даже если родитель закрыт. Проверка: у каждой страницы в списке стоит «Приватная», а в приватном окне все адреса вида /klientam/... ведут на вход.
- Заведите клиента. Пользователи → Добавить новую, роль «Клиент», пароль задайте длинный. Роль не содержит права edit_posts, поэтому админка ей недоступна. Проверка: войдите под клиентом в приватном окне. Откроется /klientam/ без верхней полоски, а /wp-admin/ вернёт вас в раздел.
- Закройте регистрацию. Настройки → Общие, снимите «Любой может зарегистрироваться». Иначе закрытый раздел защищает только та роль, которую вы не выдаёте. Проверка: на странице wp-login.php нет ссылки «Регистрация».
- Проверьте утечки как гость. Откройте /wp-json/wp/v2/pages?slug=klientam и поиск по сайту с названием страницы. Эти пути не видны в обычном браузерном сценарии, а утечки обычно там. Проверка: REST вернёт пустой список [], поиск ничего не найдёт.
Что куда вписать
| Параметр | Где | Значение |
|---|---|---|
| Слаг страницы-раздела | Страница → Постоянная ссылка | klientam (как в CLIENT_AREA_SLUG) |
| Видимость | Страница → Сводка | Приватная |
| Родитель вложенных | Страница → Атрибуты страницы | Клиентам |
| Роль пользователя | Пользователи → Добавить новую | Клиент |
| Любой может зарегистрироваться | Настройки → Общие | выключено |
Скрыть ссылку не значит закрыть страницу: адрес остаётся рабочим для всех, кто его знает.
1. Capability (право) - именованное разрешение, которое привязано к роли: например, read_private_pages разрешает читать чужие приватные страницы.
Четыре ошибки, которые оставляют раздел открытым
- Скрыли пункт меню. Страница опубликована, адрес работает и находится поиском.
- Поставили пароль на страницу. Пароль один на всех: отозвать доступ у одного клиента можно, только сменив пароль для всех.
- Опубликовали вложенную страницу. См. шаг 3: приватность родителя на неё не распространяется.
- Загрузили договоры в медиатеку. Файлы из wp-content/uploads отдаёт веб-сервер, и прямая ссылка работает у всех, кто её получил, даже если страница приватная. Защита файлов - отдельная тема, здесь её не разбираем.
Если не получилось
- Клиент после входа видит 404. Роль «Клиент» создана раньше без права read_private_pages, а add_role не меняет существующую роль. Деактивируйте плагин и активируйте снова: код допишет право. Заодно проверьте, что у пользователя выбрана именно роль «Клиент».
- «The plugin generated N characters of unexpected output during activation». Перед <?php есть пробел, пустая строка или BOM. Пересохраните файл в UTF-8 без BOM, чтобы <?php стоял в самой первой строке.
- После ввода пароля снова форма входа или «Error: Cookies are blocked or not supported by your browser». Проверьте, что в Настройки → Общие «Адрес WordPress» и «Адрес сайта» совпадают по www и https, и что браузер принимает cookies.
- Гость видит содержимое закрытой страницы. Либо у страницы статус «Опубликовано», либо ответ отдаёт кеш. Сверьте статус в списке страниц, затем сбросьте кеш на хостинге или в плагине кеширования.
Что делать дальше
- Проверьте кеш на проде: откройте раздел и гостем, и клиентом после сброса кеша. Для вошедших пользователей страницы не должны отдаваться из страничного кеша, а настройка зависит от плагина или хостинга.
- Решите вопрос с файлами до того, как клиенты начнут получать договоры и счета.
- Включите HTTPS на всём сайте, если он ещё не включён: cookie входа не должны ходить по http.
- Персональные кабинеты, где каждый клиент видит только своё, эта схема не даёт: read_private_pages открывает все приватные страницы всем клиентам. Это отдельная задача.
Дефектный акт по фото: Осмотр по фотографиям: классификация дефектов, ссылки на нормы, требования к устранению. Готовый акт в Word.
Спросить за 80 ₽Источники: WordPress Plugin Handbook: Roles and Capabilities, WordPress Code Reference: хук template_redirect
Частые вопросы
А если у меня другая версия WordPress?
А если не сработало и непонятно почему?
Чем пароль на странице хуже роли клиента?
Закрывает ли это файлы из медиатеки?
Что проверить на проде перед запуском?
Можно ли показать каждому клиенту только его документы?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.