wordpress循环结构是一个主题模版的最重要的部分,当你打开index.php文件的时候通常都会看见很具代表性的 if(have_posts()) 语句,包含在其中的就是wordpress的循环结构语句,当然默认的循环方法已经可以很完美的运行在执行单一循环的主题中。
如果你想制作更加高级的设计,我们就应该了解一些多样性的自定义循环,所以学习更加强大的循环是十分必要的,幸运的是wordpress已经为我们提供了四种灵活的循环结构供我们使用。
默认循环
- query_posts() 循环
- WP_Query() 循环
- get_posts() 循环
这几种循环方式足以应付各种各样的需求,它们都各自都包含了相同的底层功能,接受查询参数的方式从本质上来说也是相同的,这四种技术可以同时运用到你的wordpress主题中。如果你想查看默认循环,最直接方式是打开index.php文件它就包含在里面。它们的功能就是将存储在数据库中的文章循环出来,通过浏览器显示给用户,然后根据模版标签轻松的循环出文章标题、内容、关键词甚至更多内容,下面我们就来认识一下这四种wordpress循环方式。
默认循环 默认循环通常看起来像这样:
<?php if (have_posts()) : while (have_posts()) : the_post(); ?> <div <?php post_class(); ?> id="post-<?php the_ID(); ?>"> <h1><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h1> <?php the_content(); ?> </div> <?php endwhile; ?> <div class="navigation"> <div class="next-posts"><?php next_posts_link(); ?></div> <div class="prev-posts"><?php previous_posts_link(); ?></div> </div> <?php else : ?> <div <?php post_class(); ?> id="post-<?php the_ID(); ?>"> <h1>Not Found</h1> </div> <?php endif; ?>
那么为什么要使用默认循环?因为大部分情况下默认循环可以为我们循环出文章发布的内容,起初对于大多数主题来说都会使用这种默认循环。它会告诉wordpress通过循环遍历出所有发布的文章信息,包括各种各样的模版标签(文章标题,文章内容..),它会根据有效的标签来识别存储在数据库中的数据种类。
根据发送的数据查询,默认循环将会根据日期或者分类栏目中遍历出一定数量的文章等等。
所以如果只想做一些基本的遍历方式默认循环已经运行的非常好了,如果你想做的更多就应该自定义一些查询条件使它为你做更多的事情。
query_posts()循环
query_posts 循环功能可以让我们修改查询和修改想要获取的文章信息,我们只需要修改一些参数来覆盖之前的查询方式。
<?php global $query_string; // 必须 $posts = query_posts($query_string.'&cat=-9'); // 排除 category 9 ?> <?php //循环内容 ?> <?php wp_reset_query(); // 重置 query ?>
如果你有一个默认的循环方式,但是你想改变一下文章显示的数量,并且排除两个分类栏目的文章,最后还要按照正序排序的方式遍历出来,那么你只需在循环之前添加变量参数即可。
<?php global $query_string; // 必需 $posts = query_posts($query_string.'&posts_per_page=3&cat=-6,-9&order=ASC'); ?> <?php // 循环内容?> <?php wp_reset_query(); // 重置 query ?>
当然如果你愿意你同样可以使用以下代码覆盖第二句查询,实现的效果是一样的。
$posts = query_posts('posts_per_page=3&cat=-6,-9&order=ASC');
值得注意的一点就是我们已经将$query_string参数 从query_posts中移除了。但这意味着很可能显示不出分页信息,所以在移除该参数之前应该清楚自己想要什么样的效果。
在什么样的情况下可以使用? 我们可以使用query_posts 对参数的修改修改来执行一些简单的循环,包括限制文章显示数量,排除指定分类栏目,标签等等。 如果你需要更加强大复杂的循环方式当然query_posts也可以胜任,但是最好方式是使用WP_Query。
WP_Query()循环
为了想完全控制文章循环的数量,WP_Query 可以胜任这一任务,当我尝试去修改默认的循环方式时,它看起来和query_posts非常相似。例如,使用WP_Query排除一些指定的category:
<?php $custom_query = new WP_Query('cat=-9'); // 排除 category 9 while($custom_query->have_posts()) : $custom_query->the_post(); ?> <div <?php post_class(); ?> id="post-<?php the_ID(); ?>"> <h1><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h1> <?php the_content(); ?> </div> <?php endwhile; ?> <?php wp_reset_postdata(); // reset the query ?>
它接收了与query_posts相同的参数,包括排除或者包括指定categories以及修改显示文章数量上它们基本上时一致的。但是你再看一下下面这几段代码你就会发现在使用自定义循环方面 WP_Query 会方便许多而且也非常容易修改参数。
$custom_query = new WP_Query('cat=-7,-8,-9'); // 排除指定 categories $custom_query = new WP_Query('posts_per_page=3'); // 限制文章显示数量 $custom_query = new WP_Query('order=ASC'); // 按照正序排序
正如我们所想的那样,WP_Query 可以使用与query_posts 和get_posts相同的组合语法进行循环调用。
$custom_query = new WP_Query('posts_per_page=3&cat=-6,-9&order=ASC');
需要注意的是,无论在什么情况下只要你使用了WP_Query循环,那么我们就不再需要$query_string这个变量了,除了使用WP_Query 自定义默认循环外,我们也可以使用它来自定义更加多样的循环,以下是代码示例:
<?php // 循环1 $first_query = new WP_Query('cat=-1'); while($first_query->have_posts()) : $first_query->the_post(); ... endwhile; wp_reset_postdata(); // 循环2 $second_query = new WP_Query('cat=-2'); while($second_query->have_posts()) : $second_query->the_post(); ... endwhile; wp_reset_postdata(); // 循环 3 $third_query = new WP_Query('cat=-3'); while($third_query->have_posts()) : $third_query->the_post(); ... endwhile; wp_reset_postdata(); ?>
以上每一种循环方式都可以使用到你主题的任何地方,无需为它们进行排序,例如第一个循环可以放在侧边栏的位置,第二个放在页脚的位置等等。每一种循环都很容易使用,你可以输入一些有效的参数对其进行修改。
在什么样的情况下可以使用? WP_Query 可以用在多样的自定义循环中,通过设置一些额外的功能,你可以创建任意数量的多个循环然后自定义每一种循环的输出方式。
尽管如此,我们也并不需要每一次都派它上场,有些简单循环你可以用之前的两种循环就足够了。
get_posts() 循环
使用get_posts() 可以在你的主题中很方便的创建多样化的循环,使用这种方法也是比较安全可靠的,你可以在任何地方快速的遍历出文章,你可以尝试使用 get_posts 。假如你想遍历出最新发布的十篇文章,或者随机发表的文章。使用get_posts将变得非常容易,下面是一些简单的例子:
<?php global $post; // 必需 $args = array('category' => -9); // 排除 category 9 $custom_posts = get_posts($args); foreach($custom_posts as $post) : setup_postdata($post); ... endforeach; ?>
值得注意的是,无论什么情况下, get_posts是需要一个数组接收参数的,以下是使用数组的组合方式。
$args = array('numberposts'=>3, 'category'=>-6,-9, 'order'=>'ASC');