Przejdź do treści

Custom Post Types - własne typy treści w WordPress

Opublikowano: 17 stycznia 2026 | Zaktualizowano: 13 czerwca 2026

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ź

Custom Post Types (CPT) to własne typy treści poza standardowymi wpisami i stronami. Tworzysz je przez:

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.

SytuacjaRozwiązanieDlaczego
Wiele realizacji z galerią i opisemCPT portfolioWłasne archiwum + pola + szablon
Profile pracownikówCPT zespolPowtarzalna struktura, lista zespołu
Oferty pracy z datą wygaśnięciaCPT rekrutacjaFiltrowanie po taksonomii, pola ACF
Pojedyncza strona KontaktStronaBrak powtarzalności
Artykuły blogoweWpisKategorie i tagi już to obsługują
Produkty sklepuWooCommerceGotowy 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.

WidokSzablon dedykowanyFallback
Archiwum (lista)archive-portfolio.phparchive.php, potem index.php
Pojedynczy wpissingle-portfolio.phpsingle.php, potem singular.php
Archiwum taksonomiitaxonomy-branza.phptaxonomy.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

CPT UI Advanced Custom Fields Pods Toolset Meta Box

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?
Nie w typowych zastosowaniach. CPT to standardowy mechanizm rdzenia WordPress, a wpisy trafiają do tej samej tabeli co zwykłe posty. Dopiero tysiące rekordów z wieloma polami ACF i złożone zapytania mogą wymagać indeksów i cache. Dla portfolio czy zespołu wpływ na wydajność jest pomijalny.
Co się stanie z treścią CPT po wyłączeniu wtyczki definiującej typ?
Treści zostają w bazie danych, ale stają się niewidoczne i nieedytowalne, bo brakuje kodu rejestrującego ich typ. Po ponownym włączeniu wtyczki lub zdefiniowaniu CPT w kodzie wszystko wraca. Dlatego definicje typów warto trzymać w dedykowanej wtyczce funkcjonalnej, nie tylko w narzędziu typu CPT UI.
Dlaczego pojedyncze wpisy CPT zwracają błąd 404?
To niemal zawsze brak odświeżenia reguł przepisywania adresów. Po utworzeniu nowego typu treści wejdź w Ustawienia, Bezpośrednie odnośniki i kliknij Zapisz zmiany. Przy rejestracji kodem reguły odświeża się jednorazowo przy aktywacji wtyczki, a nie na każdym żądaniu.
CPT UI czy register_post_type w kodzie?
CPT UI jest szybsze i nie wymaga PHP, ale wiąże strukturę z wtyczką. Kod w dedykowanej wtyczce daje pełną kontrolę, przenośność i bezpieczeństwo przy zmianie motywu. Dobry kompromis to złożyć typ w CPT UI, wyeksportować go do kodu PHP i przenieść do własnej wtyczki funkcjonalnej.
Czym różni się custom post type od custom taxonomy?
Custom post type to sam typ treści (np. Realizacje), czyli rekordy, które tworzysz i edytujesz. Custom taxonomy to system ich klasyfikacji (np. Branże, Technologie), działający jak kategorie i tagi dla wpisów. Jeden CPT może mieć wiele taksonomii, hierarchicznych lub płaskich.
#wordpress#custom-post-types#cpt#acf#zaawansowane
Zdjęcie autora: Krzysztof Czapnik
O autorze

Krzysztof Czapnik

Founder & Technical Lead, KC Mobile

18 lat WordPress + 12 lat WooCommerce. Specjalizuję się w technicznej stronie e-commerce: automatyzacje WooCommerce, Google Ads dla SMB, migracje sklepów i optymalizacja konwersji.

Potrzebujesz pomocy z tym tematem? Napisz – odpowiem osobiście w 24h.

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 →

Bezpłatna wycena