WordPress主题开发( 八)之—— 模板循环详细用法

WordPress 主题开发教程手册 — 模板循环

WordPress 主题开发中,模板循环是一个非常关键的概念,它负责默认机制来输出文章内容。模板循环会遍历当前页面获取的所有文章,然后使用主题中的模板标签将它们格式化并输出。

模板循环的应用

WordPress 的模板循环功能非常灵活,可以应用于多种情况,包括但不限于:

  1. 在网站首页展示多个文章模块。
  2. 在文章详情页面显示内容和评论。
  3. 在侧边栏中展示最新文章或热门文章。在这里插入代码片
  4. 显示特定文章类型或分类的数据。
  5. 根据特定条件获取数据并在文章模块中显示。

深入了解模板循环

让我们更深入地了解模板循环的基本用法:

<?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();
?>

如上所示,模板循环必须以 ifwhile 语句开头,并以 endwhileendif 语句结束。文章内容的模板标签应该位于循环开始语句和结束语句之间。

如果当前页面没有文章,我们可以显示一个 404 错误信息,这个信息应该位于 endwhileendif 语句之间,如下所示。

<?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() 创建的主循环会替换当前页面的主循环,使用这个函数可能会引发一些副作用,因此最好避免使用它。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/89382.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Intel 700 800系网卡升级支持WOL UEFI PXE方法

Intel 700 800系网卡默认的NVM版本是不支持UEFI的&#xff0c;升级NVM也不能解决&#xff0c;需要将UEFI driver 包到NVM里。操作步骤如下&#xff1a; 1. 下载Preboot软件包&#xff0c;有Windows和Linux版本&#xff0c;本次使用Linux版本做示例。 Intel Ethernet Connecti…

基础练习-6

基础练习-6 1. 809*??800*??9*?? 其中??代表的两位数, 809*??为四位数&#xff0c;8*??的结果为两位数&#xff0c;9*??的结果为3位数。求??代表的两位数&#xff0c;及809*??后的结果。 程序分析&#xff1a;无。 a 809 for i in range(10,100):b i * a…

【TCP】三次握手 与 四次挥手 详解

三次握手 与 四次挥手 1. 三次握手2. 四次挥手三次握手和四次挥手的区别 在正常情况下&#xff0c;TCP 要经过三次握手建立连接&#xff0c;四次挥手断开连接 1. 三次握手 服务端状态转化&#xff1a; [CLOSED -> LISTEN] 服务器端调用 listen 后进入 LISTEN 状态&#xff…

基于Xilinx UltraScale+ MPSOC(ZU9EG/ZU15EG)的高性能PCIe数据预处理平台

PCIE707是一款基于PCIE总线架构的高性能数据预处理FMC载板&#xff0c;板卡具有1个FMC&#xff08;HPC&#xff09;接口&#xff0c;1路PCIe x4主机接口、1个RJ45千兆以太网口、2个QSFP 40G光纤接口。板卡采用Xilinx的高性能UltraScale MPSOC系列FPGA作为实时处理器&#xff0c…

工具篇 | WSL使用入门教程以及基于WSL和natApp内网穿透实践 - 对比VMWare

介绍 在开发工具中&#xff0c;Windows Subsystem for Linux (WSL) 和 VMWare 它们都可以实现了在 Windows 上运行 Linux系统。 文章概览 WSL Vs VMWare 我们将简单比对 WSL 和 VMWare&#xff0c;在性能、资源消耗等方面的差异&#xff0c;以协助您做出更加明确的选择。 …

ATA-8000系列射频功率放大器——应用场景介绍

ATA-8000系列是一款射频功率放大器。其P1dB输出功率500W&#xff0c;饱和输出功率最大1000W。增益数控可调&#xff0c;一键保存设置&#xff0c;提供了方便简洁的操作选择&#xff0c;可与主流的信号发生器配套使用&#xff0c;实现射频信号的放大。 图&#xff1a;ATA-8000系…

Android 编译插桩操纵字节码

本文讲解如何编译插桩操纵字节码。 就使用 ASM 来实现简单的编译插桩效果&#xff0c;通过插桩实现在每一个 Activity 打开时输出相应的 log 日志。实现思路 过程主要包含两步&#xff1a; 1、遍历项目中所有的 .class 文件​ 如何找到项目中编译生成的所有 .class 文件&#…

基于C#的AE二次开发之IQueryFilter接口、ISpatialFilter接口、IQueryDef 接口的查询接口的介绍

一、开发环境 开发环境为ArcGIS Engine 10.2与Visual studio2010。在使用ArcEngine查询进行查询的时候主要使用三种查询接口IQueryFilter&#xff08;属性查询&#xff09; 、ISpatialFilter&#xff08;空间查询&#xff09; 、IQueryDef &#xff08;多表查询&#xff09; 那…

leetcode 133. 克隆图

