# WordPress 的日志循环结构 Loop

- Link: https://yjyj.net/learn/wordpress-learn/4340.html
- Published: 2013-12-27T15:15:43+08:00
- Author: 小 虾

⚡ 生猛大蝦编辑部 · 30 秒核心看点

 * 先认清 Loop 本质：have_posts() 判断是否有文章，the_post() 负责推进循环。
 * 想改默认列表可用 query_posts，但记得 wp_reset_query()，避免污染后续查询。
 * 更稳妥的做法是用 WP_Query 或 get_posts，适合侧边栏、页脚等自定义输出。

众所周知循环可以算得上是wordpress的主要核心之一，当你了解了循环的真正原理后，你就
可以用它来循环出你想要的文章列表或是某一篇文章，你也可以让文章出现在任意你想要出现
的地方！下面是wordpress 循环的基本结构，其实也不是很复杂~

    ```decode:true
    <?php   
    // The Loop    
    if (have_posts()) : while (have_posts()) : the_post();   
    ...   
    endwhile; else:   
    ...   
    endif;   
    ?>
    ```

在标准的php编程语言当中while就是如果指定的条件成立，则循环执行代码块，那么在wordpress
中也是同样的原理。 if (have_posts()) : while (have_posts()) : the_post(); 大致意思
是这样首先要确保如果有文章的情况下将执行the_post()函数，即wordpress内部的循环功能！
如果have_posts() turns to false 的话 那么循环将终止！

下面我们把wordpress 主要的循环结构拿出来分析一下，这样大家就会有个清晰的认识！功能
都标记好了！

![wordpress-loop-introduction](https://yjyj.net/wp-content/uploads/auto_save_image/
2013/12/07154553C.jpg)

 

下面是一个简单的总结,有三种方式来定义循环功能：

**query_posts()**

如果您使用的是单循环，只想定义某一篇文章或者某一类栏目的文章，使用query_posts（）
返回的类型。这是一种简单有效的循环方式~

**WP_Query()**

如果想拥有一个功能强大的，拥有可自定义的多种循环方式，那么你可以尝试使用WP_Query（）。
设立的其他实例的WP_Query（）在你的主题模板，你可以创建任意数量的多个循环方式，并且
可以自定义每个输出。

**get_posts()**

最后一个函数是使用简单的get_posts（）函数，它可以在你的主题中轻松地创建任何其它循环。
get_posts（）接受与query_posts（）相同的参数，并添加自定义的循环，它可以出现在你的
侧边栏，页脚，或其他任何地方，并使你的主题变得更加完美。

**_使用query\_posts（）函数自定义循环！_**

WordPress默认的循环通常看起来像这样：

    ```decode:true
    <?php  // The WordPress Loop 
    if (have_posts()) : while (have_posts()) : the_post();   
    ...   
    endwhile; else:   
    ...   
    endif;
    ?>
    ```

这个循环后显示的信息取决于许多因素，包括请求的URL和相应的主题模板，用于生成页面。
这里仅显示主题中默认的文章类别！但是当我们想在页面的某一个地方显示某一指定类别的
文章，即排除其余的类别的话！使用query_posts()函数将会变得非常的简单。

假设我们只想除了cat标签等于9以外的文章类别时，我们可以这样写！

    ```decode:true
    <?php
    query_posts('cat=-9'); // 排除category (tag_ID = 9)
    if (have_posts()) : while (have_posts()) : the_post();   
    ...   
    endwhile; else:   
    ...   
    endif;
    ?>
    ```

如果我们希望查询函数能够重置修改的话，我们可以尝试这样来定义！

    ```decode:true
    <?php
    global $query_string; // 定义全局查询信息
    $posts = query_posts($query_string.'&cat=-9'); // 排除相应的category，文章类别 
    if (have_posts()) : while (have_posts()) : the_post();   
    ...   
    endwhile; else:   
    ...   
    endif;   
    wp_reset_query(); // 重置 query  函数
    ?>
    ```

有了上述自定义循环结构我就可以很容易的进行修改，例如我们可以对一些参数进行额外的
限制！

    ```decode:true
    $posts = query_posts($query_string.'&cat=-7,-8,-9&posts_per_   
    page=3');
    ```

这里我们添加了排除cat ID 等于7，8，9的文章类别，并且只显示3条记录！

**_强大的 WP\_Query（） 函数_**

