当前位置: 首页 > news >正文

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

相关文章:

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

WordPress 主题开发教程手册 — 模板循环 WordPress 主题开发中&#xff0c;模板循环是一个非常关键的概念&#xff0c;它负责默认机制来输出文章内容。模板循环会遍历当前页面获取的所有文章&#xff0c;然后使用主题中的模板标签将它们格式化并输出。 模板循环的应用 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…...

香港云服务器和日本云服务器哪个好?(详细对比)

​  购置海外服务器时&#xff0c;您是在乎网络速度?价格?稳定性?当这几个因素同时存在&#xff0c;我们该如何选择?本篇针对海外热门的两个地区&#xff0c;中国香港和日本&#xff0c;这两种云服务器谁优谁劣?各有什么亮点?逐一进行对比分析。 一、速度上来看 中国香…...

Cross Attention和 Self- Attention 的区别?

Cross Attention和Self-Attention都是深度学习中常用的注意力机制&#xff0c;用于处理序列数据&#xff0c;其中Self-Attention用于计算输入序列中每个元素之间的关系&#xff0c;Cross Attention则是计算两个不同序列中的元素之间的关系。它们的主要区别在于计算注意力分数时…...

《从零开始的Java世界》02面向对象(基础)

《从零开始的Java世界》系列主要讲解Javase部分&#xff0c;从最简单的程序设计到面向对象编程&#xff0c;再到异常处理、常用API的使用&#xff0c;最后到注解、反射&#xff0c;涵盖Java基础所需的所有知识点。学习者应该从学会如何使用&#xff0c;到知道其实现原理全方位式…...

pve关闭windows虚拟机慢

背景&#xff1a; 在web界面关闭windows虚拟机一直转圈&#xff0c;使用命令行关闭报错 qm stop 155 trying to acquire lock... cant lock file /var/lock/qemu-server/lock-155.conf - got timeout解决 删除lock&#xff0c;然后用命令行重新关闭 rm /var/lock/qemu-serve…...

【Django】 rest_framework接口开发流程及接口功能组成

rest_framework接口开发流程及接口功能组成 使用restframework框架开发接口&#xff0c;方式应该有6、7种&#xff0c;每个人的习惯不同&#xff0c;用的方法也不一样&#xff0c;再次不再一一详述。 我比较常用&#xff1a;ModelSerializerGenericAPIView 原因是用视图函数装饰…...

Kafka Log存储解析以及索引机制

1.概述 在Kafka架构&#xff0c;不管是生产者Producer还是消费者Consumer面向的都是Topic。Topic是逻辑上的概念&#xff0c;而Partition是物理上的概念。每个Partition逻辑上对应一个log文件&#xff0c;该log文件存储是Producer生产的数据。Producer生产的数据被不断追加到该…...

广告电商模式:探索新商业模式,实现三方共赢

随着互联网技术的发展&#xff0c;电商行业正在不断探索新的商业模式。其中&#xff0c;广告电商模式是一种创新的方式&#xff0c;它成功地将广告和电商相结合&#xff0c;实现了三方共赢的局面。一、广告电商模式的定义广告电商模式&#xff0c;顾名思义&#xff0c;是一种将…...

动态线程池框架DynamicTp v1.1.4大版本发布,新增若干实用特性

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

无线通信——Mesh自组网的多跳性

Mesh的多跳性 Mesh网络具备多跳性。什么是多跳性呢&#xff1f;上面说过&#xff0c;每一个具备Mesh网络的设备都是独立的节点。因此&#xff0c;当我发出一条数据时&#xff0c;这些数据会通过跳跃到达不同的网络节点&#xff0c;数据从一个节点跳到另一个节点&#xff0c;直到…...

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中&#xff0c;接口是一种抽象数据类型&#xff0c;它定义了一组方法&#xff08;没有方法体&#xff09;&#xff0c;但没有实现这些方法的具体代码。接口可以看作是一种合约&#xff0c;它规定了类应该具有的行为。类可以实现一个或多个接口&…...

杭州亚运会开幕式惊现数字人火炬手,动捕设备迸发动画制作新动能

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

ptmalloc源码分析 - malloc/free函数的实战篇(12)

目录 一、chunk的大小实验 二、获取使用中的chunk信息的实验 三、小内存块尝试获取fd信息的实验 四、常用malloc/free函数使用注意事项 看了前面11章节的内容&#xff0c;我们也基本了解了ptmalloc的内存管理逻辑。此处也可以通过一些手段&#xff0c;获取到chunk的信息&am…...

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

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

郁金香2021年游戏辅助技术中级班(一)

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

加密货币交易所偿付能力的零知识证明

如何检测下一个 FTX 和 Mt. Gox 加密货币交易所 FTX 的内爆导致数十亿客户资金流失&#xff0c;这是加密货币历史上交易所破产的最新例子。历史可以追溯到 2014 年&#xff0c;当时处理 70% 比特币交易的历史最悠久、规模最大的交易所 Mt. Gox 丢失了用户的 850,000 个比特币。…...

软考网络工程师防火墙配置考点总结

&#xff08;考试重点&#xff09; 一、访问控制列表 管理网络当中的数据流量&#xff0c;实现数据过滤的重要手段。可以在路由器、三层交换、二层交换和防火墙上实现。 隐藏规则&#xff1a;当前面的规则都匹配不上&#xff0c;华为默认允许&#xff0c;思科默认拒绝。 分…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...

基于鸿蒙(HarmonyOS5)的打车小程序

1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...

es6+和css3新增的特性有哪些

一&#xff1a;ECMAScript 新特性&#xff08;ES6&#xff09; ES6 (2015) - 革命性更新 1&#xff0c;记住的方法&#xff0c;从一个方法里面用到了哪些技术 1&#xff0c;let /const块级作用域声明2&#xff0c;**默认参数**&#xff1a;函数参数可以设置默认值。3&#x…...