掌握 WP_Query:教你如何使用Loop循环

房子修得再大也是临时住所,只有那个小木匣才是永久的家,所以,屋宽不如心宽,身安不如心安!
本文是《掌握 WP_Query》专题的第 4 篇,共 19 篇:
  • WP_Query 参数:自定义字段(Custom Fields)
  • WP_Query 参数:分类法(Taxonomies)
  • 掌握 WP_Query : 入门介绍
  • 掌握 WP_Query:教你使用Loop循环
  • 掌握 WP_Query:相关的函数
  • 掌握 WP_Query:行动器和过滤器
  • 掌握 WP_Query:WP_Query类的属性和方法
  • WP_Query 参数:文章、页面和文章类型
  • WP_Query 参数:分类和标签
  • WP_Query 参数:日期
  • WP_Query 参数:状态、排序和分页
  • WP_Query 参数:作者、搜索、密码、权限、缓存和返回字段
  • 掌握 WP_Query:10个有用的例子
  • 结合 WP_Query 与主查询(the Main Query)
  • 掌握 WP_User_Query
  • 掌握 WP_Comment_Query
  • 掌握 WP_Meta_Query 和 WP_Date_Query
  • WordPress 4.1的查询改进
  • 掌握 WP_Query:结尾

正如我们在入门指引里面提到的, WP_Query类包括四个部分:

  • 需要查询的参数,或者参数集合。
  • 开始查询。
  • 循环输出——这将输出文章内容、标题或任何你想显示的内容。
  • 查询结束——通过标签判断、重置请求数据。

在这篇博文里面,我们将要学习如何使用Loop循环,包括:两种主要的方式来构建Loop循环以及如何使用多重Loop循环。

哪里适合使用Loop循环

如果没有Loop循环,页面上不会显示任何东西。当Wordpress运行了查询机制之后(当然啦,在这之前,需要设定好参数),接着需要告诉查询程序哪些数据是需要展现的。这里就是需要Loop循环的地方。

所以,在查询之后,循环就来了,Loop循环会使用如下三个标签:

  • if( $query->have_posts() ) 检查是否有文章。
  • while( $query->have_posts() ) 循环往复的执行Loop循环,去检索是否有文章。
  • $query->the_post() 获取到特定的文章。

以下是Loop循环在WP_Query类中的位置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php

