Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Gabungkan WP_Query dengan pertanyaan utama

Gabungkan WP_Query dengan pertanyaan utama

PHPz
PHPzasal
2023-08-30 19:57:17824semak imbas

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 变量。现在让我们看一些示例。

示例 1:在类别页面上仅显示一种帖子类型的帖子

假设您的网站添加了自定义帖子类型,并且您已为该自定义帖子类型启用了类别。在每个类别的类别存档上,您不想显示帖子:相反,您想显示新帖子类型的帖子 - 让我们将其称为 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 挂钩修改主查询,并结合条件函数检查类别档案来实现此结果。

示例2:主查询与WP_Query和foreach组合输出多个循环

下一个示例将输出当前类别页面的所有帖子,但不是将它们全部显示在一个块中,而是按帖子类型将它们分开。

这意味着您可以使用 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 变量依次存储每个单独的帖子类型。

示例 3:针对两种帖子类型的两个单独查询

最后一个示例与第二个示例类似,但将帖子类型分为两个单独的查询,每个查询都有自己不同的循环。这使您可以更好地控制每个内容的显示内容,因此您可以以不同于产品的方式显示帖子,可能包括产品的特色图片或为它们提供不同的布局。

假设您的网站注册了 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

Dalam kebanyakan kes anda akan menggunakan 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: 🎜
  • Pada halaman kategori atau kategori, hanya tunjukkan siaran daripada satu jenis siaran
  • Pada halaman kategori, paparkan siaran yang mengandungi kategori semasa dan kategori atau teg atau istilah taksonomi lain
  • Pada halaman jenis siaran, hanya tunjukkan siaran dengan metadata tertentu
🎜Saya boleh meneruskan dan seterusnya, terdapat banyak peluang untuk menggabungkan pertanyaan utama dengan pertanyaan tersuai anda sendiri. 🎜 🎜Saya akan menunjukkan ini dengan tiga contoh: yang pertama ialah yang mudah dengan gelung; yang kedua akan menggunakan 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. 🎜

Tentukan pembolehubah berdasarkan pertanyaan utama

🎜Walau bagaimanapun, anda ingin menggabungkan pertanyaan utama dengan 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. 🎜

Contoh 1: Paparkan siaran hanya satu jenis siaran pada halaman kategori

🎜Andaikan anda mempunyai jenis siaran tersuai yang ditambahkan pada tapak web anda dan anda telah mendayakan kategori untuk jenis siaran tersuai tersebut. Pada arkib kategori untuk setiap kategori, anda tidak mahu memaparkan siaran: sebaliknya, anda mahu memaparkan siaran jenis siaran baharu - mari kita panggilnya 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. 🎜

Contoh 2: Pertanyaan utama digabungkan dengan WP_Query dan foreach untuk mengeluarkan berbilang gelung

🎜Contoh seterusnya akan mengeluarkan semua siaran halaman kategori semasa, tetapi bukannya memaparkan semuanya dalam satu blok, ia akan memisahkannya mengikut jenis siaran. 🎜 🎜Ini bermakna anda boleh menggunakan CSS untuk mengkategorikan jenis siaran ke dalam blok atau lajur pada halaman, atau hanya memisahkannya ke dalam senarai yang berbeza. 🎜 🎜Untuk ini anda boleh menggunakan kod berikut: 🎜 rrreee 🎜Ini menggunakan pembolehubah $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. 🎜

Contoh 3: Dua pertanyaan berasingan untuk dua jenis siaran

🎜Contoh terakhir adalah serupa dengan yang kedua, tetapi membahagikan jenis siaran kepada dua pertanyaan berasingan, masing-masing dengan gelungnya yang berbeza. Ini memberi anda lebih kawalan ke atas perkara yang muncul pada setiap bahagian kandungan, jadi anda boleh memaparkan siaran anda secara berbeza daripada produk anda, mungkin termasuk imej yang ditampilkan produk anda atau memberi mereka reka letak yang berbeza. 🎜 🎜Andaikan tapak web anda mendaftarkan jenis siaran 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. 🎜

Abstrak

🎜Seperti yang anda lihat daripada contoh di atas, menggunakan 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:Fungsi nl_langinfo() dalam PHPArtikel seterusnya:Fungsi nl_langinfo() dalam PHP