性价比最高的香港ASP、PHP主机提供商
做网站,就上凡科建站

掌握 WP_Query:教你使用Loop循环

Loading
0
Comodo SLL证书促销 - 免费ssl证书申请_ssl证书购买_ev ssl证书_https证书购买 - GDCA_数安时代

正如我们在入门指引里面提到的, 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();
 
?>

小伙伴们别忘记了,当循环结束后,要使用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();
 
?>

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

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

由上可以看出,在每次查询到新的文章的时候,会添加一个开放标签的容器(<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();
 
?>

当查询检索到任何文章的时候,它会添加开始 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();
 
?>

这里使用到的两个参数:

  • ‘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 : 入门介绍
下一篇:掌握 WP_Query:相关的函数
MetInfo | 最适合企业网站建设的cms系统

关于 kanlidy

个人站长:Wayearn.com,新浪微博@痴空见观

精彩推荐

WordPress 分页链接函数 paginate_links

WordPress 分页链接函数 paginate_links

WordPress HTTP API 指南:wp_remote_post 概述

WordPress HTTP API 指南:wp_remote_post 概述

发表评论