Custom Post Types, czyli Własne Typy Wpisów i jak je zrobić

WordPress nie kończy się tylko na tworzeniu stron i wpisów tak, jak rodzaje drinków nie kończą się na Mojito i Cuba Libre. Poznaj Własne Typy Wpisów.
custom post types

Custom Post Types, czyli Własne Typy Wpisów, to coś, czego nauczyłem się dość późno – po 7 latach pracy z WordPressem. I pokochałem, jak dziecko czipsy. Z tą różnicą, że od tego tyłek mi nie urośnie.

Czym są Custom Post Types?

WordPress posiada 3 główne typy wpisów: Strony, Wpisy i Własne Typy Wpisów. Na nich właśnie opiera się m.in. WooCommerce – wtyczka zmieniająca WordPress w sklep online. Ale Custom Post Types przydadzą się również, gdy np. chcesz na swojej stronie stworzyć Portfolio. I właśnie na takim przykładzie pokażę Ci, jak to zrobić.

Dodaj do pliku functions.php w swoim motywie potomnym:

/* --- WŁASNE PORTFOLIO --- */

function portfolio_post_type() {
    $labels = array(
        'name'                => 'Portfolio',
        'singular_name'       => 'Projekt',
        'menu_name'           => 'Portfolio',
        'all_items'           => 'Wszystkie projekty',
        'view_item'           => 'Zobacz projekt',
        'add_new_item'        => 'Dodaj nowy projekt',
        'add_new'             => 'Dodaj projekt',
        'edit_item'           => 'Edytuj projekt',
        'update_item'         => 'Aktualizuj',
        'search_items'        => 'Szukaj projektu',
        'not_found'           => 'Nie znaleziono',
        'not_found_in_trash'  => 'Nie znaleziono'
    ); 
    $args = array(
        'label' => 'portfolio',
        'rewrite' => array(
            'slug' => 'portfolio'
        ),
        'description'         => 'DESCRIPTION',
        'labels'              => $labels,
        'supports'            => array( 'title', 'editor', 'thumbnail'),
        'taxonomies'          => array(),
        'hierarchical'        => false,
        'public'              => true, 
        'show_ui'             => true,
        'show_in_menu'        => true,
        'show_in_nav_menus'   => true,
        'show_in_admin_bar'   => true,
        'menu_position'       => null,
        'menu_icon'           => 'dashicons-id-alt',
        'can_export'          => true,
        'has_archive'         => true,
        'exclude_from_search' => false,
        'publicly_queryable'  => true,
        'capability_type'     => 'post',
    );
    register_post_type( 'portfolio', $args );
} 
add_action( 'init', 'portfolio_post_type', 0 );

