WordPress主题开发 — 模版循环(条件判断、多个循环、新建查询和文章循环)

2023-11-20

        循环是 WordPress 通过主题模板文件输出文章的默认机制 。在循环中,WordPress 遍历当前页面获取到的所有文章,然后使用主题中的模版标签将其格式化并输出。

我们可以用 WordPress 循环来做很多事情,例如:

  • 在网站首页显示多个文章模块
  • 在文章详情页面显示内容和评论
  • 在侧边栏中显示最新文章或热门文章
  • 显示指定文章类型或分类方法中的数据
  • 根据指定的条件获取数据并显示在文章模块中

循环细节

循环的基本使用方法如下。

<?php 
if ( have_posts() ) : 
    while ( have_posts() ) : the_post(); 
        // 显示文章内容
    endwhile; 
endif; 
?>

上面的代码首先判断是否有循环,如果有,则逐个显示循环中的内容。

  • have_posts() 函数检查当前页面是否有文章。 
  • 只要括号中的条件逻辑为真, while 循环就会继一直执行下去。 

使用文章循环

循环应放在 index.php或其他用来显示文章的模板中。因为我们不想在每个文章中都显示网站页头,所以循环代码应该放在 get_header() 之后。

<?php 
get_header();

// 循环代码从这里开始
if ( have_posts() ) : 
    while ( have_posts() ) : the_post(); 
        // 显示文章内容
    endwhile; 
endif; 
?>

如以上代码所示,循环必须以 if 和 while 语句开头,以 endwhile 和 endif 语句结束。用以显示文章内容的模版标签必须在循环开始语句和结束语句中间。

如果当前页面没有文章,我们可以显示一个 404 错误信息,这个信息必须放在 endwhile 和 endif 语句之间 ,如下所示。

这是一个非常简单的 index.php 文章。

<?php
get_header();

if ( have_posts() ) : 
    while ( have_posts() ) : the_post();
        the_content();
    endwhile;
else :
    _e( '抱歉,未找到您需要的文章。', 'textdomain' );
endif;

get_sidebar();
get_footer();
?>

可以在文章循环中显示什么

我们可以在循环中使用模版标签显示各种文章内容、文章自定义字段,下面是一些常用的模版标签:

显示文章的时候,我们可以使用条件标签控制文章是否在满足某种条件的情况下显示。

示例

下面让我们看一些 WordPress 循环的真实使用示例。

基本示例

文章列表页

大多数网站都有文章列表页面,在列表页面中,我们可以显示这个列表中所有文章的标题、缩略图、摘要、分类等信息。下面的示例是一个简单的列表页面,示例代码首先检查是否有文章,如果有,显示文章标题、缩略图、摘要,如果没有,则显示提示消息。

<?php 
if ( have_posts() ) : 
    while ( have_posts() ) : the_post(); 
        the_title( '<h2>', '</h2>' ); 
        the_post_thumbnail(); 
        the_excerpt();
    endwhile; 
else: 
    _e( '抱歉,未找到您需要的文章。', 'textdomain' ); 
endif; 
?>

文章详情页

在 WordPress 中,每个文章都有自己的详情页面,我们可以使用模版标签在这个页面上显示文章的各种信息。

在下面的示例中,模版循环显示了文章的标题和内容,除此之外,我们还可以显示文章正文、文章作者、发表时间等信息。

<?php 
if ( have_posts() ) : 
    while ( have_posts() ) : the_post(); 
        the_title( '<h1>', '</h1>' ); 
        the_content();
    endwhile; 
else: 
    _e( '抱歉,未找到您需要的文章。', 'textdomain' ); 
endif; 
?>

为某个分类中的文章显示不同的内容和样式

我们来看一下模版示例,在这个示例中:

  • 首先,显示每篇文章的标题、发布时间、作者、正文和分类。
  • 然后,我们利用判断函数 in_category() 来为分类 ID 为 3 的文章显示不同的样式。 
