Rumah > Artikel > pembangunan bahagian belakang > Gabungkan WP_Query dengan pertanyaan utama
Setakat ini dalam siri ini, anda telah mempelajari cara menggunakan WP_Query
untuk membuat pertanyaan tersuai untuk digunakan dalam tema atau pemalam. WP_Query
创建在主题或插件中使用的自定义查询。
在大多数情况下,您将使用 WP_Query
以及一组全新的参数,这些参数与主查询中的参数分开,但是如果您想在参数中包含主查询怎么办?
您可能想要执行此操作的示例包括:
我可以继续说下去,有很多机会可以将主查询与您自己的自定义查询相结合。
我将通过三个示例来演示这一点:第一个示例是一个带有一个循环的简单示例;第二个将使用 foreach
输出多个循环,每个循环对应一种帖子类型;第三个将使用两个单独的查询在类别存档上输出两种帖子类型。
但是,您要将主查询与 WP_Query
结合起来,您需要以一种易于在 WP_Query
中使用的方式存储当前查询对象论据。最简单的方法是将其分配给一个变量。
在定义 WP_Query
参数之前执行此操作,如下所示:
$mainquery = get_queried_object();
get_queried_object()
函数返回当前查询的对象,无论该对象是什么。在单个帖子上,它只会返回帖子对象,而在存档上,它将返回类别、标签、术语对象或与存档相关的任何对象。它返回查询对象的ID。
然后,您可以在 WP_Query
参数中使用此 $mainquery
变量。现在让我们看一些示例。
假设您的网站添加了自定义帖子类型,并且您已为该自定义帖子类型启用了类别。在每个类别的类别存档上,您不想显示帖子:相反,您想显示新帖子类型的帖子 - 让我们将其称为 product
。
您的查询可能如下所示:
<?php $mainquery = get_queried_object(); $args = array ( 'category_name' => $mainquery->slug, 'post_type' => 'product' ); // Custom query. $query = new WP_Query( $args ); // Check that we have query results. if ( $query->have_posts() ) { // Start looping over the query results. while ( $query->have_posts() ) { $query->the_post(); // Contents of the queried post results go here. } } // Restore original post data. wp_reset_postdata(); ?>
由于我上面使用的 category_name
参数以类别 slug 作为参数,因此需要在变量后面添加 ->slug
来输出类别 slug。
这为您提供了一个查询,该查询从具有当前查询类别的数据库中获取 product
帖子类型的帖子。您可以在 category.php
页面模板上使用它。
注意:您还可以使用 pre_get_posts
挂钩修改主查询,并结合条件函数检查类别档案来实现此结果。
下一个示例将输出当前类别页面的所有帖子,但不是将它们全部显示在一个块中,而是按帖子类型将它们分开。
这意味着您可以使用 CSS 将帖子类型分类为页面上的块或列,或者只是将它们分成不同的列表。
为此,您可以使用以下代码:
<?php $mainquery = get_queried_object(); $post_types = get_post_types(); foreach ( $post_types as $post_type ) { $args = array( 'category_name' => $mainquery->slug, 'post_type' => $post_type ); // Custom query. $query = new WP_Query( $args ); // Check that we have query results. if ( $query->have_posts() ) { // Start looping over the query results. while ( $query->have_posts() ) { $query->the_post(); // Contents of the queried post results go here. } } // Restore original post data. wp_reset_postdata(); } ?>
这使用了我们之前使用过的 $mainquery
变量,但它还添加了一个 $post_types
变量来存储在网站上注册的所有帖子类型,以及一个 $post_type
变量依次存储每个单独的帖子类型。
最后一个示例与第二个示例类似,但将帖子类型分为两个单独的查询,每个查询都有自己不同的循环。这使您可以更好地控制每个内容的显示内容,因此您可以以不同于产品的方式显示帖子,可能包括产品的特色图片或为它们提供不同的布局。
假设您的网站注册了 product
帖子类型,并为其启用了类别,并且您也在撰写具有相同类别的博客文章。在每个类别存档页面上,您希望显示最近的十篇帖子,然后您希望显示同一类别中所有产品的列表。
为此,您可以使用类似以下代码:
<?php $mainquery = get_queried_object(); // First query arguments for posts. $args = array ( 'category_name' => $mainquery->slug, 'post_type' => 'post', 'posts_per_page' => '10' ); // Custom query. $query = new WP_Query( $args ); // Check that we have query results. if ( $query->have_posts() ) { // Start looping over the query results. while ( $query->have_posts() ) { $query->the_post(); // Contents of the queried post results go here. } } // Restore original post data. wp_reset_postdata(); // Second query arguments for products. $args = array ( 'category_name' => $mainquery->slug, 'post_type' => 'product', 'posts_per_page' => '-1' ); // Custom query. $query = new WP_Query( $args ); // Check that we have query results. if ( $query->have_posts() ) { // Start looping over the query results. while ( $query->have_posts() ) { $query->the_post(); // Contents of the queried post results go here. } } // Restore original post data. wp_reset_postdata(); ?>
然后,您可以以不同的方式编写每个循环,以便为每种帖子类型输出不同的数据。
从上面的示例中可以看出,使用 WP_Query
WP_Query
dengan set parameter baharu yang berasingan daripada parameter dalam pertanyaan utama, tetapi jika anda ingin memasukkan pertanyaan utama dalam parameter apa yang perlu dilakukan 🎜
🎜Contoh tempat yang anda mungkin mahu lakukan ini termasuk: 🎜
foreach
untuk mengeluarkan berbilang gelung, setiap gelung pertama sepadan dengan satu jenis siaran ; yang ketiga akan mengeluarkan kedua-dua jenis siaran pada arkib kategori menggunakan dua pertanyaan berasingan. 🎜
WP_Query
, anda perlu menyimpannya dalam cara yang mudah digunakan dalam WP_Query kod> Argumen objek pertanyaan semasa. Cara paling mudah adalah dengan menetapkannya kepada pembolehubah. 🎜
🎜Lakukan ini sebelum mentakrifkan parameter <code class="inline">WP_Query
seperti ini: 🎜
rrreee
🎜get_queried_object()
Fungsi mengembalikan objek yang sedang ditanya, tidak kira apa objek itu. Pada satu siaran ia hanya akan mengembalikan objek siaran, manakala pada arkib ia akan mengembalikan kategori, teg, objek istilah atau sebarang objek yang berkaitan dengan arkib. Ia mengembalikan ID objek pertanyaan. 🎜
🎜Anda kemudian boleh menggunakan pembolehubah $mainquery
ini dalam parameter WP_Query
. Sekarang mari kita lihat beberapa contoh. 🎜
product
. 🎜
🎜Pertanyaan anda mungkin kelihatan seperti ini: 🎜
rrreee
🎜Memandangkan parameter category_name
yang saya gunakan di atas mengambil kategori slug sebagai parameter, saya perlu menambah ->slug
selepas pembolehubah untuk mengeluarkan slug kategori. 🎜
🎜Ini memberi anda pertanyaan yang mendapat siaran jenis siaran product
daripada pangkalan data dengan kategori pertanyaan semasa. Anda boleh menggunakannya pada templat halaman category.php
. 🎜
🎜Nota: Anda juga boleh menggunakan cangkuk pre_get_posts
untuk mengubah suai pertanyaan utama dan menggabungkannya dengan fungsi bersyarat untuk menyemak arkib kategori untuk mencapai hasil ini. 🎜
$mainquery
yang kami gunakan sebelum ini, tetapi ia juga menambahkan pembolehubah $post_types
untuk disimpan di tapak web Semua siaran jenis yang didaftarkan pada , dan pembolehubah $post_type
menyimpan setiap jenis siaran individu secara bergilir-gilir. 🎜
product
dan kategori didayakan untuknya, dan anda juga menulis catatan blog dengan kategori yang sama. Pada setiap halaman arkib kategori, anda ingin memaparkan sepuluh siaran terbaharu, dan kemudian anda mahu memaparkan senarai semua produk dalam kategori yang sama. 🎜
🎜Untuk melakukan ini, anda boleh menggunakan kod seperti: 🎜
rrreee
🎜Anda kemudian boleh menulis setiap gelung secara berbeza untuk mengeluarkan data yang berbeza untuk setiap jenis siaran. 🎜
WP_Query
bukan sahaja membolehkan anda membuat pertanyaan tersuai sepenuhnya berasingan daripada pertanyaan utama, tetapi anda juga boleh menggabungkan objek semasa pertanyaan dan buat pertanyaan yang lebih berkuasa pada halaman arkib. 🎜Contoh di atas juga boleh dilakukan menggunakan jenis arkib lain: untuk kategori, pengarang, tarikh, dsb. Lihat jika anda boleh memikirkan lebih banyak kemungkinan!
Atas ialah kandungan terperinci Gabungkan WP_Query dengan pertanyaan utama. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!