$args = array(
    // 给予Query查询定义的参数);// 定义一个新的查询

$query = new WP_Query( $args );

// 判断我们所查询到的结果.

if ( $query->have_posts() ) {

    // 开始循环往复的查询结果
while ( $query->have_posts() ) {

        $query->the_post();

        // 查询到的文章内容 
    }

}

// 重置请求数据.

wp_reset_postdata();

?>

<?php $args = array( // 给予Query查询定义的参数);// 定义一个新的查询 $query = new WP_Query( $args ); // 判断我们所查询到的结果. if ( $query->have_posts() ) { // 开始循环往复的查询结果 while ( $query->have_posts() ) { $query->the_post(); // 查询到的文章内容 } } // 重置请求数据. wp_reset_postdata(); ?>

小伙伴们别忘记了,当循环结束后,要使用wp_reset_postdata()清理程序

Loop 循环结构

你想要显示文章的哪些数据决定了你的Loop循环的结构。以下是一个Loop循环示例,输出文章标题、特色图像和摘要。你应该在一个归档页面中像这样使用循环:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?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 rel="nofollow noopener noreferrer" href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
                <?php post_thumbnail( 'thumbnail' );?>
            </a>
            <a rel="nofollow noopener noreferrer" 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();

?>

<?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 rel="nofollow noopener noreferrer" href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"> <?php post_thumbnail( 'thumbnail' );?> </a> <a rel="nofollow noopener noreferrer" 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(); ?>

这个循环像我上面所说的一样显示:特色图像、标题和摘要。

Loop循环进阶好代码教程:检查文章内容

有的时候,可能需要给文章列表添加一个标题,或者是把它们都附到一个容器元素里面。如果只是简单的使用上面的Loop循环代码,它可能不管查询是否返回数据都会输出标题——意味着在标题的后面看不到任何数据,或者是一些不必要的东西。

简单来做是:把需要附到Loop循环里的闭合元素和标题放到if 标签里面去。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?php

$args = array(
    // 给予Query查询定义的参数
);

// 定义一个新的查询
$query = new WP_Query( $args );

// 判断我们所查询到的结果
if ( $query->have_posts() ) {


    echo '<section class="clear">';
        echo '<h2>' . __( 'Heading', 'tutsplus' ) . '</h2>';

        // 开始循环往复的查询结果
        while ( $query->have_posts() ) {

            $query->the_post();

            ?>

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

            <?php

        }

    echo '</section>';

}

// 重置请求数据
wp_reset_postdata();

?>

<?php $args = array( // 给予Query查询定义的参数 ); // 定义一个新的查询 $query = new WP_Query( $args ); // 判断我们所查询到的结果 if ( $query->have_posts() ) { echo '<section class="clear">'; echo '<h2>' . __( 'Heading', 'tutsplus' ) . '</h2>'; // 开始循环往复的查询结果 while ( $query->have_posts() ) { $query->the_post(); ?> <article id="post-<?php the_ID(); ?>" <?php post_class( 'left' ); ?>> <a rel="nofollow noopener noreferrer" href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"> <?php post_thumbnail( 'thumbnail' );?> </a> <a rel="nofollow noopener noreferrer" href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"> <?php the_title(); ?> </a> <?php the_excerpt(); ?> </article> <?php } echo '</section>'; } // 重置请求数据 wp_reset_postdata(); ?>

由上可以看出,在每次查询到新的文章的时候,会添加一个开放标签的容器(<section class="clear">)和一个标题(<h2>' . __( 'Heading', 'tutsplus' ) . '</h2>)。

这种方法同样适用,通过查询展示文章列表。如果某同学说,我想在一个分类中创建所有文章的列表。 ul 元素不在Loop循环中,也不在文章中,但是需要在有文章的地方去输出 ul 。那么可以如下做:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php

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

// 定义一个新的查询
$query = new WP_Query( $args );

// 判断我们所查询到的结果
if ( $query->have_posts() ) {

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

        // 开始循环往复的查询结果
        while ( $query->have_posts() ) {

            $query->the_post();

            ?>

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

            <?php

        }

    echo '</ul>';

}

// 重置请求数据
wp_reset_postdata();

?>

<?php $args = array( 'category_name' => 'category-slug', 'post_type' => 'post' ); // 定义一个新的查询 $query = new WP_Query( $args ); // 判断我们所查询到的结果 if ( $query->have_posts() ) { echo '<ul class="category posts">'; // 开始循环往复的查询结果 while ( $query->have_posts() ) { $query->the_post(); ?> <li <?php post_class( 'left' ); ?>> <a rel="nofollow noopener noreferrer" href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"> <?php the_title(); ?> </a> </li> <?php } echo '</ul>'; } // 重置请求数据 wp_reset_postdata(); ?>

当查询检索到任何文章的时候,它会添加开始 ul 元素,然后运行Loop循环。

运行附加的Loop循环

可以很清楚的看到使用 WP_Query 可以创建多个Loop循环,必须每次重置请求数据,并重新创建一个新的 WP_Query 实例。这是因为每个Loop循环都会由不同的参数来输出数据。

以下的例子展示了首篇文章使用摘要和特色图片,但后面的文章只展示标题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<?php

// 定义查询1的参数
$args1 = array(
    'post_type' => 'post',
    'posts_per_page' => '1'
);

// 自定义查询1
$query1 = new WP_Query( $args1 );

// 判断是否有文章.
if ( $query1->have_posts() ) {

    // 开始循环往复的查询结果.
    while ( $query1->have_posts() ) {

        $query1->the_post();

        ?>

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

        <?php

    }

}

// 重置请求数据.
wp_reset_postdata();

// 定义查询2的参数.
$args2 = array(
    'offset' => '1',
    'post_type' => 'post'
);

// 自定义查询2.
$query2 = new WP_Query( $args2 );

// 判断是否有文章.
if ( $query2->have_posts() ) {

    echo '<ul class="more-posts">';

        // 开始循环往复的查询结果.
        while ( $query2->have_posts() ) {

            $query2->the_post();

            ?>

            <li <?php post_class(); ?>>
                <a rel="nofollow noopener noreferrer" href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
                    <?php the_title(); ?>
                </a>
            </li>

            <?php

        }

    echo '</ul>';

}

// 重置请求数据.
wp_reset_postdata();

?>

<?php // 定义查询1的参数 $args1 = array( 'post_type' => 'post', 'posts_per_page' => '1' ); // 自定义查询1 $query1 = new WP_Query( $args1 ); // 判断是否有文章. if ( $query1->have_posts() ) { // 开始循环往复的查询结果. while ( $query1->have_posts() ) { $query1->the_post(); ?> <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>> <a rel="nofollow noopener noreferrer" href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"> <?php post_thumbnail( 'thumbnail' );?> </a> <a rel="nofollow noopener noreferrer" href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"> <?php the_title(); ?> </a> <?php the_excerpt(); ?> </article> <?php } } // 重置请求数据. wp_reset_postdata(); // 定义查询2的参数. $args2 = array( 'offset' => '1', 'post_type' => 'post' ); // 自定义查询2. $query2 = new WP_Query( $args2 ); // 判断是否有文章. if ( $query2->have_posts() ) { echo '<ul class="more-posts">'; // 开始循环往复的查询结果. while ( $query2->have_posts() ) { $query2->the_post(); ?> <li <?php post_class(); ?>> <a rel="nofollow noopener noreferrer" href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"> <?php the_title(); ?> </a> </li> <?php } echo '</ul>'; } // 重置请求数据. wp_reset_postdata(); ?>

这里使用到的两个参数:

  • 'posts_per_page' => '1',第一个查询所用的是为了输出最新的一篇文章。
  • 'offset' = '1',第二查询中,是为了跳过第一篇文章,确保在列表中不会重复。

上面的代码中,loop循环之间有细微的差别。第一个循环输出特色图片,标题和摘要,而第二个循环会判断是否有文章,并在有文章的时候,添加一个ul元素,在每个篇文章使用li元素闭合以及添加链接到文章页面。

注意到第一个循环后使用的wp_reset_postdata(),那是为了避免第二个循环输出重复的数据(与第一个循环重复)。

小结

在循环中,wp_query做的事情不多。Loop循环是用来展示数据的——你来定义需要查询的参数,并由Wordpress查询数据库,最后Loop循环展示。

正如例子代码,可以有很多种变化的Loop循环。一个简单的Loop循环只是按序输出了文章,如果分离 if( $query->have_posts() )while( $query->have_posts() ),那可以插入附加的标签到Loop循环(当然啦,前题是Query查询到数据了)。最后需要注意的是,Loop循环传递不同的参数的时候使用wp_reset_postdata(),这样就可以在同一个页面上新建多个Loop循环(多重循环)。

原文出自:http://code.tutsplus.com/tutorials/mastering-wp_query-using-the-loop--cms-23031

由 痴空见观@WordPress大学 原创翻译,未经允许,禁止转载和采用本译文。

本文掌握 WP_Query:教你如何使用Loop循环到此结束。女孩要坚强,坚强为自己。女孩要努力,努力为未来。小编再次感谢大家对我们的支持!

您可能有感兴趣的文章
WordPress站点Gravatar头像前后台不显示的如何解决办法

WordPress做公司官网好吗?会不会显得档次很低?

WordPress主题需要支持https吗?WordPress站点如何如何实现https?

WordPress站点的页面/标签/分类URL地址如何添加.html?

WordPress站点更换了域名后数据库应该如何操作替换新旧域名?