WordPress主题开发( 八)之—— 模板循环详细用法
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; get_sidebar();
get_footer();
?>
如上所示,模板循环必须以 if
和 while
语句开头,并以 endwhile
和 endif
语句结束。文章内容的模板标签应该位于循环开始语句和结束语句之间。
如果当前页面没有文章,我们可以显示一个 404 错误信息,这个信息应该位于 endwhile
和 endif
语句之间,如下所示。
<?php
get_header();if (have_posts()) : while (have_posts()) : the_post();the_content();endwhile;
else :_e('抱歉,未找到您需要的文章。', 'textdomain');
endif;get_sidebar();
get_footer();
?>
模板循环中的模板标签
在模板循环中,我们可以使用各种模板标签来显示不同的文章内容和信息。以下是一些常用的模板标签:
the_ID()
:显示文章或页面 ID。the_meta()
:显示文章或页面的自定义字段the_title()
:显示文章标题。the_post_thumbnail()
:显示文章的缩略图。the_excerpt()
:显示文章摘要。the_category()
:显示当前文章所属的分类。the_author()
:显示文章作者。the_content()
:显示文章正文内容。the_time()
:显示文章发布时间。the_tags()
:显示文章的标签。next_post_link()
:显示在当前文章之后 发布的文章的链接previous_post_link()
:显示在当前文章之前发布的文章的链接
通过这些模板标签,我们可以根据需要自定义文章的展示方式。
使用条件标签控制文章显示
在显示文章时,我们可以使用条件标签来控制文章是否在满足某些条件的情况下显示。这使我们可以更灵活地定制文章的呈现方式。
示例
下面让我们看一些 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
中。这个全局变量负责管理页面上的文章数据。我们可以直接在页面模板中循环 $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_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>';
}
wp_reset_postdata();
?>
如上例所示,首先我们展示主循环中的结果,然后使用 WP_Query 类查询指定分类中的文章。
请注意,上面示例中的第二个循环和主循环之间有一个区别:前者使用了 wp_reset_postdata()
函数来重置文章数据。
重置多个文章循环
在循环中,文章数据存储在全局变量 $post
中。在结束循环时,我们需要重置这个全局变量,否则可能会导致一些难以调试的问题。根据循环的方式,有三个函数可用于重置循环:
wp_reset_postdata()
wp_reset_query()
rewind_posts()
使用 wp_reset_postdata()
重置文章数据
当使用 WP_Query
创建自定义查询或使用多个循环时,应该使用 wp_reset_postdata()
来重置文章数据。这个函数将全局变量 $post
还原到主查询中的当前文章。如果按照 WordPress 开发的最佳实践来进行,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()
函数创建的循环是主循环,因此在使用了这个函数创建查询后,我们必须使用 wp_reset_query()
来重置查询和文章数据。如果使用 WP_Query
创建查询,我们可以使用 wp_reset_query()
来重置文章数据,因为该函数已经包含了 wp_reset_postdata()
。
但是,最佳做法是对使用 WP_Query
创建的文章循环使用 wp_reset_postdata()
来重置文章数据,而不是使用 query_posts()
。
需要注意的是,query_posts()
创建的主循环会替换当前页面的主循环,使用这个函数可能会引发一些副作用,因此最好避免使用它。
相关文章:
WordPress主题开发( 八)之—— 模板循环详细用法
WordPress 主题开发教程手册 — 模板循环 WordPress 主题开发中,模板循环是一个非常关键的概念,它负责默认机制来输出文章内容。模板循环会遍历当前页面获取的所有文章,然后使用主题中的模板标签将它们格式化并输出。 模板循环的应用 Word…...
QT : 完成绘制时钟
1.头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPainter> #include <QTimer> #include <QTime> #include <QPaintEvent> #include <QDebug> #include <QBrush>QT_BEGIN_NAMESPACE namespace Ui { class…...

香港云服务器和日本云服务器哪个好?(详细对比)
购置海外服务器时,您是在乎网络速度?价格?稳定性?当这几个因素同时存在,我们该如何选择?本篇针对海外热门的两个地区,中国香港和日本,这两种云服务器谁优谁劣?各有什么亮点?逐一进行对比分析。 一、速度上来看 中国香…...
Cross Attention和 Self- Attention 的区别?
Cross Attention和Self-Attention都是深度学习中常用的注意力机制,用于处理序列数据,其中Self-Attention用于计算输入序列中每个元素之间的关系,Cross Attention则是计算两个不同序列中的元素之间的关系。它们的主要区别在于计算注意力分数时…...

《从零开始的Java世界》02面向对象(基础)
《从零开始的Java世界》系列主要讲解Javase部分,从最简单的程序设计到面向对象编程,再到异常处理、常用API的使用,最后到注解、反射,涵盖Java基础所需的所有知识点。学习者应该从学会如何使用,到知道其实现原理全方位式…...
pve关闭windows虚拟机慢
背景: 在web界面关闭windows虚拟机一直转圈,使用命令行关闭报错 qm stop 155 trying to acquire lock... cant lock file /var/lock/qemu-server/lock-155.conf - got timeout解决 删除lock,然后用命令行重新关闭 rm /var/lock/qemu-serve…...
【Django】 rest_framework接口开发流程及接口功能组成
rest_framework接口开发流程及接口功能组成 使用restframework框架开发接口,方式应该有6、7种,每个人的习惯不同,用的方法也不一样,再次不再一一详述。 我比较常用:ModelSerializerGenericAPIView 原因是用视图函数装饰…...