<?php
// 开始循环
if ( have_posts() ) : 
    while ( have_posts() ) : the_post();
        // 判断文章是否在分类 3 中,如果是,添加 CSS 类 "post-category-three". 否则,添加 CSS 类 "post".
        if ( in_category( 3 ) ) : ?>
            <div class="post-category-three">
        <?php else : ?>
            <div class="post">
        <?php endif; 

            // 显示文章标题
            the_title( '<h2>', ';</h2>' ); 

            // 显示该文章作者存档的链接
            printf( __( '作者 %s', 'textdomain' ), get_the_author_posts_link() );

            // 显示文章内容
            ?>
            <div class="entry">
                <?php the_content() ?>
             </div>
    
            <?php
            // 显示逗号分隔的文章分类
            _e( '文章分类 ', 'textdomain' ); the_category( ', ' ); 

        // 关闭 div
       ?>
       </div>

    <?php 
    // 结束循环,下面是没有文章时显示的内容
    endwhile; 

else :
    // 如果没有文章,显示提示消息
     _e( '抱歉,未找到您需要的文章。', 'textdomain' );
 
// 结束判断和循环
 endif;
?>

主循环

主循环是 WordPress 中的一个非常重要的概念,在开始学习多个循环之前,我们首先需要了解一下什么是主循环。

当我们访问 WordPress 站点的时候,WordPress 会根据我们访问的页面为我们新建一个文章查询和循环,设置一个 $wp_query 全局变量。这个变量就是主循环数据的变量,我们可以直接在页面模版中循环这个数据来输出文章。

看一下下面的代码:

if ( have_posts() ) : 
    while ( have_posts() ) : the_post();
        the_title();
    endwhile;
endif;

为了说明主循环,我们稍微改写一下代码。

if ( $wp_query->have_posts() ) : 
    while ( $wp_query->have_posts() ) : $wp_query->the_post();
        the_title();
    endwhile;
endif;

两段代码是等效的,为了保持代码的简洁性,WordPress 隐藏了全局的主循环变量 $wp_query

多个循环

在某些情况下,我们可能需要使用多个循环。例如,我们可能需要在页面顶部的内容列表中显示文章标题,然后在页面下方显示文章内容。因为我们使用的是同一个循环,我们只需要在开始第二次循环之前重置循环即可,使用函数 rewind_posts() 即可实现这个功能。

使用 rewind_posts() 函数重新开始循环

我们可以使用 rewind_post() 函数让循环从循环中的第一个元素重新开始,当我们需要在一个页面中循环同一个查询时,这个函数非常有用。

这下面是一个rewind_posts() 示例 :

<?php
// 开始第一次循环
if ( have_posts() ) : 
    while ( have_posts() ) : the_post();
        the_title();
    endwhile;
endif;

// 使用 rewind_posts() 重置循环
rewind_posts();

// 开始第二次循环
while ( have_posts() ) : the_post();
    the_content();
endwhile;
?>

新建查询和文章循环

如上面的代码所示,我们可以非常容易的循环同一个查询结果两次或多次,但是很多时候,这不是我们所需要的。有时候我们需要在一个页面上显示不同的文章,例如,我们需要在页面的左侧显示所有文章,右侧显示分类「example-category」中的文章。这种情况下,我们需要新建一个文章查询,然后循环这个新的文章查询结果,示例代码如下:

<?php
// 显示所有文章
if ( have_posts() ) : 
    while ( have_posts() ) : the_post();
        the_title();
        the_content();
    endwhile;
else :
    _e( '抱歉,未找到您需要的文章。' );
endif;
wp_reset_postdata();                                                        

// 创建一个新的文章查询,获取分类 「category_name」中的文章。
$secondary_query = new WP_Query( 'category_name=example-category' );        

// 循环新的查询结果
if ( $secondary_query->have_posts() )
    echo '<ul>';
    while ( $secondary_query->have_posts() ) : $secondary_query->the_post();
        the_title( '<li>', '</li>' );
     endwhile;
     echo '</ul>';
endif;
wp_reset_postdata();
?>

如上例所示,我们首先显示主循环中的结果。然后,使用 WP_Query 类查询指定分类中的文章。

请注意,上面示例中的第二个循环和主循环还有一个区别:后者调用了 wp_reset_postdata() 函数来重置文章数据。

重置多个文章循环

在循环中,文章数据是存储在 $post全局变量中的,在循环结束时,我们需要重置这个全局变量,否则会导致一些难以调试的 Bug 。根据循环调用的方式,有三个函数可以用来重置循环。

