
📝 WP-Recall: konfigurujemy publikację prywatnych wpisów przez użytkowników
Użytkownicy wypełnili formularz w panelu klienta, kliknęli „Wyślij" i zgłoszenie trafiło na ogólną listę w serwisie. Razem z numerem telefonu, adresem i danymi paszportowymi.
Tak się dzieje, gdy niestandardowy typ wpisu jest skonfigurowany jako publiczny. WordPress domyślnie pokazuje wszystko, co utworzono z 'public' => true, niezależnie od tego, czy opublikował to administrator, czy odwiedzający przez formularz frontendowy WP-Recall.
Poniżej konfiguracja krok po kroku: tworzymy niestandardowy typ wpisu, przypisujemy mu status prywatny podczas publikacji i ustawiamy przekierowanie z powrotem do panelu klienta. Bez drogich wtyczek-kombajnów: WP-Recall, MB Custom Post Type i trzy funkcje w functions.php.
💡 Szybki przegląd:
- Instalujemy WP-Recall i MB Custom Post Type, dwie darmowe wtyczki z katalogu WordPress.org.
- Tworzymy niestandardowy typ wpisu przez interfejs MB Custom Post Type, bez ani jednej linii kodu.
- Dodajemy trzy funkcje w
functions.php: rejestracja CPT kodem (opcjonalnie), przekierowanie po publikacji i automatyczna zmiana statusu wpisu naprivate. - Sprawdzamy: użytkownik publikuje zgłoszenie z panelu klienta, nie jest ono widoczne dla nikogo poza administratorem i redaktorem.
Krok 1: Instalujemy WP-Recall i MB Custom Post Type
Do działania potrzebne będą dwie wtyczki. Obie są darmowe i dostępne w oficjalnym katalogu WordPress.org.
WP-Recall tworzy panel klienta: rejestracja, profil, prywatne wiadomości i, co ważne dla naszego zadania, publikacja wpisów z frontendu. Użytkownik wchodzi do swojego panelu, wypełnia formularz i wysyła zgłoszenie. Żadnego panelu administracyjnego, wszystko odbywa się na stronach serwisu.
MB Custom Post Types & Custom Taxonomies, rozszerzenie wtyczki Meta Box. Daje wizualny interfejs do tworzenia niestandardowych typów wpisów i taksonomii. W chwili pisania tego tekstu wtyczka ma 10 000+ aktywnych instalacji i ocenę 4,7 na WordPress.org. Jest regularnie aktualizowana, ostatnia wersja ukazała się w czerwcu 2026.
Obie wtyczki instaluje się standardowo: Wtyczki → Dodaj nową, wyszukiwanie po nazwie, „Zainstaluj" → „Włącz".
Krok 2: Tworzymy niestandardowy typ wpisu przez interfejs MB Custom Post Type
Po aktywacji wtyczki w panelu administracyjnym pojawi się menu Meta Box → Post Types. Klikamy „Add New" i wypełniamy pola:

Podstawowe ustawienia, które warto od razu skonfigurować:
- Post type ID, nazwa systemowa zapisana alfabetem łacińskim, na przykład
claimlubuser_request. To właśnie ten slug będzie występował w adresie URL i kodzie. - Labels, wtyczka sama podstawi polskie etykiety, jeśli w polu Singular Name wpiszesz nazwę w języku polskim. Ręcznie popraw to, co nie będzie pasować.
- Supports, zaznacz
title,editoricustom-fields. Miniatura i komentarze w przypadku zgłoszeń zwykle nie są potrzebne. - Exclude from search, włącz. Wpisy użytkowników nie powinny być indeksowane.
- Public,
true(formularz WP-Recall musi widzieć typ wpisu). Prywatność zamkniemy kodem w kroku 4.
Klikamy „Save", niestandardowy typ wpisu jest zarejestrowany. Ten sam rezultat można uzyskać kodem (alternatywa dla tych, którzy wolą 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' );
Dodaj ten kod do functions.php motywu potomnego lub przez wtyczkę Code Snippets. Po zapisaniu wejdź do panelu administracyjnego, w bocznym menu pojawi się sekcja „Zgłoszenia".
Krok 3: Konfigurujemy przekierowanie po publikacji
Domyślnie WP-Recall po wysłaniu wpisu pokazuje użytkownikowi sam wpis. W przypadku zgłoszeń to bezcelowe, użytkownik potrzebuje panelu klienta, a nie strony z właśnie wysłanym formularzem.
Poniższa funkcja przechwytuje hook update_post_rcl (zdarzenie WP-Recall po publikacji) i przekierowuje użytkownika z powrotem do sekcji jego zgłoszeń:
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' );
Tutaj get_current_user_id() jest wywoływane wewnątrz funkcji, w przeciwieństwie do powszechnego wzorca ze zmienną z zewnątrz, jest to niezawodne przy dowolnej kolejności ładowania plików. Ścieżkę /account/ zamień na adres URL panelu klienta w Twojej instalacji WP-Recall.
Sprawdź: zaloguj się jako użytkownik testowy, opublikuj wpis z panelu, przeglądarka powinna wrócić na stronę z listą zgłoszeń.
Krok 4: Automatycznie czynimy wpis prywatnym
To kluczowy krok. Nawet jeśli niestandardowy typ wpisu jest ukryty przed wyszukiwaniem, sam wpis z post_status = 'publish' jest dostępny przez bezpośredni link. A sposobów na poznanie tego linku jest wystarczająco dużo: od kanałów RSS po REST API wp-json.
Hook transition_post_status uruchamia się przy każdej zmianie statusu wpisu. Wyłapujemy moment, gdy status zmienia się na publish, i wymuszamy ustawienie 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 );

