
📝 WP-Recall: настраиваем публикацию приватных записей пользователями
Пользователи заполнили форму в личном кабинете, нажали «Отправить», и заявка ушла в общую ленту сайта. Вместе с телефоном, адресом и паспортными данными.
Такое случается, когда кастомный тип записи настроен как публичный. WordPress по умолчанию показывает всё, что создано с 'public' => true, неважно, админ это опубликовал или посетитель через фронтенд-форму WP-Recall.
Ниже, пошаговая настройка: создаём кастомный тип записи, вешаем на него приватный статус при публикации и настраиваем редирект обратно в личный кабинет. Без дорогих плагинов-комбайнов: WP-Recall, MB Custom Post Type и три функции в functions.php.
💡 Быстрый обзор:
- Устанавливаем WP-Recall и MB Custom Post Type, два бесплатных плагина из каталога WordPress.org.
- Создаём кастомный тип записи через интерфейс MB Custom Post Type, без единой строки кода.
- Прописываем три функции в
functions.php: регистрация CPT кодом (опционально), редирект после публикации и автоматический перевод записи в статусprivate. - Проверяем: пользователь публикует заявку из личного кабинета, она не видна никому кроме администратора и редактора.
Шаг 1: Устанавливаем WP-Recall и MB Custom Post Type
Для работы понадобятся два плагина. Оба бесплатны и доступны в официальном каталоге WordPress.org.
WP-Recall формирует личный кабинет пользователя: регистрация, профиль, личные сообщения и, что важно для нашей задачи, публикация записей с фронтенда. Пользователь заходит в свой кабинет, заполняет форму и отправляет заявку. Никакой админки, всё происходит на страницах сайта.
MB Custom Post Types & Custom Taxonomies, расширение плагина Meta Box. Даёт визуальный интерфейс для создания кастомных типов записей и таксономий. На момент написания у плагина 10 000+ активных установок и рейтинг 4,7 на WordPress.org. Обновляется регулярно, последняя версия вышла в июне 2026.
Оба плагина устанавливаются стандартно: Plugins → Add New, поиск по названию, «Install» → «Activate».
Шаг 2: Создаём кастомный тип записи через интерфейс MB Custom Post Type
После активации плагина в админке появляется меню Meta Box → Post Types. Нажимаем «Add New» и заполняем поля:

Основные настройки, которые стоит задать сразу:
- Post type ID, системное имя латиницей, например
claimилиuser_request. Именно этот slug будет фигурировать в URL и коде. - Labels, плагин сам подставит русские метки, если в поле Singular Name ввести название на русском. Отредактируйте вручную то, что не устроит.
- Supports, отметьте
title,editorиcustom-fields. Thumbnail и комментарии для заявок обычно не нужны. - Exclude from search, включите. Записи пользователей не должны индексироваться.
- Public,
true(форма WP-Recall должна видеть тип записи). Приватность разрулим кодом на шаге 4.
Нажимаем «Save», кастомный тип записи зарегистрирован. Тот же результат можно получить кодом (альтернатива для тех, кто предпочитает functions.php):
1 function sdstudio_register_private_cpt() { 2 $args = array( 3 'label' => 'Заявки', 4 'public' => true, 5 'exclude_from_search' => true, 6 'publicly_queryable' => true, 7 'show_ui' => true, 8 'show_in_rest' => false, 9 'menu_icon' => 'dashicons-lock', 10 'capability_type' => 'post', 11 'hierarchical' => false, 12 'has_archive' => false, 13 'supports' => array( 'title', 'editor', 'author', 'custom-fields' ), 14 'rewrite' => array( 'slug' => 'claims' ), 15 ); 16 17 register_post_type( 'user_claim', $args ); 18 } 19 add_action( 'init', 'sdstudio_register_private_cpt' );
Добавьте этот код в functions.php дочерней темы или через плагин Code Snippets. После сохранения зайдите в админку, в боковом меню появится раздел «Заявки».
Шаг 3: Настраиваем редирект после публикации
По умолчанию WP-Recall после отправки записи показывает пользователю саму запись. Для заявок это бессмысленно, человеку нужен личный кабинет, а не страница с только что отправленной формой.
Функция ниже перехватывает хук update_post_rcl (событие WP-Recall после публикации) и перенаправляет пользователя обратно в раздел его заявок:
1 /** 2 * Редирект в личный кабинет после публикации записи через WP-Recall. 3 * Добавьте в functions.php дочерней темы. 4 */ 5 function sdstudio_redirect_after_rcl_publish() { 6 $user_id = get_current_user_id(); 7 wp_redirect( '/account/?user=' . $user_id . '&tab=publics' ); 8 exit; 9 } 10 add_action( 'update_post_rcl', 'sdstudio_redirect_after_rcl_publish' );
Здесь get_current_user_id() вызывается внутри функции, в отличие от распространённого шаблона с переменной снаружи, это надёжно при любом порядке загрузки файлов. Путь /account/ замените на URL личного кабинета в вашей установке WP-Recall.
Проверьте: зайдите под тестовым пользователем, опубликуйте запись из кабинета, браузер должен вернуться на страницу со списком заявок.
Шаг 4: Автоматически делаем запись приватной
Это ключевой шаг. Даже если кастомный тип записи скрыт из поиска, сама запись с post_status = 'publish' доступна по прямой ссылке. А способов узнать эту ссылку достаточно: от RSS-фидов до wp-json REST API.
Хук transition_post_status срабатывает при любом изменении статуса записи. Ловим момент, когда статус меняется на publish, и принудительно ставим private:
1 /** 2 * Автоматически делает запись приватной при публикации. 3 * Проверяет, что это наш кастомный тип записи — user_claim. 4 * Источник подхода: https://stackoverflow.com/questions/54508808/ 5 */ 6 function sdstudio_force_private_status( $new_status, $old_status, $post ) { 7 if ( 'user_claim' === $post->post_type 8 && 'publish' === $new_status 9 && $old_status !== $new_status ) { 10 $post->post_status = 'private'; 11 wp_update_post( $post ); 12 } 13 } 14 add_action( 'transition_post_status', 'sdstudio_force_private_status', 10, 3 );

