Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Menguasai WP_Query: Memanfaatkan Kuasa Gelung

Menguasai WP_Query: Memanfaatkan Kuasa Gelung

PHPz
PHPzasal
2023-09-01 10:49:091223semak imbas

标题重写为:Mastering WP_Query: Harnessing the Power of the Loop

Seperti yang saya gariskan dalam pengenalan kepada siri ini, kelas WP_Query mempunyai empat elemen utama: WP_Query 类有四个主要元素:

  • 查询的参数,使用本系列将详细介绍的参数
  • 查询本身
  • 循环,它将输出帖子内容、标题或您想要显示的任何内容
  • 结束:关闭 if 和 while 标签并重置发布数据

在本教程中,我将向您展示如何通过 WP_Query 使用循环,包括构建循环的两种主要方法以及如何使用多个循环。

循环适合的位置

如果没有循环,页面上将不会显示任何内容。 WordPress 使用您定义的参数运行查询后,需要告知它从获取的数据中输出什么。这就是循环出现的地方。

因此循环出现在查询之后,它使用三个标签:

  • if( $query->have_posts() ) 检查是否有任何帖子。它通过检查查询的 post_count 属性的值是否小于 current_post + 1 的值来实现这一点。
  • while( $query->have_posts() ) 只要有要检索的帖子, 就会对每个帖子重复循环。正如你所看到的,这个 have_posts() 方法与我们之前调用的检查是否有帖子的方法相同。请记住,此方法不会增加帖子计数器。它只是让我们知道循环中是否有任何帖子或者我们是否处于循环末尾。一旦到达结尾,它也会自动倒回循环。
  • $query->the_post() 访问该特定帖子。它还执行其他一些操作,例如检索下一篇文章,并增加帖子计数器。它还设置了全球发布数据供我们使用。

当您在循环内时,不应调用 have_posts() 方法。这是因为 have_posts() 会将循环倒回到开头,您将陷入无限循环。

现在,这是循环在 WP_Query 类中的位置:

<?php

$args = array(
    // Arguments for your query.
);

// 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_reset_postdata() 进行整理。

循环结构

循环的结构方式取决于您想要从帖子中显示的数据。下面是一个示例循环,它输出帖子标题、特色图像和摘录。您可以在存档页面上使用这样的循环。

<?php

$args = array(
    // Arguments for your query.
);

// 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();

        ?>

        <article id="post-<?php the_ID(); ?>" <?php post_class( 'left' ); ?>>
            <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
                <?php post_thumbnail( 'thumbnail' );?>
            </a>
            <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
                <?php the_title(); ?>
            </a>
            <?php the_excerpt(); ?>
        </article>

        <?php

    }

}

// Restore original post data.
wp_reset_postdata();

?>

此循环准确显示了我上面所描述的内容:特色图像、标题和摘录。

进一步循环:检查内容

但有时您可能想在帖子列表之前添加标题,或者您可能想将它们全部包含在包含元素中。如果您只是在循环之前添加此内容,则无论查询是否实际返回任何数据,它都会输出,这意味着您可能有一个标题下面没有任何内容,或者有一些不必要的标记。

通过将封闭元素或标题放入 if 标记中,可以很容易地解决这个问题:

<?php

$args = array(
    // Arguments for your query.
);

// Custom query.
$query = new WP_Query( $args );

// Check that we have query results.
if ( $query->have_posts() ) {

    
    echo '<section class="clear">';
        echo '<h2>' . __( 'Heading', 'tutsplus' ) . '</h2>';
    
        // Start looping over the query results.
        while ( $query->have_posts() ) {
    
            $query->the_post();
    
            ?>
    
            <article id="post-<?php the_ID(); ?>" <?php post_class( 'left' ); ?>>
                <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
                    <?php post_thumbnail( 'thumbnail' );?>
                </a>
                <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
                    <?php the_title(); ?>
                </a>
                <?php the_excerpt(); ?>
            </article>
    
            <?php
    
        }
    
    echo '</section>';

}

// Restore original post data.
wp_reset_postdata();

?>