Kafka Log存储解析以及索引机制
1.概述 在Kafka架构,不管是生产者Producer还是消费者Consumer面向的都是Topic。Topic是逻辑上的概念,而Partition是物理上的概念。每个Partition逻辑上对应一个log文件,该log文件存储是Producer生产的数据。Producer生产的数据被不断追加到该…...
广告电商模式:探索新商业模式,实现三方共赢
随着互联网技术的发展,电商行业正在不断探索新的商业模式。其中,广告电商模式是一种创新的方式,它成功地将广告和电商相结合,实现了三方共赢的局面。一、广告电商模式的定义广告电商模式,顾名思义,是一种将…...

动态线程池框架DynamicTp v1.1.4大版本发布,新增若干实用特性
DynamicTp 简介 DynamicTp 是一个基于配置中心实现的轻量级动态线程池监控管理工具,主要功能可以总结为动态调参、通知报警、运行监控、三方包线程池管理等几大类。 DynamicTp 特性 代码零侵入:我们改变了线程池以往的使用姿势,所有配置均放…...

无线通信——Mesh自组网的多跳性
Mesh的多跳性 Mesh网络具备多跳性。什么是多跳性呢?上面说过,每一个具备Mesh网络的设备都是独立的节点。因此,当我发出一条数据时,这些数据会通过跳跃到达不同的网络节点,数据从一个节点跳到另一个节点,直到…...
QA 云计算实验问题汇总
Q Win11中VMware虚拟网卡有感叹号 2023-9-27一位同学的win11的两个VMware17的虚拟网卡都有感叹号 A 清除注册表 步骤1 关闭VMWare虚拟化软件 步骤2 使用CCleaner pro 清理注册表 步骤3 重启系统 步骤4 VMware虚拟网卡上的感叹号消失。 Q Win11上的VisualBox的网卡消失了…...
VEX —— Functions|Groups
目录 expandpointgroup —— 返回点组内点号 expandprimgroup —— 返回面组内面号 expandvertexgroup —— 返回顶点组内顶点号 inpointgroup —— 判断指定点是否在点组内 inprimgroup —— 判断指定面是否在面组内 invertexgroup —— 判断指定顶点是否在顶点组内 np…...
JavaSE18——接口
接口(interface) 1 概述 在Java中,接口是一种抽象数据类型,它定义了一组方法(没有方法体),但没有实现这些方法的具体代码。接口可以看作是一种合约,它规定了类应该具有的行为。类可以实现一个或多个接口&…...

杭州亚运会开幕式惊现数字人火炬手,动捕设备迸发动画制作新动能
在第十九届亚运会开幕式上,首次出现了“数字人”点火形式,打造了亚运史上首个数字点火仪式,这种点火方式是一种颠覆性创作的同时,这也是裸眼3D技术、现实增强和AI人工智能技术的完美结合。 此次数字火炬手的背后是采用了动捕设备&…...

ptmalloc源码分析 - malloc/free函数的实战篇(12)
目录 一、chunk的大小实验 二、获取使用中的chunk信息的实验 三、小内存块尝试获取fd信息的实验 四、常用malloc/free函数使用注意事项 看了前面11章节的内容,我们也基本了解了ptmalloc的内存管理逻辑。此处也可以通过一些手段,获取到chunk的信息&am…...
博弈论(奇偶考虑法)+计数+DP(判定转dp):CF838C
首先题目有博弈,先分析一波最优策略(步骤:分析性质)。 两个人,所以显然考虑奇偶考虑法递归考虑。 首先删就是使子问题-1,重新排列是在当前子问题里的。 一个串的排列是有限的,所以这里就可以…...

郁金香2021年游戏辅助技术中级班(一)
郁金香2021年游戏辅助技术中级班(一) 用代码读取utf8名字字节数组搜索UTF-8字符串 用CE和xdbg分析对象名字从LUA函数的角度进行分析复习怪物名字偏移 用CE和xdbg分析对象数组认识虚函数表分析对象数组 分析对象数组链表部分链表的定义链表的数据在内存里…...

加密货币交易所偿付能力的零知识证明
如何检测下一个 FTX 和 Mt. Gox 加密货币交易所 FTX 的内爆导致数十亿客户资金流失,这是加密货币历史上交易所破产的最新例子。历史可以追溯到 2014 年,当时处理 70% 比特币交易的历史最悠久、规模最大的交易所 Mt. Gox 丢失了用户的 850,000 个比特币。…...
软考网络工程师防火墙配置考点总结
(考试重点) 一、访问控制列表 管理网络当中的数据流量,实现数据过滤的重要手段。可以在路由器、三层交换、二层交换和防火墙上实现。 隐藏规则:当前面的规则都匹配不上,华为默认允许,思科默认拒绝。 分…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...

接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...

Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...