WordPress WP Query
Definisi
WP_Query adalah class inti WordPress untuk mengambil postingan dari database. Hampir semua loop di theme maupun plugin berakhir di WP_Query (termasuk fungsi query_posts dan The Loop bawaan yang sebenarnya membungkusnya). Memahami parameter dan cara kerjanya penting supaya query tidak jadi bottleneck.
Kapan dipakai
Pakai WP_Query langsung kalau butuh kontrol penuh atas argumen: filter by meta, taxonomy, relasi antar keduanya, custom ordering, atau query yang tidak bisa dipenuhi oleh get_posts/pre_get_posts saja. Untuk arsip utama, lebih baik pakai pre_get_posts daripada query_posts (yang mengganti query global dan boros).
Cara kerja
Parameter umum
$args = [
'post_type' => 'produk',
'posts_per_page' => 12,
'orderby' => 'date',
'order' => 'DESC',
'post_status' => 'publish',
'paged' => get_query_var('paged') ?: 1,
];
$query = new WP_Query($args);meta_query
Filter berdasarkan custom field:
$args['meta_query'] = [
[
'key' => 'harga',
'value' => 100000,
'compare' => '>=',
'type' => 'NUMERIC',
],
];Bisa pakai relasi AND/OR antar clause dengan key relation.
tax_query
Filter berdasarkan taxonomy term:
$args['tax_query'] = [
[
'taxonomy' => 'kategori_produk',
'field' => 'slug',
'terms' => 'elektronik',
],
];Pagination
while ($query->have_posts()) : $query->the_post();
the_title();
endwhile;
echo paginate_links([
'total' => $query->max_num_pages,
]);
wp_reset_postdata();paged mengontrol halaman; max_num_pages dipakai untuk link paginasi.
Struktur alur
Contoh meta + tax gabungan
$args = [
'post_type' => 'produk',
'meta_query' => [
'relation' => 'AND',
['key' => 'stok', 'value' => 0, 'compare' => '>', 'type' => 'NUMERIC'],
],
'tax_query' => [
['taxonomy' => 'kategori_produk', 'field' => 'slug', 'terms' => 'promo'],
],
];Catatan implementasi
- Selalu panggil
wp_reset_postdata()setelah loop manual, supaya$postglobal kembali ke query utama. - Set
no_found_rows => truekalau tidak butuh paginasi, untuk menghindariSQL_CALC_FOUND_ROWSyang mahal. fields => 'ids'mengembalikan array ID saja, lebih ringan kalau tidak butuh objek lengkap.- Untuk arsip archive/index, modifikasi lewat
pre_get_posts, jangan ganti denganquery_posts.
Kesalahan umum
- N+1 di loop: di dalam
while, tiap iterasi memanggilget_post_metaatauget_termsatu per satu, padahal bisa diambil sekali viaupdate_post_meta_cache/update_term_cache, ataumeta_querydi awal. - Lupa
wp_reset_postdata(): loop berikutnya ikut pakai data query manual, menghasilkan tampilan salah. query_posts()di arsip: membuang query asli dan memicu query kedua, boros dan sering rusak pagination.meta_querytanpatype: perbandingan numerik jadi string comparison, hasil tidak sesuai ekspektasi.- Cache query diabaikan:
cache_results,update_post_meta_cache,update_post_term_cachedimatikan tanpa sengaja, menambah query di belakang layar.