在这里您可以看到我已经检查了我的查询是否检索到了任何帖子,如果有,我已经打开了一个包含元素并添加了一个标题。

如果您想将查询结果输出为列表,这也很有用。假设我想创建给定类别中所有帖子的列表。 ul 元素不在我的循环内,因为它与某一特定帖子无关,但我只想在有帖子时输出它。所以我用这个:

<?php

$args = array(
    'category_name' => 'category-slug',
    'post_type' => 'post'
);

// Custom query.
$query = new WP_Query( $args );

// Check that we have query results.
if ( $query->have_posts() ) {

    echo '<ul class="category posts">';

        // Start looping over the query results.
        while ( $query->have_posts() ) {

            $query->the_post();

            ?>

            <li <?php post_class( 'left' ); ?>>
                <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
                    <?php the_title(); ?>
                </a>
            </li>

            <?php
    
        }

    echo '</ul>';

}

// Restore original post data.
wp_reset_postdata();

?>

这会检查查询是否已获取任何帖子,如果是,则打开 ul 元素,然后运行循环。

运行额外循环

需要注意的是,虽然您可以使用 WP_Query 运行多个循环,但您必须重置发布数据并启动 WP_Query 的第二个实例才能运行做这个。这是因为每个循环都将根据不同的参数输出数据。

此示例显示第一篇文章的摘录和特色图像,然后仅显示每个后续文章的标题:

<?php

// First query arguments.
$args1 = array(
    'post_type' => 'post',
    'posts_per_page' => '1'
);

// First custom query.
$query1 = new WP_Query( $args1 );

// Check that we have query results.
if ( $query1->have_posts() ) {

    // Start looping over the query results.
    while ( $query1->have_posts() ) {

        $query1->the_post();

        ?>

        <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
            <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
                <?php post_thumbnail( 'thumbnail' );?>
            </a>
            <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
                <?php the_title(); ?>
            </a>
            <?php the_excerpt(); ?>
        </article>

        <?php

    }

}

// Restore original post data.
wp_reset_postdata();

// Second query arguments.
$args2 = array(
    'offset' => '1',
    'post_type' => 'post'
);

// Second custom query.
$query2 = new WP_Query( $args2 );

// Check that we have query results.
if ( $query2->have_posts() ) {

    echo '<ul class="more-posts">';
    
        // Start looping over the query results.
        while ( $query2->have_posts() ) {

            $query2->the_post();
    
            ?>

            <li <?php post_class(); ?>>
                <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
                    <?php the_title(); ?>
                </a>
            </li>
    
            <?php
    
        }
    
    echo '</ul>';

}

// Restore original post data.
wp_reset_postdata();

?>

我在这里使用了两个关键参数:

  • 'posts_per_page' => '1',与第一个查询一起使用,仅输出最新的帖子。
  • 'offset' = '1',与第二个查询一起使用,跳过第一个帖子,确保它不会在下面的列表中重复。

从上面的代码中可以看出,每个查询的循环略有不同。第一个输出特色图像、标题和摘录,而第二个检查查询是否有帖子,如果有,则打开 ul 元素,并将每个帖子标题包含在 li

  • Parameter pertanyaan, gunakan parameter yang akan diperkenalkan secara terperinci dalam siri ini
  • Pertanyaan itu sendiri
  • Gelung, ia akan mengeluarkan kandungan siaran, tajuk atau apa sahaja yang anda mahu paparkan
  • Tamat: tutup teg jika dan semasa dan tetapkan semula data penerbitan
Dalam tutorial ini, saya akan menunjukkan kepada anda cara menggunakan gelung dengan WP_Query, termasuk dua cara utama untuk membina gelung dan cara menggunakan berbilang gelung. 🎜

Di mana hendak digelung

