O autorze
Witam, Jestem Daniel i tworzę rzeczy dla sieci. Jestem CTO w Kinsta i piszę dla wielu niesamowitych publikacji, takich jak Smashing Magazine i …More aboutDaniel↬
- 15 min read
- WordPress,Techniques
- Zapisane do czytania w trybie offline
- Share on Twitter, LinkedIn
WordPress zdobywa przyczółek w ogólnej grze systemu zarządzania treścią (CMS) już od kilku lat, ale prawdziwym przełomem był mechanizm niestandardowych typów postów, który pozwala na tworzenie szerokiej gamy treści. Przyjrzyjmy się, jak do tego doszło i jakie opcje oferuje ta wspaniała funkcjonalność.
What It Used To Be Like
W praktyce niestandardowe typy postów istnieją już od dłuższego czasu, a dokładniej od 17 lutego 2005 roku, kiedy to WordPress 1.5 dodał obsługę stron statycznych, tworząc pole bazy danych post_type
.
Dalsze czytanie na SmashingMag:
- Extending WordPress With Custom Content Types
- A Detailed Guide To WordPress Custom Page Templates
- Customizing WordPress Archives For Categories, Tags
- Building A Custom Archive Page For WordPress
Funkcja wp_insert_post()
istnieje od czasów WordPress 1.0, więc kiedy pole post_type
zostało zaimplementowane w 1.5, mogłeś po prostu ustawić wartość post_type
podczas wstawiania postu. Oczywiście tworzenie i zarządzanie niestandardowymi typami postów wymagało znacznie więcej niż to, ale ilość potrzebnego kodowania stawała się coraz mniejsza, ponieważ funkcje WordPressa stawały się coraz bardziej elastyczne.
Do wersji 2.8, funkcja register_post_type()
i kilka innych pomocnych rzeczy zostało dodanych do nocnych kompilacji, a kiedy wyszedł 2.9, funkcje stały się dostępne dla wszystkich. W tym momencie rozległe kodowanie i hacki nie były potrzebne, aby uczynić z WordPressa pełnowartościowy CMS; mogłeś użyć wielu wspaniałych wbudowanych funkcji, aby WordPress wykonywał twoje polecenia.
Co WordPress może teraz dla ciebie zrobić
Niestandardowy typ postu to nic innego jak zwykły post z inną post_type
wartością w bazie danych. Typ postu zwykłych postów to post
, strony używają page
, załączniki używają attachment
i tak dalej. Możesz teraz tworzyć własne, aby wskazać rodzaj tworzonej treści. Możesz utworzyć niestandardowe typy postów dla książek, filmów, recenzji, produktów i tak dalej.
Jeśli zostanie utworzony poprawnie, możesz osiągnąć następujące cele za pomocą kilku linii kodu:
- Niestandardowy typ postu pojawi się w back-end jako osobna pozycja menu z własną listą postów i stroną „dodaj nowy”
- Nawigacja do
http://mysite.com/customposttype/
zabierze Cię do strony archiwum dla typu postu. Jest to podobne do odwiedzania strony głównej dla najnowszych postów z typu postu „post”. - Kategorie i tagi mogą być udostępniane niestandardowemu typowi postu lub możesz tworzyć niestandardowe taksonomie.
Oprócz tego możesz modyfikować niezliczone opcje, takie jak miejsce, w którym niestandardowy typ postu powinien być umieszczony w menu, czy powinien być przeszukiwalny, który poziom użytkownika może uzyskać do niego dostęp, czy powinien być hierarchiczny, niestandardowe reguły przepisywania itp.
Różne typy treści mają różne wymagania dotyczące danych. W przypadku zwykłych postów będziesz chciał określić autora, kategorię, datę i tak dalej. W przypadku niestandardowego typu postu „książka”, idealnie chciałbyś mieć możliwość określenia autora książki, liczby stron, gatunku, wydawcy i innych danych specyficznych dla książki. Używając niestandardowych pól meta, można to łatwo osiągnąć i zarządzać tym samym.
Niestandardowe pola meta umożliwiają dodanie dodatkowych pól do ekranu edycji postu. Zazwyczaj używają one pól niestandardowych, więc mógłbyś po prostu użyć pól niestandardowych, ale oddzielając niektóre pola niestandardowe jako pola meta, możesz stworzyć o wiele bardziej płynny i użyteczny admin.
Praca z niestandardowymi typami postów
Aby efektywnie tworzyć i używać niestandardowych typów postów, będziesz musiał znać następujące zagadnienia:
- Tworzenie niestandardowych typów postów,
- Tworzenie niestandardowych taksonomii,
- Tworzenie niestandardowych meta-boksów.
Tworzenie niestandardowych typów postów
Pierwszym punktem programu jest stworzenie samego typu postu. Idealnie byłoby utworzyć wtyczkę, gdy pracujesz z niestandardowymi typami postów, ale jeśli nie wiesz jak, lub po prostu potrzebujesz szybkiego testu, możesz użyć pliku functions.php
w swoim motywie.
function my_custom_post_product() { $args = array(); register_post_type( 'product', $args ); }add_action( 'init', 'my_custom_post_product' );
W najprostszej formie, stworzy to typ postu, który nie ma prawie żadnych dostosowań. Nie będzie on publiczny, nie będzie pokazywał się w administracji, wiadomości interakcji będą takie same jak posty („post zapisany”, „post zaktualizowany” itp.) i tak dalej. Aby dostosować nasz nowy typ postu do naszych potrzeb, przejdę przez niektóre z częściej używanych opcji i dodam je do wcześniej pustej tablicy $args
.
function my_custom_post_product() { $labels = array( 'name' => _x( 'Products', 'post type general name' ), 'singular_name' => _x( 'Product', 'post type singular name' ), 'add_new' => _x( 'Add New', 'book' ), 'add_new_item' => __( 'Add New Product' ), 'edit_item' => __( 'Edit Product' ), 'new_item' => __( 'New Product' ), 'all_items' => __( 'All Products' ), 'view_item' => __( 'View Product' ), 'search_items' => __( 'Search Products' ), 'not_found' => __( 'No products found' ), 'not_found_in_trash' => __( 'No products found in the Trash' ), 'parent_item_colon' => ’, 'menu_name' => 'Products' ); $args = array( 'labels' => $labels, 'description' => 'Holds our products and product specific data', 'public' => true, 'menu_position' => 5, 'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt', 'comments' ), 'has_archive' => true, ); register_post_type( 'product', $args ); }add_action( 'init', 'my_custom_post_product' );
-
labels
Opcjalabels
powinna być tablicą definiującą różne etykiety, które może mieć niestandardowy typ postu. Rozdzieliłem to powyżej tylko po to, aby argumenty za rejestracją typu postu były bardziej przejrzyste. -
description
Krótkie wyjaśnienie naszego niestandardowego typu postu; co robi i dlaczego go używamy. -
public
Ta opcja kontroluje wiele rzeczy za jednym zamachem. Ustawienie jej na true spowoduje ustawienie kilku innych opcji (wszystkie związane z widocznością) na true. Na przykład możliwe jest, aby niestandardowy typ postu był widoczny, ale nie można go odpytywać. Więcej na ten temat później. -
menu_position
Określa pozycję menu niestandardowego typu postu w zapleczu. Ustawienie go na „5” umieszcza go poniżej menu „postów”; im wyżej go ustawisz, tym niżej menu zostanie umieszczone. -
supports
Ta opcja ustawia domyślne elementy sterujące WordPress, które są dostępne na ekranie edycji niestandardowego typu postu. Domyślnie wyświetlane jest tylko pole tytułu i edytor. Jeśli chcesz dodać wsparcie dla komentarzy, korekt, formatów postów i takich, będziesz musiał je tutaj określić. Aby uzyskać pełną listę, spójrz na sekcję argumentów w Codexie. -
has_archive
Jeśli ustawione na true, reguły przepisywania zostaną utworzone dla ciebie, umożliwiając archiwum typu postu nahttp://mysite.com/posttype/
(domyślnie)
Po skonfigurowaniu tego, powinieneś zobaczyć wpis w menu dla niestandardowego typu postu. Powinieneś być w stanie dodawać posty, przeglądać listę postów w administratorze, a także odwiedzać opublikowane posty na stronie.
Jak wspomniałem, istnieje wiele rzeczy, które możesz zmodyfikować podczas tworzenia typu postu. Sugeruję zapoznanie się z listą argumentów w Codexie, aby uzyskać pełny opis każdej opcji i możliwych wartości.
Niestandardowe komunikaty interakcji
WordPress generuje szereg wiadomości wywoływanych przez działania użytkownika. Aktualizowanie, publikowanie, wyszukiwanie itp. w zapleczu prowadzą do wiadomości, które – domyślnie – są dostosowane do regularnych postów. Możesz łatwo zmienić tekst tych wiadomości za pomocą haka post_updated_messages
.
function my_updated_messages( $messages ) { global $post, $post_ID; $messages = array( 0 => ’, 1 => sprintf( __('Product updated. <a href="%s">View product</a>'), esc_url( get_permalink($post_ID) ) ), 2 => __('Custom field updated.'), 3 => __('Custom field deleted.'), 4 => __('Product updated.'), 5 => isset($_GET) ? sprintf( __('Product restored to revision from %s'), wp_post_revision_title( (int) $_GET, false ) ) : false, 6 => sprintf( __('Product published. <a href="%s">View product</a>'), esc_url( get_permalink($post_ID) ) ), 7 => __('Product saved.'), 8 => sprintf( __('Product submitted. <a target="_blank" href="%s">Preview product</a>'), esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ), 9 => sprintf( __('Product scheduled for: <strong>%1$s</strong>. <a target="_blank" href="%2$s">Preview product</a>'), date_i18n( __( 'M j, Y @ G:i' ), strtotime( $post->post_date ) ), esc_url( get_permalink($post_ID) ) ), 10 => sprintf( __('Product draft updated. <a target="_blank" href="%s">Preview product</a>'), esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ), ); return $messages;}add_filter( 'post_updated_messages', 'my_updated_messages' );
Jak widać, nie jest to najbardziej przyjazna metoda zarządzania wiadomościami. Tablica asocjacyjna byłaby o wiele lepsza; moglibyśmy zobaczyć, do czego służy każda wiadomość, bez konieczności czytania rzeczywistej wiadomości.
Zauważ, że możesz zmienić wiadomości dla wszystkich niestandardowych typów postów za pomocą tej jednej funkcji. Tablica $messages
przechowuje wiadomości dla wszystkich typów postów, więc możesz je tu wszystkie zmodyfikować. Osobiście tworzę funkcję dla każdego typu postu, aby móc łatwo zgrupować tworzenie typów postów i niestandardowych wiadomości razem.
Pomoc kontekstowa
Cechą, którą rzadko widzę zaimplementowaną, jest niestandardowa pomoc kontekstowa. Jako użytkownik, nigdy nie korzystałem z tej funkcji, ale jestem pewien, że wiele osób z niej korzysta; w każdym razie miło jest zapewnić trochę pomocy dla mniej doświadczonych użytkowników.
Funkcja pomocy kontekstowej jest zstępującą zakładką, którą można zobaczyć w prawym górnym rogu stron, gdzie jest dostępna. Przyjrzyjmy się, jak można zmienić jej zawartość.
function my_contextual_help( $contextual_help, $screen_id, $screen ) { if ( 'product' == $screen->id ) { $contextual_help = '<h2>Products</h2> <p>Products show the details of the items that we sell on the website. You can see a list of them on this page in reverse chronological order - the latest one we added is first.</p> <p>You can view/edit the details of each product by clicking on its name, or you can perform bulk actions using the dropdown menu and selecting multiple items.</p>'; } elseif ( 'edit-product' == $screen->id ) { $contextual_help = '<h2>Editing products</h2> <p>This page allows you to view/modify product details. Please make sure to fill out the available boxes with the appropriate details (product image, price, brand) and <strong>not</strong> add these details to the product description.</p>'; } return $contextual_help;}add_action( 'contextual_help', 'my_contextual_help', 10, 3 );
To również jest trochę trudne, ponieważ musisz znać ID ekranu, na którym się znajdujesz. Jeśli wydrukujesz zawartość zmiennej $screen
, powinieneś być w stanie łatwo określić identyfikator. Jest to również funkcja, której możesz użyć do modyfikacji pomocy kontekstowej wszystkich niestandardowych typów postów naraz, ale osobiście polecam zgrupowanie tego razem z poprzednimi dwoma blokami i używanie go tylko dla jednego niestandardowego typu postu na raz.
Przegląd
Aby szybko podsumować, użyliśmy trzech funkcji, aby utworzyć „kompletny” niestandardowy typ postu. Użyliśmy register_post_type()
do stworzenia samego typu postu i dwóch haków – contextual_help
i post_updated_messages
– do tworzenia odpowiednio pomocnych wskazówek i odpowiednich wiadomości.
Taksonomie niestandardowe
Twoje zwykłe posty na blogu używają kategorii i tagów do tworzenia struktury organizacyjnej. Jednak ta sama organizacja niekoniecznie ma sens w przypadku niestandardowych typów postów. Twoje posty na blogu mogą dotyczyć „Życia”, „Myśli” lub „Marzeń”. Te oczywiście nie są odpowiednie dla produktów.
To jest problem, który doprowadził programistów do stworzenia niestandardowych taksonomii. Możesz stworzyć osobną taksonomię o nazwie „Kategorie produktów”, aby pomieścić kategorie, których używasz tylko dla produktów. Kevin Leary napisał świetny artykuł na temat niestandardowych taksonomii w WordPressie, który gorąco polecam, więc będę tu tylko wchodził w drobne szczegóły.
function my_taxonomies_product() { $args = array(); register_taxonomy( 'product_category', 'product' $args );}add_action( 'init', 'my_taxonomies_product', 0 );
Podobnie do niestandardowych typów postów, możesz stworzyć taksonomię bardzo łatwo, ale musisz trochę nad nią popracować, aby dostosować ją do swoich potrzeb. Niestandardowe taksonomie zachowują się nieco lepiej po wyjęciu z pudełka, ponieważ są one domyślnie publiczne, więc powyższe jest w rzeczywistości wystarczające, aby powiązać tę taksonomię z postami produktów. Przyjrzyjmy się niestandardowemu przykładowi.
function my_taxonomies_product() { $labels = array( 'name' => _x( 'Product Categories', 'taxonomy general name' ), 'singular_name' => _x( 'Product Category', 'taxonomy singular name' ), 'search_items' => __( 'Search Product Categories' ), 'all_items' => __( 'All Product Categories' ), 'parent_item' => __( 'Parent Product Category' ), 'parent_item_colon' => __( 'Parent Product Category:' ), 'edit_item' => __( 'Edit Product Category' ), 'update_item' => __( 'Update Product Category' ), 'add_new_item' => __( 'Add New Product Category' ), 'new_item_name' => __( 'New Product Category' ), 'menu_name' => __( 'Product Categories' ), ); $args = array( 'labels' => $labels, 'hierarchical' => true, ); register_taxonomy( 'product_category', 'product', $args );}add_action( 'init', 'my_taxonomies_product', 0 );
Jak widać, niewiele się zmieniło. Dodaliśmy kilka etykiet i ustawiliśmy opcję hierarchiczną na true. Umożliwia to tworzenie taksonomii „w stylu kategorii”. Gdy ustawimy opcję na false (jest to wartość domyślna), nasza taksonomia będzie przypominać domyślne tagi.
Dostępnych jest kilka innych opcji, o których można przeczytać w artykule Leary’ego, lub można przejść do wpisu w Codexie na temat register_taxonomy()
.
Post Meta Boxes
Meta boxy to przeciągalne pola, które widzisz na ekranie edycji WordPressa dla postu. Istnieje wiele wbudowanych meta boxów, takich jak kontrolki publikowania, taksonomie, pole autora itp. ale możesz stworzyć kilka dla siebie.
Meta boxy są zwykle używane do zarządzania danymi pól niestandardowych w znacznie bardziej przyjazny dla użytkownika sposób niż wbudowane pole pól niestandardowych. Ponieważ umieściłeś kontrolki w miejscu, możesz dodać sprawdzanie błędów po stronie klienta i wiele innych wymyślnych rzeczy.
Justin Tadlock napisał wszechogarniający artykuł o niestandardowych meta boxach tutaj na Smashing Magazine, który jest świetnym, dogłębnym artykułem na ten temat. Polecam przeczytanie go dla pełnego obrazu, ale zacznę od tego.
Tworzenie meta boxu wymaga trzech kroków:
- Zdefiniowanie samego boxu,
- Zdefiniowanie zawartości meta boxu,
- Zdefiniowanie sposobu obsługi danych z boxu.
Definiowanie meta boxa
add_action( 'add_meta_boxes', 'product_price_box' );function product_price_box() { add_meta_box( 'product_price_box', __( 'Product Price', 'myplugin_textdomain' ), 'product_price_box_content', 'product', 'side', 'high' );}
Powyższy kod tworzy meta box z następującymi parametrami (w podanej kolejności):
- Unikalny identyfikator dla meta boxa (nie musi być zgodny z nazwą funkcji),
- Tytuł meta boxa (widoczny dla użytkowników),
- Funkcja, która wyświetli zawartość boxa,
- Typ postu, do którego należy meta box,
- Umieszczenie meta boxa,
- Priorytet meta boxa (określa „jak wysoko” jest umieszczony).
Definiowanie zawartości meta boxa
function product_price_box_content( $post ) { wp_nonce_field( plugin_basename( __FILE__ ), 'product_price_box_content_nonce' ); echo '<label for="product_price"></label>'; echo '<input type="text" name="product_price" placeholder="enter a price" />';}
To jest prosty box, który zawiera tylko cenę, więc stworzyliśmy etykietę i wejście do zarządzania nim. Pole nonce jest również obecne, co dodaje bezpieczeństwo do przesyłania danych.
Obsługa przesłanych danych
W większości przypadków, będziesz chciał zapisać dane jako pole własne, ale nie jesteś w żaden sposób ograniczony do tej metody. Możesz użyć danych wejściowych do wywołania API strony trzeciej, wygenerowania pliku XML lub cokolwiek chcesz. Najczęstszym zastosowaniem jest zapisywanie niestandardowych danych postów, więc spójrzmy, jak to się robi.
add_action( 'save_post', 'product_price_box_save' );function product_price_box_save( $post_id ) { if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return; if ( !wp_verify_nonce( $_POST, plugin_basename( __FILE__ ) ) ) return; if ( 'page' == $_POST ) { if ( !current_user_can( 'edit_page', $post_id ) ) return; } else { if ( !current_user_can( 'edit_post', $post_id ) ) return; } $product_price = $_POST; update_post_meta( $post_id, 'product_price', $product_price );}
Największą częścią tej funkcji jest wszystko o bezpieczeństwie. Po pierwsze, jeśli wykonywany jest autozapis, nic się nie dzieje, ponieważ użytkownik nie przesłał jeszcze formularza. Następnie sprawdzane jest nonce, po czym następuje sprawdzenie uprawnień. Jeśli wszystkie te elementy zostaną zaliczone, pobieramy nasze dane i dodajemy je do postu za pomocą funkcji update_post_meta()
.
Wyświetlanie treści
Pomimo, że istnieje wiele niuansów do wszystkich powyższych, powinieneś znać podstawy. Wszystko co pozostało to faktyczne wykorzystanie danych, które teraz mamy i pokazanie rzeczy użytkownikowi. Wiąże się to z pokazywaniem postów – być może z różnych niestandardowych typów postów i taksonomii – i używaniem naszych metadanych postów.
Wyświetlanie postów
Jeśli utworzyłeś typ postu z parametrem has_archive
ustawionym na „true”, WordPress wyświetli twoje posty na stronie archiwum typu postu. Jeśli twój typ postu nazywa się „książki”, możesz po prostu przejść do http://mysite.com/books/
i zobaczysz swoją listę postów.
Ta strona używa archive-.php
do wyświetlania, jeśli istnieje (archive-books.php
w naszym przypadku). Jeśli nie istnieje, użyje archive.php
, a jeśli to nie istnieje, użyje index.php
.
Innym sposobem na wyświetlenie zawartości niestandardowego typu postu jest użycie niestandardowego zapytania z klasą WP_Query
. Aby wyświetlić posty z określonego typu postu i niestandardowej taksonomii, możesz zrobić coś takiego:
<?php $args = array( 'post_type' => 'product', 'tax_query' => array( array( 'taxonomy' => 'product_category', 'field' => 'slug', 'terms' => 'boardgames' ) ) ); $products = new WP_Query( $args ); if( $products->have_posts() ) { while( $products->have_posts() ) { $products->the_post(); ?> <h1><?php the_title() ?></h1> <div class='content'> <?php the_content() ?> </div> <?php } } else { echo 'Oh ohm no products!'; } ?>
Wyświetlanie metadanych
Metadane można łatwo pobrać za pomocą funkcji get_post_meta()
. W naszym powyższym przykładzie, zapisaliśmy pole meta postu o nazwie product_price
. Możemy pobrać wartość tego pola dla danego postu za pomocą następującego kodu:
<?php // If we are in a loop we can get the post ID easily $price = get_post_meta( get_the_ID(), 'product_price', true ); // To get the price of a random product we will need to know the ID $price = get_post_meta( $product_id, 'product_price', true );?>
Słowa końcowe
Jak widać, tworzenie systemu CMS jest dość łatwe dzięki modułowej naturze kontrolek i funkcji WordPressa. Przedstawione tutaj metody mogą być bardzo dobrze wykorzystane do tworzenia niestandardowych adminów dla niemal wszystkiego, co tylko przyjdzie ci do głowy.
Ponieważ definiowanie zawartości meta boxów jest całkowicie zależne od ciebie, masz możliwość tworzenia dodatkowych funkcji dla swoich kontrolek, dzięki czemu ty lub twoi klienci będziecie bardzo zadowoleni.
Możesz pójść o krok dalej z niestandardowymi stronami administratora i całkowicie niestandardową zawartością, ale to już historia na inny dzień.