欢迎光临
我们一直在努力

掌握 WP_Query:教你使用Loop循环

建站超值云服务器,限时71元/月

本文目录
[隐藏]

  • 1哪里适合使用Loop循环
  • 2Loop 循环结构
  • 3Loop循环进阶教程:检查文章内容
  • 4运行附加的Loop循环
  • 5小结

本文是《掌握 WP_Query》系列教程的第 2 部分,该系列共包含以下 19 个部分:

  1. 掌握 WP_Query : 入门介绍
  2. 掌握 WP_Query:教你使用Loop循环
  3. 掌握 WP_Query:相关的函数
  4. 掌握 WP_Query:行动器和过滤器
  5. 掌握 WP_Query:WP_Query类的属性和方法
  6. WP_Query 参数:文章、页面和文章类型
  7. WP_Query 参数:分类和标签
  8. WP_Query 参数:分类法(Taxonomies)
  9. WP_Query 参数:自定义字段(Custom Fields)
  10. WP_Query 参数:日期
  11. WP_Query 参数:状态、排序和分页
  12. WP_Query 参数:作者、搜索、密码、权限、缓存和返回字段
  13. 掌握 WP_Query:10个有用的例子
  14. 结合 WP_Query 与主查询(the Main Query)
  15. 掌握 WP_User_Query
  16. 掌握 WP_Comment_Query
  17. 掌握 WP_Meta_Query 和 WP_Date_Query
  18. WordPress 4.1的查询改进
  19. 掌握 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 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();
 
?>

<?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%20the_permalink();%20?>” title=”<?php the_title_attribute(); ?>”> <?php post_thumbnail( ‘thumbnail’ );?> </a> <a href=”<?php%20the_permalink();%20?>” 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 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>';
 
}
 
// 重置请求数据
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 href=”<?php%20the_permalink();%20?>” title=”<?php the_title_attribute(); ?>”> <?php post_thumbnail( ‘thumbnail’ );?> </a> <a href=”<?php%20the_permalink();%20?>” 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 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 href=”<?php%20the_permalink();%20?>” 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 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
 
    }
 
}
 
// 重置请求数据.
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 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 href=”<?php%20the_permalink();%20?>” title=”<?php the_title_attribute(); ?>”> <?php post_thumbnail( ‘thumbnail’ );?> </a> <a href=”<?php%20the_permalink();%20?>” 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 href=”<?php%20the_permalink();%20?>” 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循环(多重循环)。

阅读该系列的其他文章: 上一篇:掌握 WP_Query : 入门介绍 下一篇:掌握 WP_Query:相关的函数

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 掌握 WP_Query:教你使用Loop循环
分享到: 更多 (0)