🎜Tanpa gelung, tiada apa yang akan dipaparkan pada halaman. Selepas WordPress menjalankan pertanyaan dengan parameter yang anda tentukan, anda perlu memberitahunya perkara yang hendak dikeluarkan daripada data yang diperolehinya. Di sinilah gelung masuk. 🎜 🎜Jadi gelung datang selepas pertanyaan, yang menggunakan tiga label: 🎜
  • if( $query->have_posts() ) Menyemak sama ada terdapat sebarang catatan. Ia melakukan ini dengan menyemak sama ada nilai atribut post_count pertanyaan adalah kurang daripada nilai current_post + 1.
  • while( $query->have_posts() ) akan mengulangi gelung untuk setiap siaran selagi ada catatan untuk diambil semula. Seperti yang anda lihat, kaedah have_posts() ini ialah kaedah yang sama yang kami panggil sebelum ini untuk menyemak sama ada terdapat siaran. Perlu diingat bahawa kaedah ini tidak menambah pembilang pos. Ia hanya memberitahu kami jika terdapat sebarang catatan dalam gelung atau jika kita berada di penghujung gelung. Ia juga secara automatik memundurkan gelung sebaik sahaja ia mencapai penghujung.
  • $query->the_post() mengakses siaran khusus itu. Ia juga melakukan beberapa operasi lain, seperti mendapatkan semula siaran seterusnya dan menambah pembilang pos. Ia juga menyediakan data penerbitan global untuk kegunaan kami.
🎜Kaedah have_posts() tidak boleh dipanggil apabila anda berada di dalam gelung. Ini kerana have_posts() akan memundurkan gelung ke permulaan dan anda akan berakhir dalam gelung tak terhingga. 🎜 🎜Sekarang, di sinilah gelung berada dalam kelas WP_Query: 🎜 rrreee 🎜Selepas menjalankan gelung, apa yang perlu dilakukan ialah mengemas menggunakan wp_reset_postdata(). 🎜

Struktur gelung

🎜Cara gelung distrukturkan bergantung pada data yang ingin anda paparkan daripada siaran. Di bawah ialah contoh gelung yang mengeluarkan tajuk siaran, imej yang ditampilkan dan petikan. Anda boleh menggunakan gelung seperti ini pada halaman arkib. 🎜 rrreee 🎜Gelung ini menunjukkan dengan tepat apa yang saya nyatakan di atas: Imej, Tajuk dan Petikan Pilihan. 🎜

Gelung lagi: semak kandungan

🎜Tetapi kadangkala anda mungkin mahu menambah tajuk sebelum senarai siaran, atau anda mungkin mahu memasukkan semuanya dalam elemen yang mengandungi. Jika anda hanya menambah ini sebelum gelung, ia akan mengeluarkan tanpa mengira sama ada pertanyaan itu benar-benar mengembalikan sebarang data, yang bermaksud anda mungkin mempunyai pengepala tanpa apa-apa di bawahnya, atau beberapa penanda yang tidak perlu. 🎜 🎜Masalah ini boleh diselesaikan dengan mudah dengan meletakkan elemen atau tajuk yang disertakan di dalam tag if: 🎜 rrreee 🎜Di sini anda boleh melihat bahawa saya telah menyemak sama ada pertanyaan saya mendapatkan semula sebarang siaran, dan jika ya, saya telah membuka elemen yang mengandungi dan menambah tajuk. 🎜 🎜Ini juga berguna jika anda ingin mengeluarkan hasil pertanyaan sebagai senarai. Katakan saya ingin membuat senarai semua siaran dalam kategori tertentu. Elemen ul tidak berada di dalam gelung saya kerana ia tidak berkaitan dengan siaran tertentu, tetapi saya hanya mahu mengeluarkannya jika ada siaran. Jadi saya menggunakan ini: 🎜 rrreee 🎜Ini menyemak sama ada pertanyaan telah mengambil sebarang siaran, jika demikian ia membuka elemen ul dan kemudian menjalankan gelung. 🎜

Jalankan gelung tambahan

