Kueri Kustom WordPress – Menggunakan Kelas WP_Query

Diterbitkan: 2021-02-06

WordPress menawarkan berbagai fungsi siap pakai yang dalam banyak kasus dapat mengambil informasi yang diperlukan dari database. Tetapi ketika mengembangkan situs WordPress, ada banyak skenario di mana filter atau tindakan tidak cukup untuk mencapai hasil yang diinginkan. Dalam kasus-kasus ini. WordPress menawarkan solusi dalam bentuk kelas WP_Query .

Mari kita lihat bagaimana kelas WP_Query dapat digunakan!

Kasus Kueri Kustom

CATATAN: Artikel ini mengasumsikan Anda memiliki pengetahuan tentang PHP dan MySQL/MariaDB plus terbiasa bekerja dengan WordPress.

Halaman apa pun yang Anda kunjungi, WordPress menjalankan apa yang disebut 'kueri utama' untuk menampilkan konten. Jadi ketika Anda mengunjungi halaman seperti tampilan kategori misalnya, objek WP_Query dibuat di belakang layar dan mengambil semua data yang diperlukan dari database untuk menampilkan halaman.

Apa yang dilakukan WP_Query pada dasarnya adalah menawarkan Anda kemampuan untuk mengambil konten dari database situs web Anda tanpa harus menggunakan kueri SQL.

Untuk melakukan ini, yang perlu kita lakukan hanyalah mendefinisikan argumen yang sesuai dengan kebutuhan kita dan objek WP_Query baru akan dibuat dan diterjemahkan ke dalam kueri SQL.

Contoh Menggunakan WP_Query

Jika kita ingin menampilkan postingan dari kategori tertentu, dalam template kategori lain, maka perlu membuat objek kueri baru.

Untuk tujuan contoh ini, kami mengaktifkan tema Twenty Twenty dan membuat 2 posting di bawah kategori bernama 'Kategori 1' dan 2 posting di bawah kategori bernama 'Layanan'.

Selain itu, kami membuat template tampilan kategori khusus untuk postingan 'Kategori 1'. Siput dari kategori ini adalah 'category-1' oleh karena itu file di bawah folder tema harus category-CATEGORYSLUG.php yang dalam kasus kami adalah category-category-1.php .

Silakan rekatkan yang berikut ini di file category-category-1.php .

 <?php /*** Custom Category 1 Template */ get_header(); ?> <main role="main"> <section class="site-content"> <div role="main"> <?php if ( have_posts() ) : ?> <header class="archive-header"> <h3 class="archive-title">Category: <?php single_cat_title( '', true ); ?></h3> </header> <?php while ( have_posts() ) : the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; endif; ?> </div> </section> </main> <?php get_sidebar(); ?> <?php get_footer(); ?>

Sebelum loop, kita menggunakan metode have_posts untuk menentukan apakah ada lebih banyak postingan yang tersedia di loop.

the_post() diperlukan untuk loop untuk mengulangi posting dan memberi tahu WordPress untuk pindah ke posting berikutnya dari array posting.

