文本是《掌握 WP_Query(共19篇)》专题的第 2 篇。阅读本文前,建议先阅读前面的文章:
正如我们在入门指引里面提到的, 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类中的位置:
<?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循环示例,输出文章标题、特色图像和摘要。你应该在一个归档页面中像这样使用循环:
<?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 标签里面去。
<?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
。那么可以如下做:
<?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循环都会由不同的参数来输出数据。
以下的例子展示了首篇文章使用摘要和特色图片,但后面的文章只展示标题:
<?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(共19篇)》专题的第 2 篇。请继续阅读该专题下面的文章:
- 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:结尾