Co tu się dzieje linijka po linijce:
transition_post_status, hook WordPressa, który jest wywoływany przy każdym przejściu wpisu z jednego statusu w inny.- Pierwszy warunek sprawdza
post_type, aby nie naruszyć zwykłych postów i stron. - Drugi warunek wyłapuje dokładnie moment publikacji (
publish), a nie cofnięcia publikacji. - Trzeci warunek (
$old_status !== $new_status) wyklucza ponowne uruchomienie, gdywp_update_postsam wywołuje ten sam hook.
Koniecznie zamień 'user_claim' na ID Twojego niestandardowego typu wpisu. Jeśli nie masz pewności co do ID, sprawdź je w pasku adresu podczas edycji typu wpisu w Meta Box → Post Types.
Powyższe wideo, szczegółowa analiza tworzenia niestandardowych typów wpisów w WordPressie: od teorii do działającego kodu na ekranie. Jeśli wolisz format wizualny, autor pokazuje każdy krok z wyjaśnieniem argumentów register_post_type().
⁉️🤔 Często zadawane pytania
Po co w ogóle status prywatny, skoro wpis jest wykluczony z wyszukiwania?
Wykluczenie z wyszukiwania (
exclude_from_search) usuwa wpis tylko z wynikówWP_Queryna frontendzie. Bezpośredni adres URL, REST API i kanały RSS nadal udostępniają treść. Statusprivatezamyka dostęp na poziomie rdzenia WordPressa, wpis widzą tylko użytkownicy z uprawnieniemread_private_posts(administratorzy i redaktorzy).
Czy użytkownik może zmienić status wpisu po publikacji?
Przez standardowy interfejs WP-Recall, nie. Formularz frontendowy nie daje dostępu do wyboru statusu. Ale jeśli użytkownik w jakiś sposób uzyska dostęp do panelu administracyjnego (rola Autor i wyższa), będzie mógł edytować swoje wpisy. Dlatego w serwisach przyjmujących zgłoszenia nie nadawaj użytkownikom roli wyższej niż Subskrybent.
Co zrobić, jeśli WP-Recall nie widzi mojego niestandardowego typu wpisu?
Sprawdź dwa parametry w ustawieniach typu wpisu:
publicmusi byćtrue, ashow_uitrue. Następnie wejdź w ustawienia WP-Recall → „Publikacja" i upewnij się, że Twój typ wpisu jest zaznaczony na liście dozwolonych. Po zmianie ustawień wyczyść cache bezpośrednich odnośników: Ustawienia → Bezpośrednie odnośniki → Zapisz zmiany.
Czy koniecznie trzeba używać właśnie MB Custom Post Type?
Nie. Sprawdzi się każdy sposób rejestracji niestandardowego typu wpisu: kod w
functions.php(jak w kroku 2), wtyczka Custom Post Type UI lub ACF. MB Custom Post Type został wybrany ze względu na połączenie interfejsu wizualnego i zerowej ceny. Jeśli już korzystasz z ACF Pro, twórz typy wpisów w nim, logika się nie zmienia.
Kod działa, ale stare wpisy pozostały publiczne, jak je ukryć?
Funkcja z kroku 4 uruchamia się tylko podczas zdarzenia publikacji. Istniejące wpisy trzeba przetworzyć osobno. Najbezpieczniejszy sposób to wejść do panelu administracyjnego, wybrać wszystkie wpisy danego typu i przez Szybką edycję zmienić status na Prywatny. Dla setek wpisów użyj WP-CLI:
wp post list --post_type=user_claim --format=ids | xargs -I {} wp post update {} --post_status=private. Przed masową aktualizacją wykonaj kopię zapasową bazy danych.
To podejście działa na dziesiątkach serwisów: użytkownicy wysyłają zgłoszenia przez panel klienta, a administratorzy widzą je w panelu administracyjnym. Dla typowego połączenia „WP-Recall + prywatne wpisy" nic więcej nie jest potrzebne.
Jeśli zamierzasz przyjmować przez niestandardowy typ wpisu dane płatnicze lub skany paszportów, dodatkowo skonfiguruj SSL i szyfrowanie pól. Ale to już temat na osobny materiał.
Co wyszło: lista kontrolna do wdrożenia
- WP-Recall i MB Custom Post Type są zainstalowane i aktywowane.
- Niestandardowy typ wpisu jest utworzony, przez interfejs wtyczki lub kodem.
- W ustawieniach WP-Recall → „Publikacja" wymagany typ wpisu jest zaznaczony.
- Funkcja przekierowania z kroku 3 jest dodana do
functions.php. - Funkcja statusu prywatnego z kroku 4 jest dodana,
post_typezamieniony na Twój. - Bezpośrednie odnośniki są zresetowane: Ustawienia → Bezpośrednie odnośniki → Zapisz zmiany.
- Użytkownik testowy wysłał zgłoszenie z panelu klienta, przekierowanie działa, wpis jest prywatny.
Jedno uruchomienie testowego zgłoszenia oszczędza godzinę analizowania „dlaczego nie działa" na produkcji. Nie pomijaj tego kroku.
Zacznij od instalacji MB Custom Post Type, wizualny konstruktor oszczędzi Ci kłopotu z argumentami register_post_type(). A jeśli już używasz innego konstruktora typów wpisów (ACF, CPT UI), weź tylko funkcje z kroków 3 i 4: przekierowanie i status prywatny działają niezależnie od sposobu rejestracji CPT.
A w jaki sposób przyjmują Państwo zgłoszenia od użytkowników na swoich serwisach WordPress? Proszę podzielić się w komentarzach, ciekawie jest porównać podejścia.



