Kako napraviti WordPress custom post type

Kada pravite WordPress sajt, može da se desi da vaš sadržaj ne može uvek lepo da se uklopi u klasične objave i stranice. Za manji sajt to možda nije problem, ali čim imate više različitih tipova sadržaja, organizacija sadržaja postaje izazovnija. Tu na scenu stupa WordPress custom post type.
Custom post type vam omogućava da u WordPress-u napravite potpuno novu vrstu sadržaja koja je odvojena od standardnih objava i stranica. To je korisno kada, na primer, ne želite da sve držite u istoj listi postova, već da imate poseban deo sajta za recenzije, proizvode, događaje, nekretnine, portfolio, kurseve, recepte ili bilo koji drugi sadržaj koji ima svoju logiku.
U ovom tekstu ćemo objasniti šta je custom post type, kada vam je potreban, kako se pravi i na koje načine možete da ga prilagodite.
Šta je WordPress custom post type
Jednostavno rečeno, custom post type je prilagođeni tip sadržaja koji sami dodajete u WordPress. On služi da biste bolje organizovali sadržaj koji ne pripada standardnim objavama ili stranicama.
Kao što verovatno znate, WordPress već dolazi sa nekoliko podrazumevanih tipova sadržaja. Najpoznatiji su Posts i Pages, ali WordPress u pozadini koristi i neke druge vrste sadržaja. Među njima su i Attachments za medijske fajlove, Revisions za sačuvane verzije sadržaja, Navigation Menus za menije, Custom CSS i Changesets za izmene u prilagođavanju izgleda sajta.
Za većinu jednostavnih sajtova to je sasvim dovoljno. Međutim, ako imate sadržaj koji se razlikuje po nameni, izgledu ili podacima koje treba prikazati, mnogo je praktičnije da za njega napravite poseban custom post type.
Recimo, ako vodite sajt filmskih recenzija, nije idealno da sve recenzije stoje zajedno sa običnim blog tekstovima. Mnogo je preglednije da imate poseban tip sadržaja, na primer Filmovi ili Recenzije, sa svojim poljima, arhivom i prikazom.
Zašto nije dovoljno koristiti samo kategorije
Možda vam se na prvi pogled učini da je dovoljno da napravite novu kategoriju i tu smestite sadržaj. To ponekad jeste prihvatljivo rešenje, ali nije isto što i custom post type.
Kategorije samo grupišu objave unutar istog tipa sadržaja. To znači da su svi ti unosi i dalje obični postovi. Oni se nalaze u istoj listi, koriste isti način prikaza i dele ista osnovna pravila. Kada sajt poraste, takav pristup brzo postaje nepregledan.
Custom post type daje vam daleko veću kontrolu. Možete da napravite poseban meni u admin dashboardu, odvojene arhive, drugačije šablone prikaza, dodatna polja i druga pravila rada. Ukratko, sadržaj dobija sopstveni prostor u WordPress-u.
Kada custom post type ima smisla
Custom post type je koristan kada imate sadržaj koji:
- ima posebnu svrhu na sajtu,
- ne treba da stoji među klasičnim blog objavama,
- zahteva dodatna polja ili posebne podatke,
- zahteva drugačiji prikaz na frontendu,
- ima svoju zasebnu arhivu ili navigaciju.
To može da bude portfolio, cene usluga, događaji, oglasi, nekretnine, tim, FAQ sekcija, studije slučaja, proizvodi ili bilo šta drugo što zaslužuje posebnu strukturu.
Osnovni delovi custom post type koda
Pre nego što napravite custom post type, bilo bi dobro da koliko-toliko razumete osnovu koda koji se koristi. Ne morate da budete programer da biste pratili logiku, ali će vam biti lakše ako znate šta se zapravo dešava.
Kod za registraciju custom post type-a najčešće koristi nizove, odnosno arrays. To su strukture u kojima se čuvaju podešavanja. U ovom slučaju, kroz njih WordPress dobija informacije o tome kako taj novi tip sadržaja treba da se ponaša.
Najčešće ćete naići na tri važna dela: $args, $labels i $supports.
Promenljiva $args sadrži glavna podešavanja. Tu se definiše da li je tip sadržaja javno vidljiv, gde će se pojaviti u admin dashboardu, da li ima arhivu, da li može da se prikazuje u menijima i slično.
Promenljiva $labels služi za tekstove koji se prikazuju u WordPress admin dashboardu. Tu određujete kako će se zvati novi tip sadržaja, kako će pisati dugme za dodavanje novog unosa, tekst za izmenu sadržaja i slične stavke.
Promenljiva $supports određuje koje ugrađene WordPress funkcije želite da uključite za taj tip sadržaja. To mogu da budu naslov, editor, izdvojena slika, kratak opis, komentari, custom fields i drugo.
Najvažnija podešavanja u okviru $args
Kada pravite custom post type, neka podešavanja se koriste češće od drugih. Evo najvažnijih, objašnjenih jednostavno.
- description je kratak opis tipa sadržaja.
- public određuje da li je sadržaj vidljiv i u admin dashboardu i na javnom delu sajta. Ako stavite true, biće dostupan i administratorima i posetiocima.
menu_positionodređuje na kom mestu će se novi meni pojaviti u WordPress admin dashboardu.
has_archiveomogućava arhivsku stranicu za taj tip sadržaja. To znači da WordPress može da prikaže listu svih unosa tog tipa na posebnoj URL adresi.
show_in_admin_barodređuje da li će se novi tip sadržaja pojaviti u gornjoj admin traci, u delu za brzo dodavanje novog sadržaja.
show_in_nav_menusodređuje da li sadržaj tog tipa može da se ubaci u navigacione menije.
query_varomogućava da WordPress prepoznaje taj tip sadržaja u URL upitima.
Šta radi $labels
$labels je zadužen za nazive koje vidite u admin dashboardu. Tu birate kako će WordPress prikazivati tekstove vezane za taj tip sadržaja.
Na primer, kroz name definišete množinu, kao što je „Custom Articles“, dok singular_name predstavlja jedninu, na primer „Custom Article“. Tu možete da prilagodite i tekst za dugme „Dodaj novo“, naziv stavke za izmenu, prikaz izdvojene slike i naziv stavke u levom meniju.
Drugim rečima, $labels ne menja funkcionalnost, već način na koji WordPress komunicira sa administratorom.
Šta radi $supports
Ovaj deo određuje koje standardne WordPress mogućnosti želite da uključite za novi tip sadržaja. Tu možete da omogućite naslov, glavni editor, autora, izdvojenu sliku, kratak opis, komentare, revizije i još dosta toga.
Ako, recimo, pravite portfolio stavke i ne trebaju vam komentari, jednostavno ih nećete uključiti. Ako želite da svaka stavka ima naslov, tekst i sliku, uključićete baš te opcije.
Kako da napravite WordPress custom post type
Postoji više načina da dodate custom post type u WordPress. Možete da koristite plugin, možete da unesete kod u functions.php fajl aktivne teme ili da napravite poseban plugin samo za svoj sajt.
Najjednostavnije rešenje je plugin, ali to nije uvek i najbolje rešenje. Ako koristite običan plugin za custom post type i jednog dana ga isključite, ta funkcionalnost neće više raditi. Ako sve ubacite u temu, problem je što promena ili update teme može da vam poremeti strukturu sadržaja.
Zato je najpraktičnije rešenje da napravite mali, namenski plugin za sajt. Na taj način sadržaj ostaje odvojen od teme i lakše ga je održavati.
U jednom od tekstovba na našem blogu smo već pisali na temu Kako da napravite WordPress plugin, pa ako želite da saznate nešto više o tome preporučujemo da prvo pročitate taj tekst.
Za registraciju custom post type-a koristi se WordPress funkcija register_post_type(). Ona prima dva glavna parametra. Prvi je interni naziv tipa sadržaja, a drugi su argumenti, odnosno sva ona podešavanja koja ste definisali kroz nizove.
Evo primera koda za jedan custom post type pod nazivom article:
<?php
/*
Plugin Name: Custom Post Types
Description: Add post types for custom articles
Author: Nenad Mihajlovic
*/
// Povezujemo funkciju ht_custom_post_custom_article() sa WordPress init akcijom
add_action( ‘init’, ‘ht_custom_post_custom_article’ );
// Pravimo prilagođenu funkciju za registraciju custom post type-a “article”
function ht_custom_post_custom_article() {
// Podešavamo labele koje će se koristiti u okviru $args niza
$labels = array(
‘name’ => __( ‘Custom Articles’ ),
‘singular_name’ => __( ‘Custom Article’ ),
‘add_new’ => __( ‘Add New Custom Article’ ),
‘add_new_item’ => __( ‘Add New Custom Article’ ),
‘edit_item’ => __( ‘Edit Custom Article’ ),
‘new_item’ => __( ‘New Custom Article’ ),
‘all_items’ => __( ‘All Custom Articles’ ),
‘view_item’ => __( ‘View Custom Article’ ),
‘search_items’ => __( ‘Search Custom Article’ ),
‘featured_image’ => ‘Poster’,
‘set_featured_image’ => ‘Add Poster’
);
// Definišemo argumente za naš prilagođeni tip objave
$args = array(
‘labels’ => $labels,
‘description’ => ‘Čuva specifične podatke za custom article objave’,
‘public’ => true,
‘menu_position’ => 5,
‘supports’ => array( ‘title’, ‘editor’, ‘thumbnail’, ‘excerpt’, ‘comments’, ‘custom-fields’ ),
‘has_archive’ => true,
‘show_in_admin_bar’ => true,
‘show_in_nav_menus’ => true,
‘query_var’ => true,
);
// Registrujemo custom post type
register_post_type(‘article’, $args);
}
Iako kod na prvi pogled deluje možda komplikovano, njegova logika je prilično jasna. Prvo definišete nazive koji će se prikazivati u admin dashboardu, zatim podešavate ponašanje tipa sadržaja, a na kraju WordPress-u date instrukcije da registruje novi tip pod nazivom article.
Kako da taj kod pretvorite u plugin
Kada napišete kod, potrebno je da ga sačuvate kao PHP fajl i smestite u WordPress plugins direktorijum.
Praktičan postupak izgleda ovako. Prvo otvorite običan tekst editor ili editor za kod. Zatim u njega nalepite kod. Nakon toga fajl sačuvajte pod imenom, na primer, custom-post-type.php.
Posle toga pristupite fajlovima sajta preko File Manager-a ili FTP klijenta. Otvorite putanju wp-content/plugins, napravite novi folder, na primer custom-post-type, i u njega ubacite PHP fajl koji ste sačuvali.
Kada to uradite, prijavite se u WordPress admin dashboard, otvorite Plugins, pronađite svoj plugin i kliknite na Activate. Posle osvežavanja stranice trebalo bi da vidite novi meni u admin dashboardu, odnosno svoj novi custom post type.
WordPress tehnički ne ograničava broj custom post type-ova koje ćete dodati. Ipak, to ne znači da treba da ih pravite bez potrebe.
Ako ih ima previše, admin dashboard može postati prenatrpan, a održavanje komplikovanije. Zato je najbolje da custom post type koristite samo kada zaista postoji jasna potreba da određeni sadržaj bude odvojen i drugačije organizovan.
Kako da prilagodite izgled novog tipa sadržaja
Kada napravite custom post type, sledeći korak je da prilagodite kako se taj sadržaj prikazuje na sajtu. To se radi pomoću template fajlova u aktivnoj temi.
Za pojedinačni prikaz koristi se fajl oblika single-{post_type}.php, a za listu svih unosa koristi se archive-{post_type}.php.
Ako je interni naziv vašeg tipa sadržaja article, odgovarajući fajlovi bi bili single-article.php i archive-article.php.
Ako ove fajlove ne napravite, WordPress će pokušati da koristi podrazumevane template fajlove teme, kao što su single.php i archive.php. To znači da će se novi sadržaj možda prikazivati isto kao obične objave, što vam verovatno nije cilj.
Najpraktičniji način je da u okviru teme kopirate postojeće single.php i archive.php fajlove, preimenujete ih prema nazivu custom post type-a i zatim menjate samo ono što vam treba. Tako zadržavate osnovnu strukturu teme, ali pritom dobijate posebne šablone za svoj sadržaj.
Na taj način možete da prilagodite raspored elemenata, dodate posebne podatke, promenite naslovne blokove, sakrijete nepotrebne delove i napravite prikaz koji je logičniji za taj tip sadržaja.
Kako da dodate meta box u custom post type
Meta box je dodatni blok u edit ekranu unutar WordPress admin dashboarda. Njegova svrha je da vam omogući unos dodatnih podataka na pregledniji način.

