使用 WP_Query自定义WordPress循环

文章目录

最近又在学习wordpress基础的知识,虽说这个主题是自己一点一点弄出来的,但是当时写的时候大多是copy现成的代码,要说自己直接写出来几乎不可能。所以就针对这些基础的函数,结构什么的再来研究下。

自定义Wordpress循环是wordpress实现功能的主要构成部分,主要有两种方式实现:一是用query_posts()函数,二是采用WP_Query类。关于使用query_posts()函数的使用,可以参考这篇文章:
[blink]更多文章参考:
自己定义wordpress主循环
[/blink]

query_posts()函数存在的问题

不知道大家有没有这个体会,我是遇到过这个问题:wordpress判断首页函数失效。后来排查后发现在使用query_posts()函数后没有用wp_reset_query()重置查询,从而导致判断首页的函数失效。

query_posts()函数使用有如下几点问题:

  • 会干扰那些用到了 WordPress 循环的插件。
  • 可能使一些 WordPress 条件判断函数失效。如上述我说的首页判断函数
  • 分页将无法正常工作,除非你适当设置 ‘paged’ 查询: adding the paged parameter

如果你在模板页面中使用 query_posts()函数 ,WordPress 就会在 query_posts 时执行数据库查询和检索记录(即它是如何知道是服务于哪个模板页面!)所以,当你使用 query_posts() 覆盖了默认的查询,你基本上就扔掉了默认的查询以及它的结果,并重新对数据库执行了另一个查询。所以很容易扰乱主循环的正常工作。解决这个问题的最好办法就是用wp_reset_query()重置查询。

使用WP_Query自定义WordPress循环

当然,还有一个选择就是使用WP_Query来创建wordpress循环。

首先使用WP_Query创建一个实例:比如我们要创建一个最新日志列表,就可以使用下面的代码:

1
2
3
4
<?php
    $recentPosts = new WP_Query();
    $recentPosts->query('showposts=5');
?>

上面代码定义了一个叫做 recentPosts 的变量,它是WP_Query 类的一个实例。然后我使用了WP_Query的一个方法开始一个查询,我们可以使用和query_posts函数一样的参数。现在就可以开始我们自己的循环了:

1
2
3
<?php while ($recentPosts->have_posts()) : $recentPosts->the_post(); ?>
   <!-- do some stuff here -->
<?php endwhile; ?>

上面我们用了 WP_Query 的两个方法,分别是 have_posts 和 the_post。

这样做的好处是在循环中,我们可以使用标准的 post 模板函数。比如下面是使用自定义的 Loop 先是最新5篇文章的完整代码:

1
2
3
4
5
6
7
8
9
10
11
<h3>最新日志</h3>
<ul>
<?php
    $recentPosts = new WP_Query();
    $recentPosts->query('showposts=5');
?>
<?php while ($recentPosts->have_posts()) : $recentPosts->the_post(); ?>
    <li><a href="<?php the_permalink() ?>" rel="bookmark"><?php the_title(); ?></a></li>
<?php endwhile; ?>
<?php wp_reset_query(); ?>
</ul>

小结

其实query_posts()函数也可以看做是 WP_Query的专门针对主循环的一个方法,使用 WP_Query创建实例后再使用query方法则不会影响到主循环。不过,我现在用的query_posts()函数蛮多的。
参考文章:使用 WP_Query 而不是 query_posts 自定义 WordPress 主循环

本文出自 TENNFY博客,转载时请注明出处及相应链接。

本文永久链接: https://www.tennfy.com/1275.html

下一篇文章:

上一篇文章:

9人参与了讨论

  1. ipeld14 说:

    原来如此,我还以为 is_home() 用不了了呢 :oops:

  2. 博主右侧推荐的这个VPS如何? 我看价格好像蛮便宜的样子 是美元吧?

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

6 + 8 = ?


您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

返回顶部