Skip to content

Всё для WordPress, веб-разработки — и не только

📝 WP-Recall: настраиваем публикацию приватных записей пользователями

📝 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» и заполняем поля:

Интерфейс создания кастомного типа записи в плагине MB Custom Post Types

Основные настройки, которые стоит задать сразу:

  • 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):

1function 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}
19add_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 */
5function sdstudio_redirect_after_rcl_publish() {
6 $user_id = get_current_user_id();
7 wp_redirect( '/account/?user=' . $user_id . '&tab=publics' );
8 exit;
9}
10add_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 */
6function 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}
14add_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-сайтах? Делитесь в комментариях, интересно сравнить подходы.