🎜Adalah penting untuk ambil perhatian bahawa walaupun anda boleh menggunakan WP_Query untuk menjalankan berbilang gelung, anda mesti menetapkan semula data siaran dan memulakan WP_Query Contoh kedua boleh dijalankan untuk melakukan ini. Ini kerana setiap gelung akan mengeluarkan data berdasarkan parameter yang berbeza. 🎜 🎜Contoh ini menunjukkan petikan dan imej yang ditampilkan daripada artikel pertama, kemudian hanya tajuk setiap artikel berikutnya: 🎜 rrreee 🎜Saya menggunakan dua parameter utama di sini: 🎜
  • 'posts_per_page' => '1', digunakan dengan pertanyaan pertama, hanya mengeluarkan catatan terkini.
  • 'offset' = '1', digunakan dengan pertanyaan kedua, melangkau siaran pertama, memastikan ia tidak berulang dalam senarai di bawah.
🎜Seperti yang anda lihat daripada kod di atas, gelung berbeza sedikit untuk setiap pertanyaan. Yang pertama mengeluarkan imej, tajuk dan petikan yang ditampilkan, manakala yang kedua menyemak sama ada pertanyaan mempunyai catatan, dan jika ya, membuka elemen ul dan membungkus setiap tajuk catatan dalam li dan pautannya ke halaman. 🎜

Anda juga akan perasan bahawa saya menggunakan wp_reset_postdata() selepas dua gelung. Jika saya tidak melakukan ini, menggunakan teg templat di luar gelung sekunder akan memberi saya data tentang catatan terakhir di dalam gelung. Memanggil fungsi ini menetapkan semula data penerbitan kepada pertanyaan utama. wp_reset_postdata() 。如果我没有这样做,那么在辅助循环之外使用模板标签将为我提供有关循环内最后一篇文章的数据。调用此函数会将发布数据重置到主查询。

访问循环内的帖子信息

您可以在循环内调用许多函数来访问有关当前帖子的信息。您也已经看到本教程中使用了其中一些。在本节中,我将向您列出一些您可能偶尔会使用的常用功能。

获取标题

您可以使用三个函数来获取帖子的标题。它们是 the_title()get_the_title()the_title_attribute()get_the_title() 函数只是检索帖子标题,而 the_title() 将根据传递的参数显示或检索标题以及可选标记。当您想在显示标题之前对其进行清理时,您应该使用 the_title_attribute()

获取摘录或完整内容

有一个名为 the_excerpt() 的专用函数来显示当前帖子的摘录。它将多个过滤器应用于所提供的摘录,以便可以正确地向观众显示。并非每篇文章都会有作者提供的摘录。在这种情况下,它会在显示之前生成完整帖子摘录的精简版本。

您可以使用函数 the_content() 显示帖子的完整内容。

获取帖子类别、标签和其他元数据

您的 WordPress 帖子通常会有您分配的一些标签或类别。您可以使用 the_tags()the_category() 函数在循环中显示这些标签和类别的列表。使用 the_author() 函数显示帖子的作者。帖子的 ID 也可以通过函数 the_ID() 访问。

获取发布或修改日期和时间

WordPress 中有专用函数,您可以在循环中使用它们来显示帖子的发布日期 (the_date()) 和时间 (the_time())。您应该记住的两个重要点是 the_time() 也可以用于仅显示帖子的发布日期。此外,对于同一天发布的多个帖子, the_date() 的输出仅回显一次。这基本上意味着您几乎总是希望使用 the_time() 以获得更大的灵活性和易用性。

摘要

如果没有循环,WP_Query 并没有真正做太多事情。该循环是您用来显示 WordPress 根据您的查询参数从数据库中获取的数据的代码。

正如我所演示的,循环有一些变化。一个简单的循环将按照您在查询参数中指定的顺序(或默认情况下按日期降序)输出所有帖子。如果将 if( $query->have_posts() )while( $query->have_posts() ) 分开,您可以在循环外部插入额外的标记,但前提是您的查询已返回数据。最后,通过指定替代参数并在每次循环后使用 wp_reset_postdata(),您可以多次使用 WP_Query

Akses maklumat siaran dalam gelung

Terdapat banyak fungsi yang boleh anda panggil dalam satu gelung untuk mengakses maklumat tentang siaran semasa. Anda juga telah melihat beberapa daripadanya digunakan dalam tutorial ini. Dalam bahagian ini, saya akan memberikan anda senarai beberapa ciri biasa yang mungkin anda gunakan sekali-sekala.

