本文目录
[隐藏]
- 1哪里适合使用Loop循环
- 2Loop 循环结构
- 3Loop循环进阶教程:检查文章内容
- 4运行附加的Loop循环
- 5小结
本文是《掌握 WP_Query》系列教程的第 2 部分,该系列共包含以下 19 个部分:
- 掌握 WP_Query : 入门介绍
- 掌握 WP_Query:教你使用Loop循环
- 掌握 WP_Query:相关的函数
- 掌握 WP_Query:行动器和过滤器
- 掌握 WP_Query:WP_Query类的属性和方法
- WP_Query 参数:文章、页面和文章类型
- WP_Query 参数:分类和标签
- WP_Query 参数:分类法(Taxonomies)
- WP_Query 参数:自定义字段(Custom Fields)
- 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(); ?> |
小伙伴们别忘记了,当循环结束后,要使用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循环(多重循环)。
阅读该系列的其他文章: 上一篇:掌握 WP_Query : 入门介绍 下一篇:掌握 WP_Query:相关的函数