Jak tworzyć własne typy postów w WordPressie ?

WordPress
Jak tworzyć własne typy postów w WordPressie ?

WordPress oparty jest o mechanizm postów, co jest naturalne dla platformy blogowej. Jednak gdy w wersji 3.0 pojawił się mechanizmu pozwalający deweloperom tworzyć własne typy postów pozwoliło to na bazie platformy tworzyć nie tylko blogi, ale także rozbudowane strony.

Co to są własne typy postów (custom post type)

Własne typy postów jest to pewien sposób grupowania wpisów. Przybliżę o co chodzi z tym grupowaniem na wbudowanych elementach WordPress-a jakimi są „Wpisy”, „Media” i „Strony”.

menu wordpressa

Wchodząc w którykolwiek element naszym oczom ukaże się lista czy to wpisów, stron czy też plików. Każdy element listy dla WordPress-a jest wpisem z określonym typem dzięki czemu są one pogrupowane. Poniżej możecie zobaczyć jakie nazwy mają poszczególne grupy.

menu wordpressa z typami wbudowanymi

Teraz wyobraźcie sobie, że możecie sami założyć taką grupę, tym bowiem są własne typy postów. Możecie nadać takiej grupie dowolną nazwę, dodać osobną grupę kategorii, dodać dowolne pola oraz wiele więcej o czym przekonacie przy rejestracji własnego typu.

Rejestracja własnego typu wpisu

Załóżmy na potrzeby tego przykładu, że chcemy aby na naszej stronie pojawiła się podstrona z listą książek jakie polecamy. Oczywiście mogli byśmy zrobić stronę i w jej treści dodać takową listę jednak zarządzanie taką stroną będzie mało wygodne. Bowiem jak dodać książkę którą polecamy jednak nie mamy jeszcze gotowego opisu, lub chcemy opublikować informację dopiero za kilka dni ? Własny typ postów będzie tutaj idealnym rozwiązaniem, więc do dzieła…

Plik functions.php

Jeśli chcemy dodawać lub modyfikować funkcjonalność WordPressa powinniśmy wiedzieć, gdzie możemy dodawać odpowiednie modyfikacje. Otóż większość szablonów z którymi się zetkniecie będzie posiadało plik functions.php (jeśli takowego nie ma to go tworzymy). Plik ten jest każdorazowo uruchamiany przez WordPress-a dzięki czemu ten wie jakie ustawienia zostały zdefiniowane przez twórcę danego szablonu.

Rejestrujemy własny typ postów

Chcąc zachować porządek w projekcie zakładamy katalog functions, w którym będziemy trzymali pliki z ustawieniami dla poszczególnych elementów szablonu. Rozwiązanie to pozwoli uniknąć sytuacji w której plik functions.php ma kilka tysięcy linii kodu i nikt nad tym nie jest w stanie zapanować.

W katalogu functions tworzymy plik books.php definiujący nowy typ postów. Jego zawartość może wyglądać w następujący sposób:

function book_create_post_type() { 

    register_post_type( 'books', array( 
        'labels' => array(
            'name' => __( 'Książki' ),
            'singular_name' => __( 'Książka' ),
            'edit_item' => __('Edytuj książkę'),
            'new_item' => __('Nowa książka'),
            'add_new_item' => 'Dodaj nową książkę',
            'add_new' => 'Dodaj nową'
        ),
        'menu_icon' => 'dashicons-forms',
        'show_ui' => true,
        'public' => true,
        'supports' => array( 'title', 'thumbnail' ),
        'rewrite' => array(
            'slug' => 'ksiazka',
            'with_front'=> true,
            'pages'=> true
        ),
        'has_archive' => false,
    ));
}

add_action( 'init', 'book_create_post_type' );

Wyjaśnijmy sobie teraz kilka rzeczy, do rejestracji własnego typu postów służy funkcja register_post_type. Do funkcji możemy przekazać dwa parametry, pierwszy to nazwa typu, drugi zaś to tablica z ustawieniami dla rejestrowanego typu.

register_post_type( $post_type, $args )

$post_type (string) (required) Post type. (max. 20 characters, cannot contain capital letters or spaces)
Default: None

$args (array) (optional) An array of arguments.
Default: None

 

Kod w pliku rejestruje nowy typ o nazwie books