使用 wp_reset_postdata() 重置文章数据

使用 WP_Query 新建自定义循环或使用了多个循环时,请使用 wp_reset_postdata() 来重置文章数据,这个函数将全局变量 $post 变量还原到主查询中的当前帖子。如果我们在进行 WordPress开发时遵循了最佳实践,该函数是用来重置循环的最常见函数。

建议在使用了 WP_Query 类新建了查询和循环时,都要使用 wp_reset_postdata() 函数重置文章数据。

下面是使用 WP-Query 类新建了查询和循环后,使用 wp_reset_postdata() 还原文章数据的示例代码。

 <?php 
// WP_Query 所使用的参数 
$args = array( 'posts_per_page' => 3 ); 

// 调用 WP_Query 新建文章查询. 
$the_query = new WP_Query( $args ); 

if ( $the_query->have_posts() ) : 
    // 开始循环
    while ( $the_query->have_posts() ) : $the_query->the_post(); 
        the_title(); 
        the_excerpt(); 
    // 结束循环
    endwhile; 
else: 
    _e( '抱歉,未找到您需要的文章。', 'textdomain' ); 
endif; 

wp_reset_postdata(); 
?> 

使用 wp_reset_query() 重置主循环和文章数据

因为 query_posts()query_posts()query_posts() 函数新建的循环是一个主循环,在使用了这个函数新建查询后,我们必须使用 wp_reset_query() 来还原查询和文章数据。如果使用了WP_Query 新建查询,我们可以使用 wp_reset_query() 函数来还原文章数据(因为该函数已经调用了 wp_reset_postdata() 函数),但是最好的做法是使用 wp_reset_postadata 函数来还原使用 WP_Query 新建的文章循环。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WordPress主题开发 — 模版循环(条件判断、多个循环、新建查询和文章循环) 的相关文章