Pada titik ini tampilan frontend kami dari kategori ( https://mycompanyname.com/category/category-1/ ) akan menjadi seperti ini:

Saya tahu bahwa dengan menggunakan potongan kode ini kita telah mengabaikan banyak informasi posting, tetapi demi contoh ini, lebih baik untuk membuatnya tetap sederhana dan hanya menampilkan judul posting.

Untuk melihat properti objek kueri yang dibuat WordPress untuk tampilan ini, kita cukup menambahkan baris ini dalam kode kita setelah endif; penyataan.

 var_dump ( $wp_query->query_vars );

Sekarang jika Anda menyegarkan halaman Anda, Anda akan mendapatkan info ini di bawah daftar posting:

 array(63) { ["category_name"]=> string(10) "category-1" ["error"]=> string(0) "" ["m"]=> string(0) "" ["p"]=> int(0) ["post_parent"]=> string(0) "" ["subpost"]=> string(0) "" ["subpost_id"]=> string(0) "" ["attachment"]=> string(0) "" ["attachment_id"]=> int(0) ["name"]=> string(0) "" ["pagename"]=> string(0) "" ["page_id"]=> int(0) ["second"]=> string(0) "" ["minute"]=> string(0) "" ["hour"]=> string(0) "" ["day"]=> int(0) ["monthnum"]=> int(0) ["year"]=> int(0) ["w"]=> int(0) ["tag"]=> string(0) "" ["cat"]=> int(16) ["tag_id"]=> string(0) "" ["author"]=> string(0) "" ["author_name"]=> string(0) "" ["feed"]=> string(0) "" ["tb"]=> string(0) "" ["paged"]=> int(0) ["meta_key"]=> string(0) "" ["meta_value"]=> string(0) "" ["preview"]=> string(0) "" ["s"]=> string(0) "" ["sentence"]=> string(0) "" ["title"]=> string(0) "" ["fields"]=> string(0) "" ["menu_order"]=> string(0) "" ["embed"]=> string(0) "" ["category__in"]=> array(0) { } ["category__not_in"]=> array(0) { } ["category__and"]=> array(0) { } ["post__in"]=> array(0) { } ["post__not_in"]=> array(0) { } ["post_name__in"]=> array(0) { } ["tag__in"]=> array(0) { } ["tag__not_in"]=> array(0) { } ["tag__and"]=> array(0) { } ["tag_slug__in"]=> array(0) { } ["tag_slug__and"]=> array(0) { } ["post_parent__in"]=> array(0) { } ["post_parent__not_in"]=> array(0) { } ["author__in"]=> array(0) { } ["author__not_in"]=> array(0) { } ["ignore_sticky_posts"]=> bool(false) ["suppress_filters"]=> bool(false) ["cache_results"]=> bool(true) ["update_post_term_cache"]=> bool(true) ["lazy_load_term_meta"]=> bool(true) ["update_post_meta_cache"]=> bool(true) ["post_type"]=> string(0) "" ["posts_per_page"]=> int(10) ["nopaging"]=> bool(false) ["comments_per_page"]=> string(2) "50" ["no_found_rows"]=> bool(false) ["order"]=> string(4) "DESC" }

Katakanlah kita ingin menampilkan daftar posting yang termasuk dalam kategori 'Layanan' di bawah posting yang digambarkan di atas. Karena halaman telah membuat objek kueri untuk kategori saat ini, kita harus menyiasatinya dengan memanipulasi argumen kueri utama yang ada.

Mari kita lihat cara WordPress memungkinkan kita mencapai ini.

Fungsi query_posts

Fungsi query_posts() adalah cara untuk mengubah kueri utama yang digunakan WordPress untuk menampilkan postingan. Ini dilakukan dengan meletakkan kueri utama ke satu sisi, dan menggantinya dengan kueri baru. Anda dapat melihatnya sendiri di wp-includes/query.php tempat file tersebut diperkenalkan.

 function &query_posts($query) { unset($GLOBALS['wp_query']); $GLOBALS['wp_query'] =& new WP_Query(); return $GLOBALS['wp_query']->query($query); }

Kami akan mencoba dan menambahkan loop lain untuk menampilkan Postingan 'Layanan' dengan menambahkan baris berikut di bawah endwhile; dari loop standar saat ini.

 query_posts( array ( 'category_name' => 'services' ) ); while ( have_posts() ) : the_post(); the_title( '<h4 class="example"></h4>' ); endwhile;

Dan ini dia:

Namun ada kelemahan dari metode ini. Jika kami mencoba mencetak kategori yang termasuk dalam objek kueri, kami akan melihat bahwa itu diubah.

Coba masukkan var_dump ( $wp_query->query_vars["category_name"] ); setelah kueri Layanan dan segarkan halaman. Anda akan melihat hasil ini:

 string(8) "services"

Ini terjadi karena kueri diubah tetapi tidak pernah dikembalikan. Pendekatan ini dapat menyebabkan banyak masalah dengan konten yang mengikuti kueri kami.

Untuk menghindari konflik ini dan membersihkan setelah panggilan ke query_posts , buat panggilan ke wp_reset_query() , dan kueri utama asli akan dipulihkan. Jadi kode Anda akan terlihat seperti ini:

 query_posts( array ( 'category_name' => 'services' ) ); while ( have_posts() ) : the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; wp_reset_query(); var_dump ( $wp_query->query_vars["category_name"] );

Setelah menyegarkan halaman Anda, Anda sekarang melihat bahwa kategori halaman awal kembali dalam kueri.

 string(10) "category-1"

Terakhir, kami harus menyebutkan bahwa query_posts harus dihindari karena menambahkan overhead ke kueri Anda karena sebenarnya menyebabkan kueri utama berjalan kembali.

Fungsi get_posts()

Hasil yang sama dapat dicapai dengan penggunaan fungsi get_posts() untuk mengambil larik postingan yang cocok dengan kriteria yang diberikan.

Ganti loop Layanan yang ditunjukkan di bawah ini ...

 query_posts( array ( 'category_name' => 'services' ) ); while ( have_posts() ) : the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; wp_reset_query(); var_dump ( $wp_query->query_vars["category_name"] );

… dengan yang ini:

 $my_query = get_posts( array ( 'category' => 17 ) ); foreach($my_query as $post) : setup_postdata($post); the_title( '<h4 class="example"></h4>' ); endforeach; var_dump ( $wp_query->query_vars["category_name"] );

Seperti yang Anda lihat kali ini kami harus bekerja dengan id kategori alih-alih nama kategori, menurut argumen get_posts() yang ditentukan oleh WordPress.

Hal penting lainnya yang perlu diperhatikan di sini adalah bahwa meskipun kami tidak mereset kueri, keluaran var_dump dari kategori kueri masih utuh dan tidak diubah menjadi 'layanan'. Itu karena get_posts() dengan sendirinya tidak mengubah kueri utama. Kami baru saja menggunakan variabel baru ' $my_query ' untuk membuat instance baru dari objek kueri tanpa menggantinya.

Fungsi get_posts() menggunakan parameter yang sama dengan query_posts() dan disarankan untuk digunakan saat Anda ingin menambahkan loop kustom statis di mana saja di template Anda karena aman dan mudah digunakan.

Buat Objek WP_Query Baru

$wp_query adalah objek dari kelas WP_Query dan mengambil konten database yang diperlukan untuk halaman saat ini. Mengganti kelas ini adalah cara kami untuk menyesuaikan hasil dan menampilkan konten yang berbeda.

Ini adalah potongan kode yang akan kita gunakan:

 $services_query = new WP_Query( 'category_name=services' ); if ( $services_query->have_posts() ) { while ( $services_query->have_posts() ) : $services_query->the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; } wp_reset_postdata(); var_dump ( $wp_query->query_vars["category_name"] );

Kami menggunakan argumen 'category_name' untuk mendefinisikan slug dari kategori yang kami inginkan agar postingannya ditampilkan.

Kami menyimpan objek new WP_Query( 'category_name=services' ); dalam variabel $services_query .

Kemudian kami menggunakan loop while untuk menampilkan konten dan setelah ini kami mereset loop dengan wp_reset_postdata(); untuk mengembalikan ke data asli dari kueri utama.

Jika Anda ingin bereksperimen dengan argumen lain dari Kelas WordPress WP_Query, Anda dapat menemukan daftar lengkapnya di halaman Codex WordPress-nya.