WordPress pada dasarnya hanya mengenal dua jenis konten yang bisa ditulis dari dashboard: Post dan Page. Keduanya sudah cukup untuk blog berita biasa, tetapi begitu situs publisher berkembang — ada ulasan produk, direktori narasumber, arsip acara, profil penulis, atau basis data lowongan — memaksakan semua konten itu ke dalam Post biasa akan membuat arsip berantakan, pencarian tidak akurat, dan iklan sulit ditempatkan. Di sinilah WordPress Custom Post Type (CPT) dan taxonomy kustom bekerja: keduanya memungkinkan publisher membuat jenis konten sendiri dengan arsip, URL, dan pengelompokan sendiri, tanpa mengubah cara kerja inti WordPress. Artikel ini menjelaskan cara kerjanya, cara membuatnya dengan kode maupun tanpa kode, cara menampilkannya di tema, serta dampaknya pada SEO, AdSense, dan REST API.
- Poin Kunci
- Daftar Isi
- 1. Apa Itu Custom Post Type dan Taxonomy Kustom?
- 1.1. Analogi yang mudah diingat
- 1.2. Apa yang bukan CPT
- 2. Kapan Publisher Membutuhkan CPT dan Kapan Tidak?
- 2.1. Publisher butuh CPT bila
- 2.2. Publisher tidak butuh CPT bila
- 2.3. Contoh keputusan untuk situs berita dan media
- 3. Cara Kerja Custom Post Type di Dalam WordPress
- 3.1. Semua konten tersimpan di satu tabel
- 3.2. Registrasi, bukan instalasi
- 3.3. Argumen utama register_post_type()
- 3.4. Kapan registrasi terjadi
- 4. Cara Membuat Custom Post Type dengan Kode
- 4.1. Contoh lengkap: CPT “Ulasan”
- 4.2. Memilih nilai supports yang tepat
- 4.3. CPT publik vs CPT internal
- 4.4. CPT hierarkis: jarang dibutuhkan publisher
- 4.5. Mengaktifkan permalink setelah registrasi
- 5. Cara Membuat Taxonomy Kustom dengan Kode
- 5.1. Contoh lengkap: taxonomy “Merek” dan “Fitur” untuk CPT Ulasan
- 5.2. Hierarkis atau datar: cara memilih
- 5.3. Argumen taxonomy yang paling relevan
- 5.4. Memakai kategori dan tag bawaan pada CPT
- 6. Cara Membuat CPT dan Taxonomy Tanpa Kode dengan Plugin CPT UI
- 6.1. Langkah membuat CPT dengan CPT UI
- 6.2. Langkah membuat taxonomy dengan CPT UI
- 6.3. Kelebihan dan batas CPT UI
- 6.4. Alternatif plugin lain
- 7. Cara Menampilkan CPT di Tema: Arsip, Single, dan Query
- 7.1. Template hierarchy untuk CPT dan taxonomy
- 7.2. Menampilkan CPT dengan WP_Query
- 7.3. Blok Query dan pola blok di editor modern
- 7.4. Menu navigasi dan widget
- 8. CPT, SEO, dan AdSense: yang Perlu Diperhatikan Publisher
- 8.1. Sitemap dan indeksasi
- 8.2. Arsip taxonomy yang tipis dan konten duplikat
- 8.3. Struktur URL dan permalink
- 8.4. Penempatan iklan AdSense pada CPT
- 8.5. Performa: CPT tidak membuat situs lambat dengan sendirinya
- 9. CPT dan WordPress REST API
- 9.1. Mengaktifkan CPT untuk REST API
- 9.2. Mengaktifkan REST API untuk CPT yang tidak Anda kendalikan
- 9.3. Penggunaan praktis untuk publisher
- 10. Kesalahan Umum dan Cara Menghindarinya
- 10.1. Lupa menyimpan ulang Permalink
- 10.2. Mendaftarkan CPT di functions.php tema
- 10.3. Nama kunci terlalu panjang atau memakai huruf besar
- 10.4. Lupa mengisi show_in_rest
- 10.5. Taxonomy tidak terikat ke CPT
- 10.6. Tabrakan slug dengan Page atau kategori
- 10.7. Membuat terlalu banyak CPT
- 10.8. Mengabaikan hak akses
- 11. Checklist Sebelum Meluncurkan CPT Baru
- 12. FAQ
- Apakah Custom Post Type memengaruhi kecepatan situs?
- Apakah konten CPT hilang bila plugin CPT UI dinonaktifkan?
- Apakah CPT bisa memakai kategori dan tag bawaan WordPress?
- Bagaimana cara menampilkan CPT di beranda?
- Apakah CPT otomatis masuk sitemap dan terindeks Google?
- Apakah saya harus memakai plugin atau menulis kode sendiri?
- Kesimpulan
- Sumber resmi yang dirujuk
Poin Kunci
- Custom Post Type adalah jenis konten baru di luar Post dan Page, misalnya “Ulasan”, “Acara”, atau “Lowongan”. WordPress menyimpannya di tabel yang sama dengan Post biasa, tetapi dengan penanda jenis yang berbeda.
- Taxonomy kustom adalah sistem pengelompokan untuk CPT, mirip kategori dan tag untuk Post biasa. Taxonomy bisa hierarkis (seperti kategori, punya induk-anak) atau datar (seperti tag).
- Fungsi resminya adalah
register_post_type()untuk CPT danregister_taxonomy()untuk taxonomy. Keduanya wajib dipanggil pada hookinit, bukan sebelumnya. - Nama kunci CPT maksimal 20 karakter dan hanya boleh berisi huruf kecil, angka, dash, dan underscore. Nama kunci taxonomy maksimal 32 karakter.
- Argumen
show_in_restwajib bernilaitruebila CPT ingin memakai editor blok (Gutenberg) dan terekspos ke REST API. - Publisher yang tidak mau menulis kode bisa memakai plugin Custom Post Type UI (1+ juta instalasi aktif menurut WordPress.org) untuk mendaftarkan CPT dan taxonomy lewat antarmuka admin.
- Setelah CPT didaftarkan, buka Pengaturan > Permalink lalu simpan ulang agar aturan URL baru aktif. Tanpa langkah ini, halaman arsip dan single CPT umumnya menampilkan error 404.
- CPT yang didaftarkan di tema akan hilang dari admin bila tema diganti; CPT yang didaftarkan lewat plugin tetap ada. Karena itu praktik yang dianjurkan adalah mendaftarkan CPT lewat plugin (atau plugin kustom kecil), bukan lewat
functions.phptema.
Daftar Isi
- Apa Itu Custom Post Type dan Taxonomy Kustom?
- Kapan Publisher Membutuhkan CPT dan Kapan Tidak?
- Cara Kerja Custom Post Type di Dalam WordPress
- Cara Membuat Custom Post Type dengan Kode
- Cara Membuat Taxonomy Kustom dengan Kode
- Cara Membuat CPT dan Taxonomy Tanpa Kode dengan Plugin CPT UI
- Cara Menampilkan CPT di Tema: Arsip, Single, dan Query
- CPT, SEO, dan AdSense: yang Perlu Diperhatikan Publisher
- CPT dan WordPress REST API
- Kesalahan Umum dan Cara Menghindarinya
- Checklist Sebelum Meluncurkan CPT Baru
- FAQ
- Kesimpulan
- Sumber resmi yang dirujuk
1. Apa Itu Custom Post Type dan Taxonomy Kustom?
Custom Post Type adalah jenis konten yang didefinisikan sendiri oleh pemilik situs, di samping jenis konten bawaan WordPress. Jenis konten bawaan yang paling dikenal adalah Post (artikel blog), Page (halaman statis), dan Attachment (media). Ada pula jenis bawaan lain yang bekerja di balik layar, seperti Revision (revisi), tetapi ketiganya itulah yang relevan untuk redaksi. Sebuah CPT berperilaku seperti Post: ia punya judul, isi, status terbit (draft, terbit, terjadwal), penulis, tanggal, dan bisa punya gambar unggulan, excerpt, serta komentar — tergantung fitur apa yang diaktifkan lewat argumen supports.
Contoh CPT yang umum dipakai publisher: “Ulasan” untuk ulasan produk atau film, “Acara” untuk agenda dan liputan event, “Lowongan” untuk daftar pekerjaan, “Direktori” untuk profil narasumber atau lembaga, “Resep” untuk situs kuliner, dan “Portofolio” untuk karya. Masing-masing CPT mendapat menu sendiri di sidebar admin, arsip sendiri (misalnya /ulasan/), dan URL single sendiri (misalnya /ulasan/nama-produk/).
Taxonomy kustom adalah sistem pengelompokan untuk CPT, dengan peran yang sama seperti kategori dan tag untuk Post biasa. WordPress memang sudah punya dua taxonomy bawaan — Category (hierarkis, bisa punya induk dan anak) dan Post Tag (datar, tanpa hierarki) — tetapi keduanya secara bawaan hanya terikat ke Post. Bila publisher membuat CPT “Ulasan”, ia biasanya butuh taxonomy sendiri, misalnya “Merek” (hierarkis: Elektronik > Smartphone) atau “Fitur” (datar: tahan air, fast charging, NFC). Tanpa taxonomy kustom, semua ulasan akan menumpuk dalam satu arsip tanpa cara yang rapi untuk memfilternya.
Hubungan keduanya sederhana: CPT menjawab pertanyaan “konten apa ini?”, taxonomy menjawab “konten ini termasuk kelompok apa?”. Satu CPT bisa diikat ke beberapa taxonomy, dan satu taxonomy bisa dipakai oleh beberapa CPT sekaligus.
1.1. Analogi yang mudah diingat
Bayangkan situs sebagai perpustakaan. Post biasa adalah rak buku umum. Custom Post Type adalah rak baru yang dibangun khusus — rak “Majalah”, rak “Peta”, rak “Arsip Foto”. Taxonomy kustom adalah sistem katalog rak itu: label di punggung buku, nomor klasifikasi, atau warna sampul. Tanpa rak baru, semua koleksi menumpuk di rak umum. Tanpa katalog, pengunjung tetap sulit menemukan apa yang dicari meski raknya sudah ada.
1.2. Apa yang bukan CPT
Tiga hal sering disalahartikan sebagai CPT. Pertama, custom field (meta field) bukan CPT: custom field menambah data pada sebuah konten (misalnya harga, rating, skor), sedangkan CPT menambah jenis kontennya. Keduanya sering dipakai bersama — CPT “Ulasan” plus custom field “skor” dan “harga” — tetapi fungsinya berbeda. Kedua, kategori dan tag bukan CPT: keduanya adalah taxonomy, sistem pengelompokan, bukan jenis konten. Ketiga, halaman arsip yang dibuat dengan plugin page builder bukan CPT: halaman itu tetap sebuah Page yang menampilkan daftar Post, bukan jenis konten baru dengan arsip bawaannya sendiri.
2. Kapan Publisher Membutuhkan CPT dan Kapan Tidak?
Tidak semua situs butuh CPT. Keputusan yang tepat menghemat waktu pengembangan dan menghindari utang teknis di masa depan. Berikut panduan praktisnya.
2.1. Publisher butuh CPT bila
Pertama, bila ada kelompok konten yang strukturnya berbeda dari artikel biasa dan jumlahnya akan terus bertambah. Contohnya ulasan produk yang selalu punya skor, harga, dan tautan beli; atau agenda acara yang selalu punya tanggal, lokasi, dan penyelenggara. Memaksakan struktur itu ke Post biasa berarti mengandalkan kategori dan custom field semata, dan lama-kelamaan arsip Post menjadi campuran artikel dan data.
Kedua, bila kelompok konten itu butuh arsip dan URL sendiri yang mudah dibedakan. Pembaca dan Google sama-sama diuntungkan bila ulasan tinggal di /ulasan/, bukan bercampur di /category/ulasan/ bersama artikel opini. URL yang konsisten juga memudahkan penempatan iklan: unit iklan khusus ulasan bisa dipasang di template arsip dan single CPT tanpa memengaruhi artikel berita.
Ketiga, bila tim redaksi butuh alur kerja terpisah. CPT punya menu admin sendiri, sehingga penulis ulasan tidak perlu berbagi daftar Post dengan penulis berita. Hak akses pun bisa dipisah lewat argumen capability_type dan capabilities, misalnya hanya editor ulasan yang boleh menerbitkan CPT “Ulasan”.
Keempat, bila konten akan dipakai ulang lewat REST API atau aplikasi lain. CPT yang didaftarkan dengan show_in_rest bernilai true otomatis mendapat rute API sendiri di namespace wp/v2, sehingga aplikasi mobile atau situs satelit bisa mengambil data ulasan tanpa mencampuradukkannya dengan artikel biasa.
2.2. Publisher tidak butuh CPT bila
Pertama, bila kelompok konten itu sebenarnya hanya variasi artikel biasa. Rubrik baru seperti “Opini” atau “Wawancara” umumnya cukup ditangani kategori, karena strukturnya sama: judul, isi, gambar, penulis. Membuat CPT untuk setiap rubrik hanya menambah menu admin tanpa manfaat nyata.
Kedua, bila jumlah kontennya sedikit dan tidak akan bertambah. Lima halaman profil tim redaksi lebih tepat dibuat sebagai Page biasa daripada CPT “Tim”, karena Page sudah punya hierarki induk-anak dan tidak butuh arsip.
Ketiga, bila kebutuhan sebenarnya adalah pengelompokan, bukan jenis konten baru. Bila yang dibutuhkan hanya cara memfilter artikel berdasarkan topik, kategori atau tag sudah cukup. CPT adalah jawaban untuk “jenis konten baru”, bukan untuk “kelompok baru”.
Keempat, bila situs masih kecil dan tim belum siap merawat kode atau plugin tambahan. Setiap CPT menambah permukaan yang harus dirawat: template, sitemap, aturan redirect, dan penempatan iklan. Lebih baik menunda CPT sampai ada kebutuhan nyata daripada membuat struktur yang setengah jadi.
2.3. Contoh keputusan untuk situs berita dan media
Situs berita umum dengan artikel, opini, dan foto: cukup Post dan kategori. Situs media yang juga menerbitkan ulasan gadget mingguan, direktori sekolah, dan agenda event bulanan: CPT “Ulasan”, “Sekolah”, dan “Acara” masuk akal, masing-masing dengan taxonomy sendiri. Situs niche kuliner: CPT “Resep” dengan taxonomy “Jenis Masakan” (hierarkis) dan “Bahan Utama” (datar) adalah contoh klasik yang sudah dipakai ribuan situs. Situs lowongan kerja: CPT “Lowongan” dengan taxonomy “Lokasi” dan “Jenis Pekerjaan” jauh lebih rapi daripada memaksakan lowongan ke dalam Post.
3. Cara Kerja Custom Post Type di Dalam WordPress
Memahami cara kerja di balik layar membantu publisher mengambil keputusan yang benar, terutama saat memilih antara kode, plugin, dan tema.
3.1. Semua konten tersimpan di satu tabel
WordPress menyimpan Post, Page, Attachment, Revision, dan semua CPT dalam satu tabel database yang sama, yaitu wp_posts. Yang membedakan satu jenis konten dari jenis lainnya adalah nilai kolom post_type. Sebuah artikel biasa punya post_type bernilai post, sebuah halaman bernilai page, dan sebuah ulasan yang didaftarkan sebagai CPT akan bernilai ulasan. Karena itu membuat CPT tidak membuat tabel baru dan tidak mengubah struktur database. Konsekuensinya, query WordPress tetap cepat, dan semua fitur bawaan — revisi, status terbit, sampah (trash), dan penjadwalan — langsung berlaku untuk CPT tanpa pekerjaan tambahan.
3.2. Registrasi, bukan instalasi
CPT tidak “diinstal” seperti plugin dan tidak “dibuat” seperti halaman. CPT didaftarkan (registered) setiap kali WordPress dimuat, melalui fungsi register_post_type() yang dipanggil pada hook init. Bila kode registrasi dihapus atau plugin pendaftarnya dinonaktifkan, CPT itu hilang dari menu admin dan arsipnya tidak lagi bisa diakses — tetapi datanya tidak terhapus dari database. Kontennya tetap tersimpan di wp_posts dengan post_type yang sama, dan akan muncul kembali begitu registrasi diaktifkan lagi. Sifat ini penting untuk dipahami: mengganti tema atau menonaktifkan plugin tidak menghancurkan konten, tetapi bisa membuat konten itu tidak terlihat sampai registrasi dipulihkan.
3.3. Argumen utama register_post_type()
Fungsi register_post_type() menerima dua parameter: kunci CPT (string) dan array argumen. Menurut dokumentasi referensi WordPress Developer, kunci CPT maksimal 20 karakter dan hanya boleh berisi huruf kecil alfanumerik, dash, dan underscore. Argumen yang paling sering dipakai publisher adalah sebagai berikut.
| Argumen | Fungsi | Nilai umum untuk publisher |
|---|---|---|
label / labels | Nama yang tampil di menu admin | “Ulasan”, “Acara” |
public | Apakah CPT tampil di front-end dan admin | true untuk konten publik, false untuk data internal |
publicly_queryable | Apakah CPT bisa diakses lewat URL | Mengikuti public bila tidak diisi |
exclude_from_search | Apakah CPT dikeluarkan dari hasil pencarian situs | false bila ingin bisa dicari |
show_ui | Apakah CPT tampil di dashboard admin | true |
show_in_menu | Posisi menu CPT di sidebar admin | true (menu sendiri) atau nama menu induk |
show_in_rest | Apakah CPT tersedia di REST API dan editor blok | true (wajib untuk Gutenberg) |
has_archive | Apakah CPT punya halaman arsip | true (arsip di /{slug}/) |
rewrite | Pengaturan URL single CPT | array( 'slug' => 'ulasan' ) |
supports | Fitur editor yang diaktifkan | title, editor, thumbnail, excerpt, comments, author, revisions |
hierarchical | Apakah CPT berperilaku seperti Page (punya induk-anak) | false untuk kebanyakan CPT |
menu_icon | Ikon dashicon di sidebar admin | 'dashicons-star-filled' |
menu_position | Urutan menu di sidebar | Angka, misalnya 5 |
capability_type | Kelompok hak akses yang dipakai | 'post' (bawaan) atau kustom |
taxonomies | Taxonomy yang diikat ke CPT | array( 'category' ) bila ingin memakai kategori bawaan |
Nilai bawaan public adalah false. Artinya, bila argumen ini tidak diisi, CPT tidak akan tampil di front-end maupun admin meski kodenya sudah benar — salah satu penyebab paling umum CPT “tidak muncul” setelah didaftarkan. Nilai bawaan hierarchical adalah false, sehingga CPT berperilaku seperti Post (tanpa induk-anak) kecuali dinyatakan sebaliknya. Nilai bawaan capability_type adalah post, yang berarti hak akses CPT mengikuti hak akses Post biasa.
3.4. Kapan registrasi terjadi
Dokumentasi WordPress menegaskan registrasi CPT tidak boleh dilakukan sebelum hook init. Praktik standarnya adalah mengaitkan fungsi registrasi ke init dengan add_action( 'init', 'nama_fungsi_anda' ). Alasannya teknis tetapi penting: banyak bagian WordPress — termasuk sistem query dan rewrite rule — baru siap setelah init, dan mendaftarkan CPT lebih awal bisa menyebabkan taxonomy tidak terikat dengan benar atau query tidak mengenali CPT tersebut. Aturan yang sama berlaku untuk taxonomy: register_taxonomy() juga tidak boleh dipanggil sebelum init.
4. Cara Membuat Custom Post Type dengan Kode
Cara ini memberi kontrol penuh dan tidak bergantung pada plugin pihak ketiga. Kode registrasi sebaiknya diletakkan di plugin kustom kecil (atau plugin functionality), bukan di functions.php tema, supaya CPT tetap terdaftar bila tema diganti. Bila Anda memakai child theme, letakkan kode di functions.php child theme hanya bila Anda sadar risikonya: mengganti tema akan menyembunyikan CPT sampai kode dipindahkan.
4.1. Contoh lengkap: CPT “Ulasan”
Berikut contoh registrasi CPT “Ulasan” yang sudah siap dipakai dan mengikuti dokumentasi resmi WordPress Developer. Contoh ini memakai label berbahasa Indonesia, mengaktifkan gambar unggulan dan excerpt, membuat arsip di /ulasan/, dan mengaktifkan editor blok serta REST API.
<?php
add_action( 'init', 'bangeko_register_ulasan_cpt' );
function bangeko_register_ulasan_cpt() {
$labels = array(
'name' => 'Ulasan',
'singular_name' => 'Ulasan',
'menu_name' => 'Ulasan',
'add_new' => 'Tambah Baru',
'add_new_item' => 'Tambah Ulasan Baru',
'edit_item' => 'Edit Ulasan',
'new_item' => 'Ulasan Baru',
'view_item' => 'Lihat Ulasan',
'search_items' => 'Cari Ulasan',
'not_found' => 'Tidak ada ulasan ditemukan',
'not_found_in_trash' => 'Tidak ada ulasan di sampah',
);
$args = array(
'labels' => $labels,
'description' => 'Ulasan produk dan layanan untuk pembaca.',
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'show_in_rest' => true,
'has_archive' => true,
'rewrite' => array( 'slug' => 'ulasan' ),
'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt', 'author', 'revisions' ),
'menu_icon' => 'dashicons-star-filled',
'menu_position' => 5,
);
register_post_type( 'ulasan', $args );
}
Setelah kode ini aktif, menu “Ulasan” muncul di sidebar admin, lengkap dengan submenu “Tambah Baru”. URL arsipnya adalah https://situsanda.com/ulasan/ dan URL satu ulasan adalah https://situsanda.com/ulasan/nama-produk/. Perhatikan nama kuncinya: ulasan hanya 6 karakter, huruf kecil semua, dan jauh di bawah batas 20 karakter.
4.2. Memilih nilai supports yang tepat
Argumen supports menentukan kolom dan panel apa yang tersedia di layar editor. Nilai yang paling umum adalah title (judul), editor (isi), thumbnail (gambar unggulan), excerpt (ringkasan), author (penulis), comments (komentar), revisions (riwayat revisi), custom-fields (custom field bawaan), dan page-attributes (untuk CPT hierarkis: pilihan induk dan urutan). Publisher sebaiknya hanya mengaktifkan yang benar-benar dipakai. Mengaktifkan comments pada CPT “Lowongan” misalnya hanya menambah kolom yang tidak pernah dipakai, sedangkan melewatkan thumbnail pada CPT “Ulasan” berarti gambar unggulan tidak bisa dipasang dari editor.
4.3. CPT publik vs CPT internal
Tidak semua CPT harus bisa diakses publik. Contoh CPT internal adalah “Data Iklan” untuk menyimpan materi iklan, atau “Arsip Naskah” untuk naskah yang belum layak terbit. Untuk CPT internal, isi public dengan false dan show_ui dengan true: CPT tetap bisa dikelola dari dashboard, tetapi tidak punya URL publik, tidak masuk sitemap, dan tidak muncul di hasil pencarian situs. Sebaliknya, CPT “Ulasan” yang ingin dibaca publik harus memakai public bernilai true. Perlu diingat, nilai exclude_from_search secara bawaan adalah kebalikan dari public, jadi CPT publik otomatis bisa dicari dari kotak pencarian situs kecuali Anda mengecualikannya secara eksplisit.
4.4. CPT hierarkis: jarang dibutuhkan publisher
Bila hierarchical diisi true, CPT berperilaku seperti Page: setiap item bisa punya induk, dan URL-nya bisa berjenjang (misalnya /direktori/lembaga/divisi/). Sebagian besar kebutuhan publisher — ulasan, acara, lowongan — tidak butuh hierarki, sehingga nilai bawaan false sudah tepat. Hierarki hanya berguna untuk struktur seperti dokumentasi bertingkat atau direktori organisasi yang memang berjenjang. CPT hierarkis juga mengubah tampilan editor: kolom “Page Attributes” muncul untuk memilih induk dan urutan, dan nilai supports perlu menyertakan page-attributes.
4.5. Mengaktifkan permalink setelah registrasi
Langkah yang paling sering terlupakan: setelah CPT baru didaftarkan, buka Pengaturan > Permalink di dashboard lalu klik “Simpan Perubahan” tanpa mengubah apa pun. Tindakan ini menyegarkan rewrite rules WordPress sehingga URL arsip dan single CPT dikenali. Bila langkah ini dilewati, pengunjung yang membuka /ulasan/ biasanya mendapat halaman 404 meski CPT sudah terdaftar dengan benar. Aturan yang sama berlaku setiap kali slug CPT atau taxonomy diubah.
5. Cara Membuat Taxonomy Kustom dengan Kode
Taxonomy kustom didaftarkan dengan fungsi register_taxonomy(), yang menerima tiga parameter: kunci taxonomy, tipe objek yang diikat (satu CPT atau array beberapa CPT), dan array argumen. Menurut dokumentasi referensi WordPress Developer, kunci taxonomy maksimal 32 karakter dan hanya boleh berisi huruf kecil alfanumerik, dash, dan underscore. Label bawaan mengikuti sifat taxonomy: taxonomy hierarkis memakai label gaya kategori, sedangkan taxonomy non-hierarkis memakai label gaya tag.
5.1. Contoh lengkap: taxonomy “Merek” dan “Fitur” untuk CPT Ulasan
Contoh berikut mendaftarkan dua taxonomy untuk CPT ulasan dari bagian sebelumnya. “Merek” dibuat hierarkis (seperti kategori: Elektronik > Smartphone > Android), sedangkan “Fitur” dibuat datar (seperti tag: tahan air, NFC, fast charging). Keduanya diaktifkan untuk REST API dan editor blok.
<?php
add_action( 'init', 'bangeko_register_ulasan_taxonomies' );
function bangeko_register_ulasan_taxonomies() {
// Taxonomy hierarkis: Merek
$merek_labels = array(
'name' => 'Merek',
'singular_name' => 'Merek',
'menu_name' => 'Merek',
'search_items' => 'Cari Merek',
'all_items' => 'Semua Merek',
'edit_item' => 'Edit Merek',
'add_new_item' => 'Tambah Merek Baru',
);
register_taxonomy( 'merek', array( 'ulasan' ), array(
'labels' => $merek_labels,
'public' => true,
'hierarchical' => true,
'show_ui' => true,
'show_admin_column' => true,
'show_in_rest' => true,
'query_var' => true,
'rewrite' => array( 'slug' => 'merek' ),
) );
// Taxonomy datar: Fitur
$fitur_labels = array(
'name' => 'Fitur',
'singular_name' => 'Fitur',
'menu_name' => 'Fitur',
);
register_taxonomy( 'fitur', array( 'ulasan' ), array(
'labels' => $fitur_labels,
'public' => true,
'hierarchical' => false,
'show_ui' => true,
'show_admin_column' => true,
'show_in_rest' => true,
'query_var' => true,
'rewrite' => array( 'slug' => 'fitur' ),
) );
}
Setelah kode ini aktif, panel “Merek” muncul di editor Ulasan sebagai kotak centang seperti kategori, sedangkan panel “Fitur” muncul sebagai kolom isian seperti tag. Arsip per merek tersedia di /merek/nama-merek/, dan arsip per fitur di /fitur/nama-fitur/.
5.2. Hierarkis atau datar: cara memilih
Pilih hierarkis bila kelompoknya punya struktur induk-anak yang stabil dan jarang berubah, misalnya Merek > Seri, atau Lokasi > Provinsi > Kota. Kotak centang di editor memudahkan redaksi karena tinggal memilih dari daftar yang sudah ada. Pilih datar bila kelompoknya berupa label bebas yang bisa bertambah kapan saja, misalnya fitur produk, topik, atau kata kunci. Kolom isian bebas pada taxonomy datar memungkinkan redaksi mengetik istilah baru tanpa membuka layar taxonomy terlebih dahulu. Keputusan ini bisa diubah kemudian, tetapi mengubah taxonomy hierarkis menjadi datar (atau sebaliknya) setelah banyak konten terbit membutuhkan migrasi istilah yang merepotkan, jadi putuskan sejak awal.
5.3. Argumen taxonomy yang paling relevan
Argumen show_admin_column bernilai true menambahkan kolom taxonomy di daftar CPT pada dashboard, sehingga redaksi bisa melihat sekilas merek atau fitur setiap ulasan tanpa membuka editor. Argumen query_var bernilai true mengizinkan taxonomy dipakai sebagai parameter query di URL, misalnya ?merek=samsung. Argumen rewrite mengatur slug arsip taxonomy; tanpa argumen ini, WordPress memakai kunci taxonomy sebagai slug. Satu catatan penting dari dokumentasi: bila taxonomy didaftarkan tanpa mengikat CPT di parameter kedua, taxonomy itu terdaftar tetapi tidak muncul di antarmuka admin untuk CPT mana pun, sampai diikat dengan register_taxonomy_for_object_type() atau lewat argumen taxonomies pada register_post_type(). Karena itu contoh di atas langsung mengikat taxonomy ke CPT ulasan pada parameter kedua.
5.4. Memakai kategori dan tag bawaan pada CPT
CPT tidak wajib memakai taxonomy kustom. Bila publisher ingin CPT “Ulasan” tetap memakai kategori bawaan WordPress, cukup tambahkan 'taxonomies' => array( 'category', 'post_tag' ) pada argumen register_post_type(). Pendekatan ini masuk akal bila kategori situs sudah mapan dan CPT hanyalah cara lain menampilkan artikel dengan struktur yang sama. Kekurangannya, kategori dan tag itu juga dipakai Post biasa, sehingga arsip kategori akan mencampur artikel dan ulasan — sesuatu yang justru ingin dihindari sebagian publisher. Sebagai patokan: bila pengelompokannya memang khusus untuk CPT itu, buat taxonomy kustom; bila pengelompokannya memang sama dengan artikel biasa, pakai kategori bawaan.
6. Cara Membuat CPT dan Taxonomy Tanpa Kode dengan Plugin CPT UI
Publisher yang tidak menulis kode tetap bisa memakai CPT melalui plugin. Plugin yang paling mapan untuk kebutuhan ini adalah Custom Post Type UI (CPT UI) dari WebDevStudios. Menurut halaman resminya di WordPress.org, plugin ini memiliki 1+ juta instalasi aktif, versi 1.18.3 (diperbarui 8 Januari 2026), membutuhkan WordPress 6.6 atau lebih baru dan PHP 7.4 atau lebih baru, serta sudah diuji sampai WordPress 6.9.4. Angka-angka ini dikutip dari halaman plugin di WordPress.org pada saat artikel ini ditulis; periksa halaman tersebut untuk angka terbaru.
6.1. Langkah membuat CPT dengan CPT UI
Pertama, pasang dan aktifkan plugin dari menu Plugin > Tambah Baru, lalu cari “Custom Post Type UI”. Setelah aktif, menu “CPT UI” muncul di sidebar admin. Buka CPT UI > Add/Edit Post Types, isi kolom Post Type Slug (misalnya ulasan, huruf kecil, maksimal 20 karakter), Plural Label (“Ulasan”), dan Singular Label (“Ulasan”). Pada bagian Settings, aktifkan opsi yang dibutuhkan: Public, Show in Menu, Has Archive, Show in REST API, dan Supports (title, editor, thumbnail, excerpt). Simpan, lalu buka Pengaturan > Permalink dan simpan ulang. CPT langsung bisa dipakai: menu “Ulasan” muncul di sidebar dan editornya siap diisi.
6.2. Langkah membuat taxonomy dengan CPT UI
Buka CPT UI > Add/Edit Taxonomies, isi Taxonomy Slug (misalnya merek), Plural Label (“Merek”), dan Singular Label (“Merek”). Pada bagian Attach to Post Type, centang CPT yang memakai taxonomy ini (misalnya ulasan). Pada bagian Settings, tentukan Hierarchical (centang untuk taxonomy gaya kategori, kosongkan untuk gaya tag), Public, Show in REST API, dan Show Admin Column. Simpan, lalu simpan ulang Permalink. Taxonomy langsung muncul di editor CPT terkait.
6.3. Kelebihan dan batas CPT UI
Kelebihannya jelas: tidak perlu menulis PHP, pengaturan bisa diubah dari dashboard, dan CPT UI menyediakan fitur ekspor-impor kode PHP hasil pengaturannya, sehingga publisher bisa memindahkan definisi CPT ke plugin kustom sendiri bila suatu hari ingin lepas dari plugin. Kekurangannya juga perlu dipahami. CPT UI hanya mendaftarkan jenis konten dan taxonomy; ia tidak membuat field tambahan (untuk skor, harga, atau tanggal acara, publisher tetap butuh plugin custom field seperti Advanced Custom Fields), dan ia tidak membuatkan template tampilan — desain arsip dan halaman single tetap menjadi tugas tema. Selain itu, definisi CPT tersimpan sebagai pengaturan plugin: bila plugin dinonaktifkan, CPT hilang dari admin (datanya tetap aman di database, seperti dijelaskan di bagian 3.2). Karena itu, untuk CPT yang menjadi tulang punggung situs, banyak pengembang menyarankan mengekspor kode PHP dari CPT UI lalu menaruhnya di plugin kustom kecil, sehingga situs tidak bergantung pada satu plugin selamanya.
6.4. Alternatif plugin lain
Selain CPT UI, ada plugin sejenis seperti Pods dan Toolset Types yang menggabungkan pendaftaran CPT dengan custom field dan template. Pilihan ini masuk akal bila publisher ingin satu paket lengkap tanpa menulis kode sama sekali. Namun prinsipnya sama: apa pun pluginnya, pahami dulu kebutuhan struktur kontennya, baru memilih alat. Plugin tidak memperbaiki struktur konten yang sejak awal salah dirancang.
7. Cara Menampilkan CPT di Tema: Arsip, Single, dan Query
Mendaftarkan CPT baru separuh pekerjaan. Separuh lainnya adalah memastikan CPT itu tampil dengan benar di front-end. WordPress sudah menyediakan perilaku bawaan, tetapi publisher biasanya perlu menyesuaikan template agar arsip CPT terlihat seperti bagian situs, bukan seperti halaman arsip generik.
7.1. Template hierarchy untuk CPT dan taxonomy
WordPress memilih file template berdasarkan hierarki yang sudah baku. Untuk halaman single CPT, urutannya adalah single-{post_type}.php, lalu single.php, lalu singular.php, lalu index.php. Untuk arsip CPT, urutannya adalah archive-{post_type}.php, lalu archive.php, lalu index.php. Untuk arsip taxonomy kustom, urutannya menurut Theme Handbook WordPress Developer adalah taxonomy-{taxonomy}-{term}.php, lalu taxonomy-{taxonomy}.php, lalu taxonomy.php, lalu archive.php, lalu index.php.
Artinya, tema yang tidak menyediakan template khusus tetap menampilkan CPT dengan template generiknya — konten tidak hilang, hanya tampilannya mengikuti template arsip dan single standar. Publisher yang ingin arsip “Ulasan” menampilkan kartu skor dan harga perlu membuat archive-ulasan.php dan single-ulasan.php di child theme, atau menyesuaikannya lewat page builder dan blok query bila temanya mendukung. Satu praktik yang dianjurkan Theme Handbook: saat membuat template taxonomy baru, salin file template terdekat dalam hierarki (misalnya archive.php) sebagai titik awal, lalu ubah seperlunya, bukan menulis dari nol.
7.2. Menampilkan CPT dengan WP_Query
Bila publisher ingin menampilkan CPT di halaman biasa — misalnya blok “Ulasan Terbaru” di beranda — cara standarnya adalah WP_Query dengan parameter post_type. Contoh berikut mengambil lima ulasan terbaru:
<?php
$args = array(
'post_type' => 'ulasan',
'posts_per_page' => 5,
'post_status' => 'publish',
'orderby' => 'date',
'order' => 'DESC',
);
$ulasan_query = new WP_Query( $args );
if ( $ulasan_query->have_posts() ) :
while ( $ulasan_query->have_posts() ) :
$ulasan_query->the_post();
the_title( '<h2>', '</h2>' );
the_excerpt();
endwhile;
wp_reset_postdata();
endif;
?>
Perintah wp_reset_postdata() di akhir hukumnya wajib: ia mengembalikan data post global ke query utama, sehingga loop lain di halaman tidak ikut berubah. Tanpa perintah ini, widget atau blok lain di halaman yang sama bisa menampilkan judul dan konten yang salah. Untuk memfilter berdasarkan taxonomy, tambahkan parameter tax_query, misalnya hanya ulasan dengan merek tertentu:
<?php
$args = array(
'post_type' => 'ulasan',
'posts_per_page' => 5,
'tax_query' => array(
array(
'taxonomy' => 'merek',
'field' => 'slug',
'terms' => 'samsung',
),
),
);
$ulasan_query = new WP_Query( $args );
?>
7.3. Blok Query dan pola blok di editor modern
Publisher yang memakai editor blok tidak selalu perlu menulis PHP. Blok Query (Query Loop) di editor blok bisa diatur untuk menampilkan CPT tertentu, dan filter taxonomy bisa dipilih dari panel pengaturannya bila CPT sudah diaktifkan untuk REST API (show_in_rest bernilai true). Inilah salah satu alasan argumen itu penting: tanpa show_in_rest, CPT tidak muncul di pilihan blok modern dan redaksi terpaksa kembali ke kode. Bila tema memakai Full Site Editing, template arsip CPT juga bisa dibuat lewat editor situs (Appearance > Editor) tanpa menyentuh file PHP sama sekali, meski untuk kontrol penuh file template PHP tetap lebih fleksibel.
7.4. Menu navigasi dan widget
CPT publik yang memiliki arsip bisa ditambahkan ke menu navigasi WordPress dari Appearance > Menus: arsip CPT muncul sebagai pilihan di panel menu setelah CPT didaftarkan. Taxonomy kustom juga muncul di panel menu sebagai daftar istilah yang bisa ditambahkan satu per satu. Untuk widget dan area sidebar, CPT bisa ditampilkan lewat blok Query atau widget “Latest Posts” yang diatur ke CPT tertentu bila temanya mendukung. Pastikan menu dan widget diperbarui setelah CPT baru diluncurkan, karena pengunjung tidak akan menemukan arsip yang tidak ditautkan dari mana pun.
8. CPT, SEO, dan AdSense: yang Perlu Diperhatikan Publisher
CPT memengaruhi cara Google menemukan dan memahami konten, serta cara iklan ditempatkan. Publisher yang mengabaikan bagian ini bisa mendapat arsip CPT yang tidak terindeks, atau sebaliknya: arsip taxonomy tipis yang menggerus kualitas situs di mata Google.
8.1. Sitemap dan indeksasi
Sebagian besar plugin SEO populer — termasuk Rank Math dan Yoast SEO — mendeteksi CPT publik secara otomatis dan memasukkannya ke sitemap XML, beserta arsip taxonomy-nya. Publisher tetap perlu memeriksa pengaturan sitemap setelah CPT baru diluncurkan: pastikan CPT yang memang untuk publik masuk sitemap, dan CPT internal (atau arsip taxonomy yang hampir kosong) dikeluarkan. Aturan praktisnya: hanya daftarkan sebagai public CPT yang memang ingin ditemukan lewat Google. CPT internal memakai public bernilai false sehingga tidak masuk sitemap dan tidak terindeks.
8.2. Arsip taxonomy yang tipis dan konten duplikat
Risiko SEO terbesar dari taxonomy kustom adalah arsip yang terlalu tipis. Bila taxonomy “Fitur” punya 40 istilah tetapi masing-masing hanya berisi satu ulasan, Google melihat 40 halaman arsip yang hampir identik dan nyaris tanpa nilai tambah. Praktik yang lebih aman: buat istilah taxonomy hanya bila sudah ada beberapa konten yang memakainya, gabungkan istilah yang terlalu mirip, dan pertimbangkan mengatur arsip taxonomy yang sangat tipis ke noindex lewat plugin SEO sampai isinya memadai. Masalah terkait adalah duplikasi: halaman arsip taxonomy yang menampilkan excerpt sama dengan halaman arsip CPT bisa dianggap konten duplikat bila tidak ada pembeda. Menambahkan deskripsi unik pada istilah taxonomy (kolom deskripsi tersedia di layar edit istilah) membantu memberi konteks yang membedakan satu arsip dari arsip lain.
8.3. Struktur URL dan permalink
Slug CPT dan taxonomy sebaiknya pendek, deskriptif, dan stabil. Mengubah slug setelah konten terbit berarti mengubah semua URL single dan arsipnya, sehingga membutuhkan redirect 301 agar ranking dan tautan lama tidak hilang. Karena itu putuskan slug sejak awal: ulasan lebih baik daripada ulasan-produk-dan-layanan-terbaru. Hindari juga tabrakan nama: slug CPT tidak boleh sama dengan slug Page yang sudah ada, karena WordPress akan memprioritaskan salah satunya dan halaman yang lain bisa menampilkan konten yang salah atau error 404. Sebelum mendaftarkan CPT baru, periksa daftar Page dan kategori yang sudah ada untuk memastikan tidak ada slug yang berbenturan.
8.4. Penempatan iklan AdSense pada CPT
Dari sudut pandang AdSense, CPT hanyalah halaman seperti halaman lainnya: kebijakan konten yang berlaku sama, dan unit iklan bisa dipasang di template single dan arsip CPT seperti di template Post biasa. Keuntungan CPT justru terletak pada penempatan yang lebih presisi: karena template single-ulasan.php hanya dipakai ulasan, publisher bisa memasang unit iklan yang memang dirancang untuk halaman ulasan — misalnya unit in-article di bawah blok skor — tanpa memengaruhi artikel berita. Sebaliknya, arsip CPT yang menampilkan banyak excerpt dalam satu halaman perlu dijaga agar iklan tidak terlalu padat dan tidak melanggar kebijakan penempatan. Prinsip yang sama berlaku seperti di artikel biasa: iklan harus bisa dibedakan dari konten, tidak boleh menutupi konten, dan tidak boleh dipasang pada halaman yang hampir tanpa konten asli (misalnya arsip taxonomy yang hanya berisi satu excerpt pendek).
8.5. Performa: CPT tidak membuat situs lambat dengan sendirinya
Membuat CPT tidak menambah tabel database dan tidak menambah query berat secara otomatis. Yang membuat situs lambat adalah query yang buruk — misalnya WP_Query tanpa batas posts_per_page yang menampilkan ratusan item sekaligus, atau arsip taxonomy dengan meta query yang tidak terindeks. Selama query dibatasi jumlahnya, memakai cache objek atau page cache seperti biasa, dan gambar memakai lazy load, CPT tidak akan menjadi sumber masalah performa. Bila CPT dipakai untuk ribuan item (misalnya direktori sekolah se-Indonesia), pertimbangkan pagination yang benar dan hindari query yang memuat semua item sekaligus.
9. CPT dan WordPress REST API
REST API adalah salah satu alasan terkuat memakai CPT di era modern: CPT yang terdaftar dengan benar bisa diakses aplikasi lain tanpa plugin tambahan.
9.1. Mengaktifkan CPT untuk REST API
Menurut REST API Handbook WordPress Developer, bila sebuah CPT ingin tersedia lewat REST API, argumen show_in_rest pada register_post_type() harus bernilai true. Pengaturan ini menambahkan rute di namespace wp/v2 — misalnya /wp-json/wp/v2/ulasan untuk daftar ulasan dan /wp-json/wp/v2/ulasan/{id} untuk satu ulasan. Argumen opsional rest_base bisa dipakai untuk mengubah dasar URL rute tersebut, misalnya dari ulasan menjadi reviews, dan rest_controller_class bisa dipakai untuk mengganti controller bawaan WP_REST_Posts_Controller dengan controller kustom. Cara yang sama berlaku untuk taxonomy: isi show_in_rest dengan true pada register_taxonomy(), dan rute taxonomy tersedia di /wp-json/wp/v2/merek dengan controller bawaan WP_REST_Terms_Controller.
9.2. Mengaktifkan REST API untuk CPT yang tidak Anda kendalikan
Bila CPT didaftarkan oleh tema atau plugin pihak ketiga tanpa dukungan REST API, Anda tidak perlu mengubah kode aslinya. WordPress menyediakan filter register_post_type_args (tersedia sejak WordPress 4.6.0) untuk mengubah argumen registrasi CPT yang sudah ada, dan filter register_taxonomy_args (sejak WordPress 4.4.0) untuk taxonomy. Contoh berikut mengaktifkan REST API untuk CPT ulasan yang didaftarkan pihak lain:
<?php
add_filter( 'register_post_type_args', 'bangeko_aktifkan_rest_ulasan', 10, 2 );
function bangeko_aktifkan_rest_ulasan( $args, $post_type ) {
if ( 'ulasan' === $post_type ) {
$args['show_in_rest'] = true;
}
return $args;
}
?>
Pendekatan filter ini juga berlaku untuk mengubah argumen lain, misalnya mengaktifkan arsip atau mengubah slug rewrite, tanpa menyentuh kode plugin atau tema aslinya.
9.3. Penggunaan praktis untuk publisher
Dengan REST API aktif, aplikasi mobile, situs satelit, atau dasbor internal bisa mengambil daftar ulasan terbaru, memfilter berdasarkan taxonomy merek, atau menampilkan arsip acara tanpa masuk ke dashboard WordPress. Otomasi konten — misalnya mengimpor data lowongan dari sistem HR — juga lebih mudah karena endpoint CPT mengikuti pola yang sama dengan endpoint Post biasa. Satu catatan keamanan: endpoint publik hanya menampilkan konten berstatus publish untuk pengunjung anonim; konten draft dan privat tetap membutuhkan autentikasi, sama seperti endpoint Post bawaan. Bila CPT menyimpan data internal, pastikan public bernilai false atau atur ulang hak aksesnya, supaya data itu tidak ikut terekspos lewat API.
10. Kesalahan Umum dan Cara Menghindarinya
Sebagian besar masalah CPT berasal dari beberapa kesalahan yang berulang. Berikut daftar yang paling sering ditemui publisher, beserta perbaikannya.
10.1. Lupa menyimpan ulang Permalink
Gejalanya: CPT sudah terdaftar dan menu admin muncul, tetapi halaman arsip dan single menampilkan 404. Perbaikannya: buka Pengaturan > Permalink lalu klik Simpan Perubahan. Ulangi langkah ini setiap kali slug CPT atau taxonomy diubah, dan setiap kali CPT baru didaftarkan. Ini adalah perbaikan pertama yang harus dicoba untuk semua masalah 404 terkait CPT.
10.2. Mendaftarkan CPT di functions.php tema
Gejalanya: setelah ganti tema, seluruh CPT hilang dari admin dan arsipnya 404. Datanya tidak hilang — hanya registrasinya yang ikut tema lama. Perbaikannya: pindahkan kode registrasi ke plugin kustom kecil atau plugin functionality, atau ekspor kode dari CPT UI ke plugin. Bila Anda memakai child theme, sadari bahwa CPT tetap terikat pada tema itu.
10.3. Nama kunci terlalu panjang atau memakai huruf besar
Gejalanya: CPT tidak terdaftar sama sekali, atau berperilaku aneh. Penyebabnya: kunci CPT melebihi 20 karakter, memakai huruf besar, spasi, atau karakter khusus. Perbaikannya: gunakan kunci pendek, huruf kecil semua, dan hanya huruf, angka, dash, dan underscore. Contoh yang aman: ulasan, acara, lowongan, resep. Contoh yang bermasalah: UlasanProdukTerbaru (huruf besar dan lebih dari 20 karakter) atau ulasan produk (mengandung spasi).
10.4. Lupa mengisi show_in_rest
Gejalanya: CPT hanya bisa diedit dengan editor klasik, tidak muncul di blok Query, dan tidak tersedia di REST API. Perbaikannya: tambahkan 'show_in_rest' => true pada argumen registrasi. Ini wajib untuk semua CPT baru yang dibuat pada WordPress modern, kecuali ada alasan khusus untuk mematikannya.
10.5. Taxonomy tidak terikat ke CPT
Gejalanya: taxonomy berhasil didaftarkan tetapi tidak muncul di editor CPT. Penyebabnya: parameter $object_type pada register_taxonomy() kosong atau salah, atau argumen taxonomies pada register_post_type() tidak diisi. Perbaikannya: ikat taxonomy saat mendaftarkannya (parameter kedua register_taxonomy()), atau panggil register_taxonomy_for_object_type() setelah kedua fungsi registrasi berjalan.
10.6. Tabrakan slug dengan Page atau kategori
Gejalanya: arsip CPT menampilkan halaman yang salah, atau Page yang sudah ada tiba-tiba 404 setelah CPT didaftarkan. Perbaikannya: pilih slug yang belum dipakai Page, kategori, atau CPT lain. Periksa dulu daftar slug yang ada sebelum mendaftarkan CPT baru, dan bila tabrakan sudah terjadi, ubah slug CPT lalu simpan ulang Permalink dan pasang redirect 301 dari URL lama.
10.7. Membuat terlalu banyak CPT
Gejalanya: sidebar admin penuh menu, redaksi bingung memilih tempat menulis, dan template menumpuk. Perbaikannya: tinjau kembali kebutuhan di bagian 2. Bila dua CPT hanya berbeda label tetapi strukturnya sama, kemungkinan besar satu CPT dengan taxonomy sudah cukup. Sebagai patokan, situs media kecil umumnya cukup dengan satu sampai tiga CPT tambahan di luar Post dan Page.
10.8. Mengabaikan hak akses
Gejalanya: semua peran pengguna bisa menerbitkan CPT sensitif, atau sebaliknya, penulis tidak bisa menyimpan draft CPT yang seharusnya bisa mereka tulis. Perbaikannya: atur capability_type dan capabilities sejak awal. Untuk kebutuhan sederhana, capability_type bernilai post sudah cukup karena mengikuti peran bawaan WordPress. Untuk CPT yang butuh pemisahan peran, definisikan capability kustom dan petakan ke peran dengan plugin manajemen peran atau kode.
11. Checklist Sebelum Meluncurkan CPT Baru
Gunakan checklist ini sebagai pemeriksaan akhir sebelum CPT diumumkan ke redaksi atau dipublikasikan ke pembaca.
- Nama kunci CPT maksimal 20 karakter, huruf kecil, tanpa spasi; nama kunci taxonomy maksimal 32 karakter.
- Registrasi dipanggil pada hook
init, bukan sebelum atau sesudahnya. - Argumen
publicsudah diputuskan dengan sadar:trueuntuk konten publik,falseuntuk data internal. - Argumen
show_in_restbernilaitrueuntuk CPT yang memakai editor blok dan REST API. - Argumen
supportshanya berisi fitur yang benar-benar dipakai di editor. - Taxonomy sudah diikat ke CPT yang benar, dan sifat hierarkis atau datarnya sudah diputuskan.
- Permalink sudah disimpan ulang dan arsip CPT bisa dibuka tanpa 404.
- Template
archive-{post_type}.phpdansingle-{post_type}.phpsudah dibuat atau tampilan generiknya sudah diperiksa. - CPT masuk atau dikeluarkan dari sitemap sesuai keputusan indeksasi.
- Menu navigasi sudah menautkan arsip CPT bila arsip itu memang untuk publik.
- Penempatan iklan pada template CPT sudah diperiksa dan tidak melanggar kebijakan AdSense.
- Kode registrasi tersimpan di plugin, bukan di
functions.phptema, supaya CPT bertahan saat ganti tema. - Backup situs sudah dibuat sebelum perubahan diterapkan di situs live, dan perubahan sudah diuji di staging bila tersedia.
- Redaksi sudah diberi panduan singkat: di mana menulis, taxonomy apa yang dipakai, dan siapa yang boleh menerbitkan.
12. FAQ
Apakah Custom Post Type memengaruhi kecepatan situs?
Tidak secara langsung. CPT tidak membuat tabel database baru dan tidak menambah query berat dengan sendirinya. Yang memengaruhi kecepatan adalah query yang buruk (misalnya menampilkan ratusan item tanpa pagination) dan template yang berat. Selama query dibatasi dan cache berjalan seperti biasa, CPT tidak menjadi sumber masalah performa.
Apakah konten CPT hilang bila plugin CPT UI dinonaktifkan?
Tidak. Konten tersimpan di tabel wp_posts dengan penanda post_type dan tetap ada di database. Yang hilang hanya registrasinya, sehingga CPT tidak muncul di admin dan arsipnya tidak bisa diakses sampai registrasi diaktifkan kembali — misalnya dengan mengaktifkan lagi pluginnya atau memindahkan kode registrasi ke plugin kustom.
Apakah CPT bisa memakai kategori dan tag bawaan WordPress?
Bisa. Tambahkan 'taxonomies' => array( 'category', 'post_tag' ) pada argumen register_post_type(), atau centang kategori dan tag pada pengaturan CPT UI. Kekurangannya, arsip kategori akan mencampur Post biasa dan CPT, jadi pendekatan ini paling cocok bila pengelompokannya memang sama dengan artikel biasa.
Bagaimana cara menampilkan CPT di beranda?
Gunakan WP_Query dengan parameter post_type berisi kunci CPT, atau gunakan blok Query di editor blok dan pilih CPT tersebut dari pengaturannya. Pastikan show_in_rest bernilai true supaya CPT muncul di pilihan blok. Jangan lupa memanggil wp_reset_postdata() setelah loop kustom berbasis WP_Query agar query utama halaman tidak terganggu.
Apakah CPT otomatis masuk sitemap dan terindeks Google?
CPT dengan public bernilai true umumnya terdeteksi plugin SEO populer dan masuk sitemap XML secara otomatis, tetapi tetap periksa pengaturan sitemap setelah CPT diluncurkan. CPT internal (public bernilai false) tidak masuk sitemap dan tidak terindeks. Arsip taxonomy yang sangat tipis sebaiknya dipertimbangkan untuk noindex sampai isinya memadai.
Apakah saya harus memakai plugin atau menulis kode sendiri?
Keduanya sah. Plugin seperti CPT UI lebih cepat dan ramah untuk publisher tanpa latar belakang pemrograman, dan menyediakan ekspor kode PHP bila suatu hari ingin beralih ke kode sendiri. Kode sendiri memberi kontrol penuh dan menghilangkan ketergantungan pada plugin pihak ketiga, tetapi membutuhkan kemampuan PHP dan disiplin perawatan. Untuk CPT yang menjadi tulang punggung situs, banyak pengembang memilih kode di plugin kustom kecil; untuk CPT percobaan atau situs kecil, CPT UI sudah lebih dari cukup.
Kesimpulan
WordPress Custom Post Type dan taxonomy kustom adalah cara WordPress memberi struktur pada konten yang tidak cocok dengan cetakan Post dan Page. CPT menjawab “konten apa ini?” dan taxonomy menjawab “konten ini termasuk kelompok apa?” — dua pertanyaan sederhana yang bila dijawab dengan benar membuat arsip rapi, URL konsisten, pencarian akurat, dan penempatan iklan lebih presisi. Kuncinya ada pada keputusan di awal: hanya buat CPT bila ada kelompok konten yang strukturnya berbeda dan akan terus bertambah, putuskan slug dan sifat taxonomy sebelum konten menumpuk, daftarkan CPT lewat plugin (bukan tema), isi show_in_rest dengan true, dan jangan lupa menyimpan ulang Permalink. Publisher yang mengikuti langkah-langkah di artikel ini bisa meluncurkan CPT pertama — misalnya “Ulasan” dengan taxonomy “Merek” dan “Fitur” — dalam satu sesi kerja, lengkap dengan arsip, template, sitemap, dan dukungan REST API. Setelah struktur itu berjalan, CPT yang sama bisa dipakai ulang untuk kelompok konten berikutnya tanpa mengulang pekerjaan dari nol.
Sumber resmi yang dirujuk
- WordPress Developer — Fungsi
register_post_type(): batas 20 karakter untuk kunci post type, registrasi pada hookinit, argumenpublic,hierarchical,show_in_rest,supports, dancapability_type. https://developer.wordpress.org/reference/functions/register_post_type/ - WordPress Developer — Fungsi
register_taxonomy(): batas 32 karakter untuk kunci taxonomy, registrasi pada hookinit, argumenhierarchical, dan pengikatan taxonomy ke post type. https://developer.wordpress.org/reference/functions/register_taxonomy/ - WordPress Developer — REST API Handbook, “Adding REST API Support For Custom Content Types”:
show_in_rest,rest_base,rest_controller_class, filterregister_post_type_args(sejak 4.6.0) danregister_taxonomy_args(sejak 4.4.0). https://developer.wordpress.org/rest-api/extending-the-rest-api/adding-rest-api-support-for-custom-content-types/ - WordPress Developer — Theme Handbook, “Taxonomy Templates”: hierarki template
taxonomy-{taxonomy}-{term}.php,taxonomy-{taxonomy}.php,taxonomy.php,archive.php,index.php. https://developer.wordpress.org/themes/classic-themes/templates/taxonomy-templates/ - WordPress.org — Plugin Custom Post Type UI: 1+ juta instalasi aktif, versi 1.18.3 (8 Januari 2026), membutuhkan WordPress 6.6+ dan PHP 7.4+, diuji sampai WordPress 6.9.4. https://wordpress.org/plugins/custom-post-type-ui/
- WordPress Learn — Tutorial “Custom post types and capabilities”: argumen
capability_type,capabilities, danmap_meta_capuntuk mengatur hak akses CPT. https://learn.wordpress.org/tutorial/custom-post-types-and-capabilities/