随机推荐

  • 使用 ChatGPT 从 JavaScript 代码生成 React 组件

    欢迎来到我们的教程 了解如何使用 ChatGPT 从 JavaScript 代码生成 React 组件 在本指南中 我们将探讨使用 ChatGPT 完成此任务的好处 并引导您完成分步过程 React 是一个流行的用于构建用户界面的 Java
  • python3.6+wamp配置python脚本环境(Windows)

    最近学到ajax 教程里需要用到wamp 这里就不介绍wamp了 wamp包含了apache服务器 但其默认只支持php脚本 而本人没学过php 所以希望降低学习成本 于是动手修改apache配置文件 网上有很多修改的教程 但我尝试了很多种
  • 5. handle方法详解-handler获取

    文章目录 1 概览 2 handle方法回顾 3 HandlerMappings继承关系 4 getHandlerInternal 4 1 RequestMappingInfoHandlerMapping getHandlerInterna
  • 包管理

    8 包管理 8 1 Go Modules是什么 Go语言通过包管理来封装模块和复用代码 这里我们只介绍Go Modules管理方法 Go Modules于Go语言1 11版本时引入 在1 12版本正式支持 是由Go语言官方提供的包管理解决方
  • VC从系统进程中查找并杀掉指定进程

    写程序的时候 有时候会调用别 别人写的 的程序的EXE 有的时候还会隐藏这个EXE 但是由于你的程序退出时并没有关闭这个EXE 只是隐藏了 所以在系统的进程查看窗口里面还是会看到的 这样当你下次再执行你自己的程序 还要调用这个程序的时候就会
  • [转载]解决PPPOE宽带拨号经常掉线的一种方法(适合刷了第三方固件的无线路由)

    文章作者 姜南 Slyar 文章来源 Slyar Home www slyar com 转载请注明 谢谢合作 最近在进行下载或看视频等大量占用网络带宽的行为时 宽带PPPOE连接非常不稳定 经常自动掉线 严重影响我的下载进程和看视频的乐趣
  • MariaDB数据库的主从配置

    1 前置工作 首先准备两台可以互相ping通的机器 两台机器可以互为主从 示例 10 210 23 77主服务器 10 20 84 183从服务器 2 安装 在两台机器上各自安装数据 解压MariaDB安装包 tar zxvf MariaD
  • 基于深度学习的无人机在室内走廊环境中的视觉导航

    与激光雷达和雷达不同 使用单目摄像头作为无人机传感器的优势之一是它能够检测各种视觉特征 例如颜色 纹理和形状 这种适应性使其能够在各种室内和室外环境中表现良好 将单目摄像头用于无人机的另一个好处是 它允许更轻巧和灵活的设计 该摄像机不需要额
  • 5 个免费的受欢迎的 SQLite 管理工具

    SQLite Expert Personal Edition SQLite Expert 提供两个版本 分别是个人版和专业版 其中个人版是免费的 提供了大多数基本的管理功能 SQLite Expert 可以让用户管理 SQLite3 数据库
  • 区块链中的哈希算法

    区块链中的密码学 密码学在区块链中的应用主要有两个 哈希算法与非对称加密算法 这次主要对哈希算法进行详细的说明 哈希算法 哈希算法的特点有 1 输入可以为任意大小的字符串 2 产生固定大小的输出 3 可以在合理的时间内算出输出值 若要满足密
  • input框限制输入40个字符_input标签的 maxlength 属性(HTML限制最大输入字数)

    实例 下面这个 HTML 表单带有最大长度分别是 85 和 55 个字符的两个输入字段 Name Email 亲自试一试 定义和用法 maxlength 属性规定输入字段的最大长度 以字符个数计 maxlength 属性与 或 配合使用 语
  • centos 修改时间

    文章目录 centos 修改时间 1 查询时间常用命令 2 修改时区 3 修改时间 3 1 手动修改时间 3 2 联网修改时间 centos 修改时间 Centos系统时间分为系统时间和硬件时间 二者必须都修改 重启系统才会永久生效 背景
  • 深入分析linux内核的内存分配函数devm_kzalloc

    在分析驱动代码的时候 经常会遇到使用devm kzalloc 为一个设备分配一片内存的情况 devm kzalloc 是内核用来分配内存的函数 同样可以分配内存的内核函数还有devm kmalloc kzalloc kmalloc 它们之间
  • Android简单的反编译嵌入例子

    简单的反编译嵌入例子 1 创建一个源工程 2 创建一个转接类 如Ed Sdk java 3 在转接类里面建立一个空方法A 方法A需要被调用 4 创建一个库工程 2 创建一个库转接类 如Ed Sdk java 类名方法名变量名完全相同 6 在
  • Java和Scala中泛型类的继承

    Java和Scala中泛型类的继承 1 泛型的学习 2 泛型类的继承 1 泛型的学习 参考 Java编程的逻辑一书 马骏昌编写的 对泛型的讲解很详细 这里着重补充一下关于泛型类的继承 2 泛型类的继承 这里主要有三种情况 存在父类 clas
  • 利用TBDBitmapData对象查找两张图片上的不同

    利用TBDBitmapData对象查找两张图片上的不同 从右上角开始利用双层循环遍历两图上的所有象素点 并相互比较 不完整代码如下 procedure TForm1 Button5Click Sender TObject var Bmp1
  • [人工智能-深度学习-53]:循环神经网络 - LSTM长短记忆时序模型的简化:门控循环网络GRU模型

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 121599096 目录 第1章 前序知
  • HTML开始历程Day01

    1 HTML 其实就是网页基本结构 CSS 功能 美化网页 不让网页太单调 JS 功能 能让网页动起来 产生很多的交互行为 HTML是什么 Hyper Text Markup Language 超文本标记语言 服务器端口号 路径位置 HTM
  • Linux下用命令行编译运行Java总结

    最近使用腾讯云的Cloud Studio写Java 只能使用命令行进行编译运行 趁此机会 学习一下Linux的一些常用命令 平时windows下IDE用习惯了 现在用命令行进行编译运行 发现其实问题还是挺多的 所以写下这篇文章 1 java
  • WordPress主题开发 — 模版循环(条件判断、多个循环、新建查询和文章循环)

    循环是 WordPress 通过主题模板文件输出文章的默认机制 在循环中 WordPress 遍历当前页面获取到的所有文章 然后使用主题中的模版标签将其格式化并输出 我们可以用 WordPress 循环来做很多事情 例如 在网站首页显示多个