WordPress domyślnie ma wpisy i strony, ale co jeśli potrzebujesz portfolio, realizacji, produktów czy wydarzeń? Custom Post Types pozwalają tworzyć własne typy treści dopasowane do Twojej strony.
Krótka odpowiedź
1) wtyczkę CPT UI (najprostsze),
2) kod w functions.php,
3) generator online. Przykłady użycia: portfolio, realizacje, zespół, wydarzenia, produkty, oferty pracy.
Usługi KC Mobile
Sprawdź naszą ofertę
Potrzebujesz pomocy specjalisty? Skorzystaj z naszych usług i rozwiń swój biznes online.
Czym są Custom Post Types i po co istnieją?
Custom Post Types (CPT) to własne typy treści, które dokładają się do dwóch domyślnych: wpisów (post) i stron (page). Technicznie WordPress traktuje je tak samo – wszystko trafia do tej samej tabeli wp_posts, różni je tylko wartość w kolumnie post_type.
Sens CPT pojawia się wtedy, gdy masz wiele rekordów o tej samej, powtarzalnej strukturze. Portfolio realizacji, zespół, oferty pracy, wydarzenia, nieruchomości – każdy taki zbiór ma własny zestaw pól, własną listę (archiwum) i własny szablon. Wciskanie tego we wpisy bloga kończy się chaosem w jednej kategorii i szablonem, który próbuje obsłużyć dwa różne światy.
W praktyce CPT to fundament modelowania treści. Zanim cokolwiek założysz, odpowiedz na jedno pytanie: czy te treści mają być przeglądane jako osobna kolekcja, z własnym adresem i wyglądem? Jeśli tak – to CPT.
Wolisz, żebyśmy zrobili to za Ciebie?
Oszczędź czas i uniknij błędów. Zostaw kontakt – wdrożymy to rozwiązanie profesjonalnie.
- Wdrożenie krok po kroku przez doświadczony zespół
- Konkretny timeline + cena dopasowana do projektu
- 18+ lat doświadczenia
Wolisz zlecić to nam? Strony internetowe od 3 000 zł – wycena w 24h →
Kiedy używać CPT, a kiedy wpisu lub strony?
Najczęstszy błąd to zakładanie CPT dla trzech rekordów albo wrzucanie 200 realizacji do wpisów. Decyzję ułatwia prosta tabela.
| Sytuacja | Rozwiązanie | Dlaczego |
|---|---|---|
| Wiele realizacji z galerią i opisem | CPT portfolio | Własne archiwum + pola + szablon |
| Profile pracowników | CPT zespol | Powtarzalna struktura, lista zespołu |
| Oferty pracy z datą wygaśnięcia | CPT rekrutacja | Filtrowanie po taksonomii, pola ACF |
| Pojedyncza strona Kontakt | Strona | Brak powtarzalności |
| Artykuły blogowe | Wpis | Kategorie i tagi już to obsługują |
| Produkty sklepu | WooCommerce | Gotowy CPT product + koszyk i płatności |
Reguła praktyczna: CPT zakładamy, gdy treści jest wiele, mają wspólny zestaw pól i wymagają osobnego sposobu wyświetlania. Jeśli WooCommerce, Easy Digital Downloads czy wtyczka eventowa dostarcza już swój typ treści – nie duplikuj go własnym CPT.
Jak utworzyć CPT bez kodowania (CPT UI)?
Najszybsza droga dla osób bez znajomości PHP to wtyczka Custom Post Type UI. Po instalacji wchodzisz w CPT UI, Add/Edit Post Types i wypełniasz pola.
Kluczowe ustawienia, na które warto zwrócić uwagę:
- Post Type Slug – identyfikator typu (np. portfolio), wyłącznie ASCII, bez polskich znaków i spacji.
- Plural / Singular Label – etykiety w panelu (np. Realizacje / Realizacja).
- Public: true – treść widoczna na froncie.
- Has Archive: true – włącza stronę listy pod adresem domena.pl/portfolio/.
- Show in REST: true – wymagane, żeby działał edytor blokowy (Gutenberg) i REST API.
- Supports – zaznacz tytuł, edytor, miniaturę (thumbnail), a często też wyciąg (excerpt).
Po zapisaniu CPT UI dorzuca nowe menu w wp-admin. Niemal zawsze trzeba potem wejść w Ustawienia, Bezpośrednie odnośniki i kliknąć Zapisz, żeby WordPress odświeżył reguły przepisywania URL – inaczej pojedyncze wpisy CPT zwracają błąd 404.
Jak zarejestrować CPT kodem (register_post_type)?
Podejście kodowe daje pełną kontrolę i jest przenośne – CPT nie znika po wyłączeniu wtyczki. Rejestrację podpinamy zawsze pod hook init.
add_action( 'init', 'kc_register_portfolio' );
function kc_register_portfolio() {
register_post_type( 'portfolio', array(
'labels' => array(
'name' => 'Realizacje',
'singular_name' => 'Realizacja',
),
'public' => true,
'has_archive' => true,
'show_in_rest' => true,
'menu_icon' => 'dashicons-portfolio',
'menu_position'=> 20,
'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt' ),
'rewrite' => array( 'slug' => 'realizacje' ),
) );
}Dwa parametry, które konkurencja często pomija. menu_icon przyjmuje nazwę z biblioteki Dashicons (np. dashicons-groups dla zespołu) i porządkuje panel. rewrite ze slugiem rozdziela identyfikator techniczny typu od adresu URL – dzięki temu typ nazywa się portfolio, a klient widzi w pasku domena.pl/realizacje/.
Najważniejsza pułapka: nie wywołuj flush_rewrite_rules() na każdym init, bo to kosztowna operacja na każdym żądaniu. Reguły odświeża się raz, przy aktywacji wtyczki (register_activation_hook), albo ręcznie zapisując permalinki.
Czym są custom taxonomies i jak je dołączyć do CPT?
Taksonomia to system klasyfikacji treści. Kategorie i tagi to wbudowane taksonomie dla wpisów – dla własnego CPT tworzysz własne. Portfolio może mieć taksonomię Branże (hierarchiczną, jak kategorie) i Technologie (płaską, jak tagi).
W CPT UI robisz to w Add/Edit Taxonomies: ustawiasz slug, wybierasz Attach to Post Type i decydujesz o Hierarchical (true = drzewo kategorii, false = lista tagów). Kodem służy do tego register_taxonomy.
add_action( 'init', 'kc_register_branze' );
function kc_register_branze() {
register_taxonomy( 'branza', 'portfolio', array(
'labels' => array( 'name' => 'Branże' ),
'hierarchical' => true,
'show_in_rest' => true,
'rewrite' => array( 'slug' => 'branza' ),
) );
}Klasyczny błąd, który widać w wielu poradnikach: rejestrowanie taksonomii w innym hooku niż typ treści albo odpytywanie jej, zanim zostanie powiązana. Bezpiecznie jest rejestrować typ i jego taksonomie w tym samym callbacku init, z taksonomią tuż po typie.
Jak wyświetlać CPT na froncie (szablony)?
WordPress dobiera szablon CPT według hierarchii plików w motywie. Wystarczy nazwać plik zgodnie ze slugiem typu, a WordPress sam go użyje.
| Widok | Szablon dedykowany | Fallback |
|---|---|---|
| Archiwum (lista) | archive-portfolio.php | archive.php, potem index.php |
| Pojedynczy wpis | single-portfolio.php | single.php, potem singular.php |
| Archiwum taksonomii | taxonomy-branza.php | taxonomy.php, potem archive.php |
Adres archiwum to domena.pl/portfolio/ (lub slug z rewrite), pojedynczy wpis to domena.pl/portfolio/nazwa-projektu/. Jeśli nie tworzysz szablonów ręcznie, page buildery rozwiązują to przez Theme Builder – w Elementorze tworzysz szablon typu Archive z warunkiem Portfolio Archive i szablon Single dla pojedynczej realizacji, zyskując pełną kontrolę nad wyglądem bez dotykania PHP.
Aby wpleść listę CPT w istniejącą stronę, użyj WP_Query z argumentem post_type równym slugowi typu albo wtyczki typu Display Posts.
Po co łączyć CPT z ACF i jak to działa?
Sam CPT daje strukturę, ale prawdziwa wartość to własne pola. Advanced Custom Fields (ACF) dokłada do typu pola takie jak data wydarzenia, link do projektu, cena, galeria czy relacja do innego wpisu – w czytelnym interfejsie zamiast surowych meta boksów.
Konfiguracja jest prosta: w ACF tworzysz grupę pól, dodajesz pola odpowiedniego typu (tekst, URL, data, obraz, relacja) i w sekcji Location ustawiasz regułę Post Type równy Twojemu CPT. Od tej chwili pola pojawiają się przy każdym wpisie tego typu.
Wyświetlanie zależy od stosu: w szablonie PHP użyjesz the_field('nazwa_pola'), w Elementorze Dynamic Tags, ACF Field, a w edytorze blokowym ACF Blocks.
Nowsze ACF Pro potrafi też rejestrować same typy treści i taksonomie z poziomu panelu, więc bywa, że jedna wtyczka zastępuje CPT UI.
Perspektywa KC Mobile: gdzie trzymać definicje CPT?
W naszych wdrożeniach najczęściej widzimy jeden problem przy przejmowaniu stron po innych wykonawcach: CPT zdefiniowany wyłącznie w CPT UI albo w pliku functions.php motywu. To kruche – zmiana motywu albo wyłączenie wtyczki sprawia, że treści wciąż siedzą w bazie, ale znikają z panelu i z frontu, bo nie ma już kodu, który rejestruje ich typ.
Dlatego definicje typów treści i taksonomii trzymamy w dedykowanej wtyczce funkcjonalnej (mu-plugin lub osobny plugin), a nie w motywie. Motyw odpowiada za wygląd, wtyczka za logikę i strukturę danych – wtedy redesign nie pociąga za sobą utraty treści.
Praktyczny trik dla osób zaczynających od CPT UI: wtyczka ma funkcję eksportu definicji do gotowego kodu PHP (register_post_type). Można złożyć typy klikaniem, wyeksportować kod, wkleić do wtyczki funkcjonalnej i odinstalować CPT UI. To łączy wygodę klikania z trwałością kodu. Jeśli przy okazji planujesz większy projekt, takie decyzje architektoniczne warto domknąć już na etapie tworzenia stron na WordPress, zanim do bazy trafią setki rekordów w złym miejscu.
Wspomniane narzędzia
Potrzebujesz pomocy z WordPress?
Tworzymy i naprawiamy strony na WordPress. Optymalizacja prędkości, bezpieczeństwo, aktualizacje. 18+ lat doświadczenia.
Najczęściej zadawane pytania
Czy Custom Post Types spowalniają WordPress?
Co się stanie z treścią CPT po wyłączeniu wtyczki definiującej typ?
Dlaczego pojedyncze wpisy CPT zwracają błąd 404?
CPT UI czy register_post_type w kodzie?
Czym różni się custom post type od custom taxonomy?
Potrzebujesz pomocy?
Wolisz, żebyśmy zrobili to za Ciebie?
Oszczędź czas i uniknij błędów. Zostaw kontakt – wdrożymy to rozwiązanie profesjonalnie.
- Wdrożenie krok po kroku przez doświadczony zespół
- Konkretny timeline + cena dopasowana do projektu
- 18+ lat doświadczenia
Wolisz zlecić to nam? Strony internetowe od 3 000 zł – wycena w 24h →