在许多情况下，你可能想保留原来的查询，只调整某些参数。要做到这一点，可以使用WP_Query
设置下面的循环结构：

    ```decode:true
    <?php
    $custom_query = new WP_Query('cat=10&showposts=10&paged='.$paged);   
    while($custom_query->have_posts()) : $custom_query->the_post();   
    ...   
    endwhile;   
    next_posts_link('« Older Entries');   
    previous_posts_link('Newer Entries »');   
    wp_reset_postdata(); // 重置  query 函数 
    ?>
    ```

提示：$custom_query = new WP_Query(‘showposts=10&paged=’.$paged);这里指定显示十篇
文章，如果将showposts=-1的话将遍历出所有的文章。

另一个有实用的WP_Query（）循环方法是可以指定循环出相应分类栏目标题中的文章！例如：

    ```decode:true
    $custom_query = new WP_Query('pagename=news&paged='.$paged); //循环出news（新闻）分类栏目中的文章
    ```

下面我们来看一下关于使用WP_Query（）循环方法的一些简单的例子！

    ```decode:true
    /* 从CatID为7的分类中取出3篇文章 */
    new WP_Query(
    'cat=7&showposts=3'
    ); 
    ```

    ```decode:true
    /* 从非CatID为7的分类中取出5篇文章 */
    new WP_Query(
    'cat=-7&showposts=3'
    ); 
    ```

    ```decode:true
    /* 从非CatID为7的分类中取出5篇文章，并跳过前5篇 */
    new WP_Query(
    'cat=-7&showposts=3&offset=5'
    ); 
    ```

**_自定义循环get\_posts（）_**

如果你想在自己的主题中创建多个简单且安全的循环方式，那么你可以使用get_posts（）你
只需要的地方创建一个额外的，自循环，只需添加以下代码：

    ```decode:true
    <?php // additional loop via get_posts
    global $post;   
    $args = array('category' => -9); // 排除指定类别
    $custom_posts = get_posts($args);   
    foreach($custom_posts as $post) : setup_postdata($post);   
    ...   
    endforeach;   
    ?>
    ```

但是请注意，该get_posts需要一个数组作为参数时。可以参考以下格式：

    ```decode:true
    $args = array('category'=>-7,-8,-9, 'numberposts'=>3, 'order'=>'ASC');
    ```

这里限制文章数目使用的是’numberposts’=>3，而不是posts_per_page！

感谢伟大的原作者:http://www.wondercss.com/2013/wordpress/1777/

❓ 延伸问答与排错指南（FAQ）

WordPress 的 Loop 到底是做什么的？

Loop 是 WordPress 输出文章内容的核心循环结构。它先判断是否有文章，再逐篇调用 the_post()
取出数据并渲染模板。理解它后，你就能控制文章列表、单篇内容和不同位置的输出逻辑。

query_posts 和 WP_Query 有什么区别？

query_posts 会直接改写主查询，适合简单调整默认列表，但容易影响页面原始查询，使用
后要重置。WP_Query 则是新建独立查询实例，更适合做多个自定义循环，灵活性和可控性更好。

如何排除某些分类文章不显示？

可以在 query_posts 或 WP_Query 中通过 cat 参数排除指定分类，例如用 cat=-9 排除分类
ID 为 9 的文章。若还要限制数量，可继续加 posts_per_page 参数；使用后注意重置查询，
避免影响页面其他模块。

📚 【[WordPress 学习](https://yjyj.net/category/learn/wordpress-learn)】专栏延伸
阅读与热门精选（[全站文章归档](https://yjyj.net/archive)）：

 * [更改WordPress网站的作者链接地址](https://yjyj.net/learn/wordpress-learn/4338.html)
 * [移除WordPress上传图片的宽度和高度参数](https://yjyj.net/learn/wordpress-learn/4336.html)
 * [WordPress 实用代码技巧：为含下载文件文章添加标识与常用函数合集](https://yjyj.net/learn/wordpress-learn/4438.html)
 * [再次折腾,wordpress导航继续研究](https://yjyj.net/learn/wordpress-learn/4447.html)
 * 热门必读[京东云路由器雅典娜 AX6600 折腾记](https://yjyj.net/learn/7810.html)
 * 热门必读[斐讯R1升级固件，音质终于得以提升了](https://yjyj.net/learn/5984.html)
