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-сайтах? Діліться в коментарях, цікаво порівняти підходи.