leetcode 133. 克隆图 给你无向 连通 图中一个节点的引用&#xff0c;请你返回该图的 深拷贝&#xff08;克隆&#xff09;。 图中的每个节点都包含它的值 val&#xff08;int&#xff09; 和其邻居的列表&#xff08;list[Node]&#xff09;。 class Node { public int val;…

PHP自动识别采集何意网址文章正文内容

在做PHP采集内容时&#xff0c;用过querylist采集组件&#xff0c;但是这个插件采集页面内容时&#xff0c;都必须要写个采集选择器。这样比较麻烦&#xff0c;每个文章页面都必须指定一条采集规则 。就开始着手找一个插件可以能自动识别任意文章url正文内容并采集的&#xff0…

浅谈基于物联网的医院消防安全管理

安科瑞 华楠 摘 要&#xff1a;医院消防物联网将原本与网络无关的消防设施和网络结合起来&#xff0c;将消防监督管理、防火灭火所需的相关信息进行汇总&#xff0c;可以让医院更加轻松地发现和处理医院的警情信息&#xff0c;降低火灾发生频率。 关键词&#xff1a;物联网技…

小黑下班品尝网红团结湖四川麻辣烫,吃的特别撑,支付宝抽到3元红包,耳机找到,开始接触强化学习的leetcode之旅:LCR 188. 买卖芯片的最佳时机

小黑代码 class Solution:def bestTiming(self, prices: List[int]) -> int:# 数组长度n len(prices)if n < 2:return 0# 结果变量profit 0# 记录第i天之前的股票价格最小值min_ prices[0]for i in range(1, n):if prices[i]-min_ > profit:profit prices[i]-min…

博弈论(奇偶考虑法)+计数+DP(判定转dp):CF838C

首先题目有博弈&#xff0c;先分析一波最优策略&#xff08;步骤&#xff1a;分析性质&#xff09;。 两个人&#xff0c;所以显然考虑奇偶考虑法递归考虑。 首先删就是使子问题-1&#xff0c;重新排列是在当前子问题里的。 一个串的排列是有限的&#xff0c;所以这里就可以…

简易磁盘自动监控服务

本文旨在利用crontab定时任务(脚本请参考附件)来监控单个服务节点上所有磁盘使用情况&#xff0c;一旦超过既定阈值则会通过邮件形式告警相关利益人及时介入处理。 1. 开启SMTP服务 为了能够成功接收告警信息&#xff0c;需要邮件接收客户都安开启SMTP服务。简要流程请参考下…

datart导入hive连接包

datart读取hive数据时&#xff0c;需要先在datart的lib目录下导入hive jdbc相关的包&#xff0c;这里面有几个坑记录下&#xff1a; 1.和springboot中commons-lang3冲突 2.hive中带的jetty和springboot冲突 3.hive jdbc的包的版本号一定要小于登录hive服务端的版本&#xff…

Fortinet 2023上半年全球威胁态势研究报告:勒索软件检测成下降趋势,针对性攻击持续升温

近日&#xff0c;专注于推动网络与安全融合的全球网络安全领导者Fortinet&#xff08;NASDAQ&#xff1a;FTNT&#xff09;&#xff0c;发布《2023上半年全球威胁态势研究报告》。报告显示&#xff0c;2023 年上半年勒索软件检出数量继续下降、高级持续性威胁&#xff08;APT&a…

算法 缺失的第一个正整数-(哈希)

牛客网: BM53 题目: 无重复元素数组中未出现的最小的正整数 思路: (1) 使用单独hash表记录每个元素出现的次数&#xff0c;从1开始递增查询出现次数直到次数为0停止返回 (2) 将原数组作为hash表使用&#xff0c;处理好负数与0&#xff0c;将绝对值在N范围内的每个元素的绝对…

深度学习|如何确定 CUDA+PyTorch 版本

对于深度学习初学者来说&#xff0c;配置深度学习的环境可能是一大难题&#xff0c;因此本文主要讲解CUDA; cuDNN; Pytorch 三者是什么&#xff0c;以及他们之间的依赖关系。 CUDA CUDA&#xff08;Compute Unified Device Architecture&#xff09;是由NVIDIA开发的用于并行计…

秋招在线人才测评考什么内容?

又是一年招聘季&#xff0c;各大高校都会组织校园招聘&#xff0c;这次我们就来了解一下秋季校园招聘究竟考什么。近些年来校园秋招已经广泛采用在线测评&#xff0c;尤其各行业龙头大厂们&#xff0c;网申、在线测评、小组无领导讨论&#xff0c;一面二面......各类纷杂的面试…

某瑞集团安全技术研发岗位面试

本文由掌控安全学院 - sbhglqy 投稿 一、自我介绍 阿吧阿吧&#xff0c;不多说 二、就ctf比赛经历方面提些问题 面试官&#xff1a;ctf打了多久了 我&#xff1a;两三年了。 面试官&#xff1a;得过什么奖项没有 我&#xff1a;本科的时候得过一个校一等奖。 面试官&#x…