Wordpress Custom Post Types Taxonomies Archive Templates Query Basics
Definisi
Custom Post Type (CPT) adalah tipe konten selain post/page bawaan, misalnya produk, portfolio, atau event. Taxonomy adalah cara mengelompokkan CPT (atau post), misalnya kategori-produk atau tag-event.
Kapan dipakai
Pakai CPT kalau datamu punya struktur dan lifecycle sendiri yang beda dari artikel blog. Jangan memaksakan semua ke post biasa hanya karena lebih mudah, karena nanti query, template, dan admin jadi berantakan.
Cara kerja
Register CPT
function register_produk_cpt() {
register_post_type('produk', [
'labels' => ['name' => 'Produk', 'singular_name' => 'Produk'],
'public' => true,
'has_archive' => true,
'rewrite' => ['slug' => 'produk'],
'supports' => ['title', 'editor', 'thumbnail'],
'show_in_rest' => true,
]);
}
add_action('init', 'register_produk_cpt');Register Taxonomy
register_taxonomy('kategori_produk', 'produk', [
'labels' => ['name' => 'Kategori Produk'],
'hierarchical' => true,
'rewrite' => ['slug' => 'kategori-produk'],
'show_in_rest' => true,
]);hierarchical => true membuatnya seperti kategori (punya parent), false seperti tag.
Template mapping
WordPress memetakan template berdasarkan nama file:
archive-produk.php→ halaman arsip/produk/single-produk.php→ halaman detail satu itemtaxonomy-kategori_produk.php→ arsip per taxonomy term
Kalau file tidak ada, fallback ke archive.php / single.php.
Query dasar
$query = new WP_Query([
'post_type' => 'produk',
'posts_per_page' => 10,
'tax_query' => [
[
'taxonomy' => 'kategori_produk',
'field' => 'slug',
'terms' => 'elektronik',
],
],
]);Struktur alur
Contoh
Loop arsip sederhana di archive-produk.php:
<?php while (have_posts()) : the_post(); ?>
<article>
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
</article>
<?php endwhile; ?>Catatan implementasi
- Selalu panggil
register_post_typedi hookinit, bukan di luar fungsi. - Set
show_in_rest => truekalau butuh akses dari REST API / block editor. has_archive => truemengaktifkan halaman arsip; tanpa itu, URL/produk/akan 404.- Jalankan
flush_rewrite_rules()sekali setelah register baru (atau simpan permalink di admin), supaya rewrite rule kebaca.
Kesalahan umum
- Rewrite rule tidak kebaca: lupa flush permalink setelah register CPT, URL jadi 404.
- Query di luar loop utama tidak di-reset: pakai
wp_reset_postdata()setelahWP_Querymanual, kalau tidak loop berikutnya rusak. - Taxonomy hierarki salah: butuh parent-child tapi
hierarchicalfalse, jadi tidak bisa nesting. - Menabrak slug bawaan: pakai slug yang sudah dipakai WordPress (misal
post,page), menyebabkan konflik.