Что здесь происходит построчно:
transition_post_status, хук WordPress, который вызывается при каждом переходе записи из одного статуса в другой.- Первое условие проверяет
post_type, чтобы не задеть обычные посты и страницы. - Второе условие ловит именно момент публикации (
publish), а не снятие с публикации. - Третье условие (
$old_status !== $new_status) исключает повторное срабатывание, когдаwp_update_postсам вызывает этот же хук.
Обязательно замените 'user_claim' на ID вашего кастомного типа записи. Не уверены в ID, посмотрите его в адресной строке при редактировании типа записи в Meta Box → Post Types.
Видео выше, детальный разбор создания кастомных типов записей в WordPress: от теории до рабочего кода на экране. Если предпочитаете визуальный формат, автор показывает каждый шаг с пояснением аргументов register_post_type().
⁉️🤔 Частые вопросы
Зачем вообще приватный статус, если запись исключена из поиска?
Исключение из поиска (
exclude_from_search) убирает запись только из результатовWP_Queryна фронтенде. Прямой URL, REST API и RSS-фиды по-прежнему отдают содержимое. Статусprivateзакрывает доступ на уровне ядра WordPress, запись видят только пользователи с правомread_private_posts(администраторы и редакторы).
Пользователь может изменить статус записи после публикации?
Через стандартный интерфейс WP-Recall, нет. Фронтенд-форма не даёт доступа к выбору статуса. Но если пользователь каким-то образом получит доступ к админке (роль Author и выше), он сможет редактировать свои записи. Поэтому для сайтов с приёмом заявок не давайте пользователям роль выше Subscriber.
Что делать, если WP-Recall не видит мой кастомный тип записи?
Проверьте два параметра в настройках типа записи:
publicдолжен бытьtrue, аshow_ui,true. Затем зайдите в настройки WP-Recall → «Публикация» и убедитесь, что ваш тип записи отмечен галочкой в списке разрешённых. После изменения настроек сбросьте кэш permalinks: Settings → Permalinks → Save Changes.
Обязательно использовать именно MB Custom Post Type?
Нет. Подойдёт любой способ регистрации кастомного типа записи: код в
functions.php(как в шаге 2), плагин Custom Post Type UI или ACF. MB Custom Post Type выбран за сочетание визуального интерфейса и нулевой цены. Если вы уже пользуетесь ACF Pro, создавайте типы записей в нём, логика не меняется.
Код работает, но старые записи остались публичными, как их спрятать?
Функция из шага 4 срабатывает только при событии публикации. Существующие записи нужно обработать отдельно. Самый безопасный способ, зайти в админку, выбрать все записи нужного типа и через Quick Edit сменить статус на Private. Для сотен записей используйте WP-CLI:
wp post list --post_type=user_claim --format=ids | xargs -I {} wp post update {} --post_status=private. Перед массовым обновлением сделайте бэкап базы данных.
Этот подход работает на десятках сайтов: пользователи отправляют заявки через личный кабинет, а администраторы видят их в админке. Для типовой связки «WP-Recall + приватные записи» больше ничего не нужно.
Если собираетесь принимать через кастомный тип записи платёжные данные или сканы паспортов, дополнительно настройте SSL и шифрование полей. Но это уже тема для отдельного материала.
Что получилось: чек-лист для запуска
- WP-Recall и MB Custom Post Type установлены и активированы.
- Кастомный тип записи создан, через интерфейс плагина или кодом.
- В настройках WP-Recall → «Публикация» нужный тип записи отмечен.
- Функция редиректа из шага 3 добавлена в
functions.php. - Функция приватного статуса из шага 4 добавлена,
post_typeзаменён на ваш. - Сброшены permalinks: Settings → Permalinks → Save Changes.
- Тестовый пользователь отправил заявку из личного кабинета, редирект работает, запись приватна.
Один запуск тестовой заявки экономит час разбора «почему не работает» на проде. Не пропускайте этот шаг.
Начните с установки MB Custom Post Type, визуальный конструктор сэкономит вам возню с аргументами register_post_type(). А если уже используете другой конструктор типов записей (ACF, CPT UI), возьмите только функции из шагов 3 и 4: редирект и приватный статус работают независимо от способа регистрации CPT.
А каким способом вы принимаете заявки от пользователей на своих WordPress-сайтах? Делитесь в комментариях, интересно сравнить подходы.