Dapatkan tajuk

Anda boleh menggunakan tiga fungsi untuk mendapatkan tajuk siaran. Ia adalah the_title(), get_the_title() dan the_title_attribute(). Fungsi get_the_title() hanya mendapatkan semula tajuk siaran, manakala the_title() akan memaparkan atau mendapatkan semula tajuk bersama-sama dengan teg pilihan berdasarkan parameter yang diluluskan. Apabila anda ingin membersihkan tajuk sebelum memaparkannya, anda harus menggunakan the_title_attribute() .

Dapatkan petikan atau kandungan penuh

Terdapat fungsi khusus yang dipanggil the_excerpt() untuk memaparkan petikan siaran semasa. Ia menggunakan berbilang penapis pada petikan yang disediakan supaya ia boleh dipaparkan dengan betul kepada khalayak. Tidak setiap artikel akan mempunyai petikan yang disediakan oleh penulis. Dalam kes ini, ia menjana versi pekat bagi petikan siaran penuh sebelum memaparkannya. #🎜🎜# #🎜🎜#Anda boleh menggunakan fungsi the_content() untuk memaparkan kandungan lengkap siaran. #🎜🎜#

Dapatkan kategori siaran, teg dan metadata lain

#🎜🎜#Siaran WordPress anda biasanya akan mempunyai beberapa tag atau kategori yang anda tetapkan. Anda boleh memaparkan senarai teg dan kategori ini dalam satu gelung menggunakan fungsi the_tags() dan the_category(). Gunakan fungsi the_author() untuk memaparkan pengarang siaran. ID siaran juga boleh diakses melalui fungsi the_ID(). #🎜🎜#

Dapatkan tarikh dan masa penerbitan atau pengubahsuaian

#🎜🎜# Terdapat fungsi khusus dalam WordPress yang boleh anda gunakan dalam satu gelung untuk memaparkan tarikh (the_date()) dan masa (the_time()) sesuatu siaran . Dua perkara penting yang perlu anda ingat ialah the_time() juga boleh digunakan untuk memaparkan hanya tarikh siaran diterbitkan. Selain itu, output the_date() hanya digemakan sekali untuk berbilang siaran yang diterbitkan pada hari yang sama. Ini pada asasnya bermakna anda hampir sentiasa mahu menggunakan the_time() untuk lebih fleksibiliti dan kemudahan penggunaan. #🎜🎜#

Abstrak

#🎜🎜# Tanpa gelung, WP_Query tidak banyak membantu. Gelung ini ialah kod yang anda gunakan untuk memaparkan data yang diambil oleh WordPress daripada pangkalan data berdasarkan parameter pertanyaan anda. #🎜🎜# #🎜🎜# Seperti yang saya tunjukkan, terdapat beberapa perubahan pada gelung. Gelung mudah akan mengeluarkan semua siaran dalam susunan yang anda tentukan dalam parameter pertanyaan (atau dalam susunan tarikh menurun secara lalai). Jika anda memisahkan if( $query->have_posts() ) dan while( $query->have_posts() anda Ia adalah mungkin untuk memasukkan penanda tambahan di luar gelung, tetapi hanya jika pertanyaan anda telah mengembalikan data. Akhir sekali, anda boleh menggunakan WP_Query beberapa kali pada halaman dengan menentukan parameter penggantian dan menggunakan wp_reset_postdata() selepas setiap gelung Cipta berbilang gelung . #🎜🎜# #🎜🎜##🎜🎜#Siaran ini telah dikemas kini dengan sumbangan daripada Nitish Kumar. Nitish ialah pembangun web yang berpengalaman dalam mencipta tapak web e-dagang pada pelbagai platform. Dia menghabiskan masa lapangnya dengan membuat projek peribadi untuk memudahkan kehidupan hariannya, atau berjalan-jalan petang bersama rakan-rakan. #🎜🎜##🎜🎜#

Atas ialah kandungan terperinci Menguasai WP_Query: Memanfaatkan Kuasa Gelung. 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:Penjadualan tugas dalam LaravelArtikel seterusnya:Penjadualan tugas dalam Laravel