Na primer, ako pravite custom post type za knjige, možete imati meta box za autora, ISBN broj, izdavača i godinu izdanja. Ako pravite sadržaj za filmove, možete dodati polja za žanr, trajanje i ime reditelja.
WordPress već ima određene standardne blokove, ali vrlo često ćete želeti da dodate sopstveni. To se radi kroz funkcije kao što su add_meta_box() i save_post.
Evo primera kako izgleda osnova za dodavanje jednog meta box-a za autora:
// Dodajemo meta box
add_action("add_meta_boxes", "add_author_meta_box");
function add_author_meta_box()
{
add_meta_box(
"author_meta_box", // ID meta box-a
"Author Details", // Naslov meta box-a
"author_meta_box_callback", // Callback funkcija za prikaz sadržaja meta box-a
"article", // Custom post type za koji se meta box prikazuje
"side", // Pozicija meta box-a na ekranu za izmenu
"high" // Prioritet prikaza meta box-a
);
}
function author_meta_box_callback()
{
// Dodajemo nonce polje radi bezbednosne provere
wp_nonce_field('author-nonce', 'meta-box-nonce');
// Uzimamo globalni $post objekat
global $post;
placeholder
}
Ovaj deo samo kreira okvir meta box-a. Da bi imao smisla, morate dodati i polja koja će se prikazivati u njemu.
Na primer, ako želite polje za ime autora i ID autora, sadržaj može da izgleda ovako:
// Sadržaj meta box-a
?>
<th><label for="author_name_field">Author Name</label></th>
<td>
<input
type="text"
id="author_name"
class="regular-text"
name="Author_Name"
value=""
/>
</td>
<th><label for="author_id_field">Author ID</label></th>
<td>
<input
type="text"
id="author_id"
class="regular-text"
name="Author_ID"
value=""
/>
</td>
<?php
Na kraju je potrebno da WordPress sačuva vrednosti koje korisnik unese. To se radi kroz save_post akciju:
// Čuvamo podatke iz meta box-a
add_action('save_post', 'author_save_postdata');
function author_save_postdata($post_id) {
// Proveravamo da li je u toku automatsko čuvanje
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return $post_id;
}
// Proveravamo da li je tip objave "article"
if ('article' !== get_post_type($post_id)) {
return $post_id;
}
// Proveravamo da li korisnik ima dozvolu za izmenu objave
if (!current_user_can('edit_post', $post_id)) {
return $post_id;
}
// Uzimamo i sanitizujemo vrednost polja Author_Name
$author_name = isset($_POST['Author_Name']) ? sanitize_text_field($_POST['Author_Name']) : '';
// Uzimamo i sanitizujemo vrednost polja Author_ID
$author_id = isset($_POST['Author_ID']) ? sanitize_text_field($_POST['Author_ID']) : '';
// Ažuriramo Author_Name meta podatak
update_post_meta($post_id, 'Author_Name', $author_name);
// Ažuriramo Author_ID meta podatak
update_post_meta($post_id, 'Author_ID', $author_id);
}
Suština je jednostavna. Napravite dodatna polja u admin dashboardu, korisnik unese podatke, a WordPress ih sačuva kao meta podatke uz konkretan sadržaj.
Zašto su meta box-ovi korisni
Bez meta box-a, dodatne informacije često morate unositi ručno kroz custom fields ili kroz sam sadržaj posta. To nije pregledno i lako dolazi do grešaka.
Meta box omogućava da se važni podaci unose na tačno predviđena mesta. To ubrzava rad, smanjuje zabunu i olakšava kasniji prikaz tih podataka na sajtu.
Kako da prikažete custom post type na početnoj strani
WordPress po podrazumevanim podešavanjima na početnoj strani obično prikazuje samo klasične objave. Ako želite da se tu pojavi i vaš custom post type, morate malo izmeniti glavni upit.
To se radi pomoću pre_get_posts hook-a. Evo primera:
// Povezujemo našu prilagođenu funkciju sa pre_get_posts akcijom
add_action( 'pre_get_posts', 'add_article_to_frontpage' );
// Menjamo glavni upit
function add_article_to_frontpage( $query ) {
// Proveravamo da li je početna stranica bloga i da li je ovo glavni upit
if ( is_home() && $query->is_main_query() ) {
// Dodajemo i "article" tip objave u glavni prikaz na naslovnoj strani bloga
$query->set( 'post_type', array( 'post', 'article' ) );
}
// Vraćamo izmenjeni upit
return $query;
}
Ovaj kod govori WordPress-u da na početnoj strani, pored običnih objava, prikaže i unose tipa article.
Ako biste iz niza uklonili ‘post’, onda bi se na početnoj strani prikazivali samo unosi iz custom post type-a. Znači, sve zavisi od toga kako želite da organizujete sadržaj.
Kako da dodate custom field u WordPress
Kada napravite custom post type, često se javlja potreba za dodatnim poljima. Na primer, možete poželeti da uz tekst imate i polje za autora, cenu, trajanje, lokaciju, broj telefona ili neki drugi specifičan podatak.
Postoje dva osnovna načina za to. Prvi je korišćenje ugrađene WordPress podrške za custom fields, a drugi je korišćenje plugina, najčešće Advanced Custom Fields.
Korišćenje podrazumevanih WordPress custom fields
WordPress već ima mogućnost za dodavanje custom fields, ali ta opcija često nije odmah vidljiva u editoru. Potrebno je da je uključite kroz podešavanja prikaza edit ekrana.
Kada je aktivirate, dobićete sekciju u kojoj možete ručno uneti naziv i vrednost polja. To je zgodno za jednostavne potrebe, ali nije naročito praktično za ozbiljniji rad, naročito ako više osoba uređuje sadržaj.
Važno je i da se custom fields ne prikazuju automatski na frontend delu sajta. Da biste ih prikazali, morate uneti odgovarajuću funkciju u template fajl.
Ako želite da prikažete sva custom fields polja, može da se koristi the_meta(). Ako želite samo jedno određeno polje, koristi se get_post_meta().
Na primer:
echo get_post_meta( $post->ID, 'Author_Name', true );
Ovaj kod uzima vrednost polja Author_Name i prikazuje je na stranici. Takav kod možete ubaciti u single-article.php ili neki drugi template, zavisno od toga gde želite da se podatak vidi.
Ograničavanje polja na određeni post type pomoću plugina
Mana podrazumevanih WordPress custom fields opcija je to što nisu naročito praktične kada želite da precizno kontrolišete gde će se određeno polje pojavljivati. Zato se u praksi često koristi plugin kao što je Advanced Custom Fields.
ACF omogućava da pravite grupe polja i da vrlo jasno odredite na kojim tipovima sadržaja će se ta polja pojaviti. Tako, recimo, polje za autora može da bude dostupno samo za Custom Article, a ne i za obične objave ili stranice.
Kada napravite polje kroz ACF, u podešavanjima birate pravilo prikaza, na primer da se polje vidi samo kada je post type jednak Custom Article. To je mnogo preglednije i pogodnije za rad od ručnog unosa svakog custom field-a.
Pošto je polje kreirano preko plugina, za prikaz se koriste ACF funkcije, kao što je:
the_field('author_name');
Ovaj pristup je posebno koristan ako ne želite da se previše bavite ručnim pisanjem PHP koda za svaki detalj.
Šta je bolje, ručni kod ili plugin
Ako želite punu kontrolu i ne smeta vam rad sa kodom, ručno definisanje custom post type-a i polja može biti veoma dobro rešenje. To je često čistije i daje više slobode.
Ako vam je važnija brzina rada i preglednost u admin dashboardu, plugin kao što je ACF može mnogo da olakša posao. U realnim projektima se često kombinuju oba pristupa: custom post type se registruje kroz kod, a dodatna polja se vode preko ACF-a.
Na šta treba obratiti pažnju
Kada pravite custom post type, dobro je da odmah razmislite o nekoliko stvari. Prvo, naziv tipa sadržaja treba da bude smislen i jasan. Pored toga, važno je da ne preterujete sa brojem različitih tipova sadržaja. Takođe, ako planirate poseban prikaz na sajtu, odmah predvidite i odgovarajuće template fajlove.
Vodite i računa da interni naziv koji prosleđujete funkciji register_post_type() bude jednostavan, bez razmaka i specijalnih znakova. Taj naziv WordPress koristi interno i od njega zavise nazivi template fajlova, arhive i deo logike u kodu.
Zaključak
WordPress custom post type je odlično rešenje kada želite bolju organizaciju sadržaja i više kontrole nad načinom na koji se on unosi i prikazuje. Umesto da sve držite u standardnim objavama i pokušavate da red uvodite samo pomoću kategorija, možete napraviti posebnu vrstu sadržaja koja ima sopstvenu logiku.
To je posebno korisno na većim sajtovima, ali i na manjim projektima kada postoje jasno odvojene celine, kao što su portfolio, događaji, tim, proizvodi, recenzije ili usluge.
Osnovna logika je jednostavna: registrujete novi tip sadržaja pomoću register_post_type(), definišete nazive i opcije, po potrebi pravite posebne template fajlove i dodajete meta box-eve ili custom fields kada vam trebaju dodatni podaci.
Kada se sve to lepo postavi, rad u WordPress-u postaje pregledniji, a sadržaj lakši za održavanje i prikazivanje. Upravo zato su custom post type-ovi jedna od najkorisnijih mogućnosti koje WordPress nudi kada želite da sajt bude bolje organizovan i prilagođen konkretnim potrebama.
Nenad Mihajlović