Tu wypada załączyć krótką legendę:

  • 'name' – to tytuł widoczny w Kokpicie w widoku wszystkich wpisów oraz w Menu.
  • 'singular_name' – tytuł widoczny w górnym pasku, pod „+Dodaj” .
  • 'menu_name' – to tytuł zakładki, widoczny w panelu bocznym Kokpitu.
  • 'add_new' – przycisk przy tytule we wszystkich wpisach.
  • 'all_items' – tytuł widoczny pod tytułem zakładki, odpowiadający wszystkim wpisom.
  • 'view_item' – link widoczny w górnym pasku obok „+Dodaj”.
  • 'edit_item' – etykieta edycji Wpisu.
  • 'search_items' – treść przycisku wyszukiwania na stronie wszystkich wpisów.
  • 'not_found''not_found_in_trash' – treść po wyszukiwaniu
  • 'label' – nazwa rodzaju posta pokazana w menu, zwykle w liczbie mnogiej.
  • 'rewrite' – wyzwala obsługę przepisywania linku dla tego typu postu. Domyślnie true, używając 'post_type' jako przyjaznego linku.
  • 'description' – krótkie opisowe streszczenie typu postu.
  • 'supports' – podstawowe funkcje obsługiwane przez typ postu. Może przyjmować wartości:
    • 'title' – tytuł
    • 'editor' – edytor tekstu
    • 'author' – autora
    • 'thumbnail' – miniaturę wpisu
    • 'excerpt' – wypis
    • 'trackbacks' – trackbacki, czyli wymiana informacji o linkach pomiędzy blogami
    • 'custom-fields' – własne pola
    • 'comments' – komentarze
    • 'revisions' – poprzednie wersje wpisów
    • 'page-attributes' – atrybuty wpisu (szablony i kolejność w menu), hierarchia musi być włączona
    • 'post-formats' – formaty wpisów
  • 'taxonomies' – tablica identyfikatorów taksonomii, które zostaną zarejestrowane dla typu postu. Taksonomie można zarejestrować później za pomocą register_taxonomy () lub register_taxonomy_for_object_type ().
  • 'hierarchical' – określa, czy typ wpisu jest hierarchiczny. Domyślnie false.
  • 'public' – określa, czy typ wpisu jest przeznaczony do publicznego użytku za pośrednictwem interfejsu administratora lub przez użytkowników front-endu. Chociaż domyślne ustawienia 'exclude_from_search', 'public__queryable', 'show_ui''show_in_nav_menus' są dziedziczone z 'public', każde z nich nie opiera się na tej relacji i kontroluje bardzo konkretną intencję. Domyślnie false.
  • 'show_ui' – określa, czy ma być generowany interfejs użytkownika do zarządzania tym typem postu w Kokpicie. Domyślna wartość jest taka, jak 'public'.
  • 'show_in_menu' – określa, gdzie wyświetlić typ wpisu w pasku bocznym Kokpitu. Aby zadziałało, 'show_ui' musi być true. Wartość domyślna jest taka sama jak 'show_ui'.
  • 'show_in_nav_menus' – udostępnia ten typ posta do wyboru w menu nawigacyjnym. Domyślna wartość jest taka, jaka jest w 'public'.
  • 'show_in_admin_bar' – udostępnia ten typ posta za pośrednictwem paska administratora. Wartość domyślna jest taka jak 'show_in_menu'.
  • 'menu_position' – określa pozycję w w pasku bocznym Kokpitu, w jakiej powinien się pojawić typ postu. Aby działać, 'show_in_menu' musi być true. Domyślnie null (na końcu).
  • 'menu_icon' – adres URL ikony używanej w tym menu. Możesz użyć pliku SVG , zachowując wymiary 20×20 px, albo wstawić nazwę ikony ze strony https://developer.wordpress.org/resource/dashicons/. Wstaw none, aby pozostawić puste. Domyślnie używana jest ikona postów.
  • 'can_export' – określa, czy ma być możliwy eksport wpisów. Domyślnie true.
  • 'has_archive' – określa, czy ma być dostępne archiwum postów. Domyślnie false.
  • 'exclude_from_search' – określa, czy posty tego typu mają być wykluczane z wyników wyszukiwania front-endu. Wartość domyślna to przeciwna wartość 'public'.
  • 'capability_type' – ciąg używany do budowania możliwości odczytu, edycji i usuwania. Domyślnie 'post'.

Kategorie w Custom Post Types

Jeszcze jedna rzecz. Jeśli chcesz zdefiniować kategorie Własnych Typów Wpisów nie możesz ich zdefiniować za pomocą 'taxonomies' => array( 'category' ), ponieważ wtedy będziesz mieć wspólne kategorie zarówno dla Custom Post Types, jak i dla zwykłych Wpisów. Dlatego musisz dodać jeszcze:

/* --- WŁASNE KATEGORIE PORTFOLIO --- */

add_action( 'init', 'portfolio_tax' );

function portfolio_tax() {
 register_taxonomy(
  'kategorie-projektow',
  'portfolio',
  array(
   'label' => __( 'Kategorie projektów' ),
   'rewrite' => array( 'slug' => 'kategorie' ),
   'hierarchical' => true,
  )
 );
}