register_post_type( 'books', array(

Oraz definiuje ustawienia tego typu w następujący sposób:

'labels' => array(
    'name' => __( 'Książki' ),
    'singular_name' => __( 'Książka' ),
    'edit_item' => __('Edytuj książkę'),
    'new_item' => __('Nowa książka'),
    'add_new_item' => 'Dodaj nową książkę',
    'add_new' => 'Dodaj nową'
),
'menu_icon' => 'dashicons-forms',
'show_ui' => true,
'public' => true,
'supports' => array( 'title', 'thumbnail' ),
'rewrite' => array(
    'slug' => 'ksiazka',
    'with_front'=> true,
    'pages'=> true
),
'has_archive' => false,

Ustawienia te są jedynie ułamkiem tego co możemy ustawić dla danego typu. Więcej opcji znajdziecie w dokumentacji, a teraz zobaczmy co zostało zdefiniowane w powyższym kodzie.

  • labels – tutaj definiujemy teksty które mają się wyświetlać w menu, na przyciskach i wszelkich miejscach związanych z danym typem,
  • menu_icon – adres url do ikony lub nazwa klasy dl ikony w menu,
  • show_ui – określa czy ma być widoczny panel zarządzający dla tego typu postów w panelu administracyjnym,
  • public – definiuje widoczność,
  • supports – tablica z listą obsługiwanych elementów np. tytuł, obrazek, edytor tekstu,
  • rewrite – definiujemy jak ma wyglądać adres URL,
  • has_archive – czy ma istnieć archiwum dla wpisów,

Kod rejestrujący nowy typ postów znajduje się w funkcji book_create_post_type jest to związane z faktem, że później ta funkcja jest podpięta pod zdarzenie „init” w WordPressie.


function book_create_post_type() { 

// ... kod rejestrujący nowy typ postów ...

}

add_action( 'init', 'book_create_post_type' );

Alternatywnym rozwiązaniem było by przeniesienie kodu rejestrującego poza funkcję, usunięcie jej oraz usunięcie wpięcia w akcję.

// ... kod rejestrujący nowy typ postów ...

Kiedy już mamy przygotowany kod który rejestruje nowy typ postów w pliku books.php to następnie w pliku functions.php dodajemy import naszego pliku.

require_once 'functions/books.php';

Wyświetlanie wpisów

Kiedy mamy już zdefiniowany nowy typ postów czas zająć się ich wyświetlaniem. Do tego celu potrzebujemy utworzyć nowy szablon wpisów, robimy to tworząc plik post-books.php o treści:

<?php 
/* Template Name: Książki */ 

get_header(); 
?>

<?php 
$wp_query = new WP_Query(array( 'post_type' => 'books',
    'post_status'    => 'publish',
    'posts_per_page' => -1,
));

while ( $wp_query->have_posts() ) :
    $wp_query->the_post();
?>                  

    <article class="book">
        <div class="post-image">
            <img src="<?= get_the_post_thumbnail_url(); ?>">
        </div>
        <h2><?php the_title(); ?></h2>
    </article>

<?php endwhile; ?>
<?php get_footer(); ?>

Powyższa treść została bardzo uproszczona i konieczne jest dostosowanie jej do własnych wymagań.
Omówmy teraz nieco kod, zaczynamy od komentarza:

/* Template Name: Książki */

Jest on kluczowy dla WordPress-a, gdyż mówi że jest to szablon o nazwie „Książki”. Jeśli zostanie zdefiniowany prawidłowo to przy tworzeniu / edycji strony będziemy mogli go wybrać.

własne typy postów - szablony w ustawieniach strony

Dalej pobieramy listę wpisów powiązanych z naszym typem


$wp_query = new WP_Query(array( 
    'post_type'      => 'books',
    'post_status'    => 'publish',
    'posts_per_page' => -1,
));

Powyższy kod pobiera listę wpisów typu books 'post_type' => 'books', które są opublikowane 'post_status' => 'publish', oraz nie ma ograniczeń co do ilości pobieranych wpisów 'posts_per_page' => -1.

Ostatni etap to przejście po znalezionych wpisach i ich wyświetlenie.

<?php while ( $wp_query->have_posts() ) :
    $wp_query->the_post();
?>                  
    <article class="book">
        <div class="post-image">
            <img src="<?= get_the_post_thumbnail_url(); ?>">
        </div>
        <h2><?php the_title(); ?></h2>
    </article>

<?php endwhile; ?>

Oczywiście kod HTML będzie się różnił w każdym przypadku, wszystko zależy od tego co chcemy wyświetlić.