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

【WP|6】WordPress 主题开发详解

WordPress主题开发是打造独特、功能强大的网站的重要途径。无论是创建全新的主题还是对现有主题进行自定义,掌握主题开发技能都是非常重要的。本文将详细讲解
WordPress 主题开发的基本步骤、文件结构、模板层次以及一些高级技巧,帮助你从零开始创建一个高质量的主题。

一、主题的基础

1. 主题文件结构

一个基本的 WordPress 主题需要以下文件:

my-theme/
|-- style.css
|-- index.php
|-- functions.php
|-- header.php
|-- footer.php
|-- sidebar.php
|-- single.php
|-- page.php

每个文件都有特定的作用,style.css 用于定义主题的样式,index.php 是主题的主模板文件,functions.php 用于定义主题的功能,其他文件如 header.phpfooter.phpsidebar.php 则是常见的模板文件。

2. 主题头部信息

style.css 文件中包含主题的头部信息,以便 WordPress 识别主题。

/*
Theme Name: My Theme
Theme URI: https://example.com/my-theme
Author: Your Name
Author URI: https://example.com
Description: A brief description of what the theme does.
Version: 1.0
License: GPL2
*/

3. 添加基本模板文件

创建基本的模板文件 index.phpheader.phpfooter.phpfunctions.php

index.php
<?php get_header(); ?>
<main><?phpif (have_posts()) {while (have_posts()) {the_post();get_template_part('template-parts/content', get_post_format());}} else {echo '<p>No posts found</p>';}?>
</main>
<?php get_footer(); ?>
header.php
<!DOCTYPE html>
<html <?php language_attributes(); ?>>
<head><meta charset="<?php bloginfo('charset'); ?>"><meta name="viewport" content="width=device-width, initial-scale=1"><title><?php wp_title('|', true, 'right'); ?></title><?php wp_head(); ?>
</head>
<body <?php body_class(); ?>><header><h1><a href="<?php echo esc_url(home_url('/')); ?>"><?php bloginfo('name'); ?></a></h1><p><?php bloginfo('description'); ?></p></header>
footer.php
    <footer><p>&copy; <?php echo date('Y'); ?> <?php bloginfo('name'); ?></p></footer><?php wp_footer(); ?>
</body>
</html>
functions.php
<?php
function my_theme_setup() {add_theme_support('title-tag');add_theme_support('post-thumbnails');register_nav_menus(array('primary' => 'Primary Menu',));
}
add_action('after_setup_theme', 'my_theme_setup');function my_theme_scripts() {wp_enqueue_style('my-theme-style', get_stylesheet_uri());
}
add_action('wp_enqueue_scripts', 'my_theme_scripts');

4. 创建模板部分

将内容组织成模板部分,方便重用和管理。例如,创建 template-parts/content.php 文件。

template-parts/content.php
<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>><h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2><div class="entry-content"><?php the_content(); ?></div>
</article>

二、主题模板层次

WordPress 使用模板层次来确定使用哪个模板文件来显示特定内容。以下是一些常见的模板文件及其用途:

  • index.php:默认模板文件,所有页面的后备文件。
  • single.php:用于显示单篇文章。
  • page.php:用于显示单个页面。
  • archive.php:用于显示归档页面(如分类、标签、日期归档)。
  • category.php:用于显示特定分类的文章。
  • tag.php:用于显示特定标签的文章。
  • search.php:用于显示搜索结果。
  • 404.php:用于显示404错误页面。

三、主题的高级功能

1. 自定义小工具

通过在 functions.php 文件中添加自定义小工具,可以增强主题的功能。

function my_theme_widgets_init() {register_sidebar(array('name' => 'Sidebar','id' => 'sidebar-1','description' => 'Main sidebar that appears on the right.','before_widget' => '<div id="%1$s" class="widget %2$s">','after_widget' => '</div>','before_title' => '<h2 class="widget-title">','after_title' => '</h2>',));
}
add_action('widgets_init', 'my_theme_widgets_init');

2. 自定义菜单

通过在 functions.php 文件中注册自定义菜单,允许用户在后台管理菜单。

function my_theme_menus() {register_nav_menus(array('primary' => __('Primary Menu', 'my-theme'),'footer' => __('Footer Menu', 'my-theme'),));
}
add_action('init', 'my_theme_menus');

在模板文件中显示菜单:

<nav><?php wp_nav_menu(array('theme_location' => 'primary')); ?>
</nav>

3. 自定义页面模板

创建自定义页面模板,让用户在创建页面时选择不同的布局。

创建自定义页面模板文件 page-custom.php
<?php
/*
Template Name: Custom Page
*/
get_header(); ?><main><h1><?php the_title(); ?></h1><div class="entry-content"><?phpwhile (have_posts()) {the_post();the_content();}?></div>
</main><?php get_footer(); ?>

4. 使用自定义字段

通过自定义字段,可以为文章和页面添加额外的数据。使用 Advanced Custom Fields 插件可以简化这一过程。

在模板文件中显示自定义字段
<?php
$custom_field = get_post_meta(get_the_ID(), 'custom_field_key', true);
if ($custom_field) {echo '<p>' . esc_html($custom_field) . '</p>';
}
?>

四、主题的最佳实践

1. 使用子主题

使用子主题可以在不修改父主题代码的情况下自定义主题。创建子主题文件夹,并添加 style.cssfunctions.php 文件。

子主题的 style.css
/*
Theme Name: My Child Theme
Template: my-theme
*/
子主题的 functions.php
<?php
function my_child_theme_enqueue_styles() {wp_enqueue_style('parent-style', get_template_directory_uri() . '/style.css');
}
add_action('wp_enqueue_scripts', 'my_child_theme_enqueue_styles');

2. 避免硬编码

尽量使用 WordPress 函数而不是硬编码,确保主题的灵活性和可维护性。

// 推荐
echo esc_url(home_url('/'));// 避免硬编码
// echo 'https://example.com/';

3. 安全性

确保使用 WordPress 提供的函数进行数据验证、清理和转义,防止安全漏洞。

// 清理和转义
$sanitized_data = sanitize_text_field($_POST['data']);
echo esc_html($sanitized_data);

结语

通过本文的详细讲解,你已经了解了从基础到高级的 WordPress 主题开发技巧。掌握这些技能,可以让你开发出功能强大、性能优越且安全性高的主题,为你的 WordPress 网站增色不少。希望这篇文章能为你的主题开发之路提供帮助和启发。

相关文章:

【WP|6】WordPress 主题开发详解

WordPress主题开发是打造独特、功能强大的网站的重要途径。无论是创建全新的主题还是对现有主题进行自定义&#xff0c;掌握主题开发技能都是非常重要的。本文将详细讲解 WordPress 主题开发的基本步骤、文件结构、模板层次以及一些高级技巧&#xff0c;帮助你从零开始创建一个…...

Kivy.garden.NavigationDrawer 后续学习

如百词斩部分代码 MRWord\pages\infopage\info.kv <InfoPage>:anim_type: slide_above_simpleid: main_winbox_button_anchor: box_button_anchor.__self__three_labels_box: three_labels_box.__self__box_phonetic: box_phonetic.__self__BoxLayout:BoxLayout:id: ma…...

【CVE-2021-3156】——漏洞复现、原理分析以及漏洞修复

文章目录 前言1、漏洞概述2、漏洞复现2.1、漏洞复现测试环境2.2、漏洞复现具体步骤 3、漏洞原理3.1、前置知识3.1.1、sudo3.1.2、sudoedit3.1.3、转义字符 3.2、漏洞分析 4、漏洞修复5、参考文献总结 前言 2021年01月27日&#xff0c;RedHat官方发布了Sudo缓冲区/栈溢出漏洞的风…...

Github 2024-05-31 Java开源项目日报 Top10

根据Github Trendings的统计,今日(2024-05-31统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目10TypeScript项目1JavaGuide - Java 程序员学习和面试指南 创建周期:2118 天开发语言:Java协议类型:Apache License 2.0Star数量:1…...

【上海大学计算机组成原理实验报告】六、内存系统实验

一、实验目的 学习内存访问机制。理解代码和数据的分区存放原理和技术。 二、实验原理 根据实验指导书的相关内容&#xff0c;地址寄存器MAR用来存放要进行读或写的存储器EM的地址。其内容经数据总线DBUS写入&#xff0c;因此必须在数据总线上具有数据后&#xff0c;配合MAR允…...

C++:细谈Sleep和_sleep

ZINCFFO的提醒 还记得上上上上上上上上上上上上上上上上上上&#xff08;上的个数是真实的&#xff09;篇文章吗&#xff1f; 随机应变——Sleep()和_sleep() 但在ZINCFFO的C怪谈-02中&#xff1a; 我不喜欢Sleep...... 奤&#xff1f;媜煞鷥&#xff01; 整活&#xff01;…...

CORS前端:深度解析跨域资源共享机制及其前端应用

CORS前端&#xff1a;深度解析跨域资源共享机制及其前端应用 在前端开发领域&#xff0c;CORS&#xff08;跨源资源共享&#xff09;是一个不可或缺的概念。它允许网页应用在不同的源&#xff08;域、协议或端口&#xff09;之间进行资源请求和共享&#xff0c;从而打破了同源…...

React@16.x(15)PureComponent 和 memo

目录 1&#xff0c;什么是 PureComponent2&#xff0c;什么是 memo3&#xff0c;举例3.2&#xff0c;优化13.1&#xff0c;优化2-函数位置 4&#xff0c;注意点4.1&#xff0c;为了提升效率&#xff0c;应该尽量使用 PureComponent4.2&#xff0c;不要直接改变之前的状态&#…...

[C++11/14新特性] tuple元组介绍

C11 标准新引入了一种类模板&#xff0c;命名为 tuple&#xff08;中文可直译为元组&#xff09;。tuple 最大的特点是&#xff1a;实例化的对象可以存储任意数量、任意类型的数据。tuple 的应用场景很广泛&#xff0c;例如当需要存储多个不同类型的元素时&#xff0c;可以使用…...

小熊家务帮day8-day9 客户管理模块2 (用户定位,地址簿,实名认证,银行卡信息上传等功能)

客户管理模块 0.用户定位功能0.1 需求0.2 接口分析0.3 接口开发Controller层开发Service层开发 1.我的地址簿功能1.1 需求1.2 数据库设计1.3 新增地址簿1.3.1 接口设计1.3.2 接口开发Controller层开发Service层开发测试功能 1.4 地址簿查询1.4.1 接口设计1.4.2 接口开发Control…...

amis 事件动作 和 行为按钮 常用用法

行为按钮 action &#xff08;仅是对click事件的处理&#xff09; actionType&#xff1a;这是 action 最核心的配置&#xff0c;来指定该 action 的作用类型&#xff0c;支持&#xff1a;ajax、link、url、drawer、dialog、confirm、cancel、prev、next、copy、close。 Butt…...

4K高刷显示器 - 蚂蚁电竞ANT27VU

可以毫不夸张地说&#xff0c;每一局游戏最终能够取得胜利&#xff0c;实际上都与一套极为优秀的电竞 PC 有着紧密的关联&#xff0c;因为其能够提供强大的性能支持与流畅的体验。同样的道理&#xff0c;一套优秀的电竞 PC 若想发挥出最佳的效果&#xff0c;那也都离不开一台能…...

图解支付系统的渠道路由设计

大家好&#xff0c;我是隐墨星辰&#xff0c;今天和大家聊聊渠道路由设计。 这篇文章主要讲清楚&#xff1a;渠道路由是什么&#xff0c;为什么需要渠道路由&#xff0c;渠道路由的几种形态&#xff0c;一个简洁而实用的基于规则的渠道路由设计。 注&#xff1a;有些公司称渠…...

Leecode---347:输出前k个高频元素(使用unordered_map)

题目&#xff1a; 给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 思路&#xff1a; 三步&#xff1a; 1、用map来记录每个元素出现的次数 2、按map中的值大小排序&#xff0c;先让其有序&#xff0c;再逆…...

k8s ceph(静态pvc)

1.在 Kubernetes 节点上安装ceph-common 包。这个包包含了连接到 Ceph 集群所需的工具和库。可以使用以下命令在每个节点上安装&#xff1a; sudo apt-get install ceph-common2.在 Kubernetes 中创建一个 Secret 对象&#xff0c;用于存储连接到 Ceph 集群所需的密钥和配置信息…...

Qt QScript 之 C++/JavaScript相互调用

文章目录 Qt Script什么是ECMAScriptQt 中JavaScriptclass 详解Basic UsageQObject对脚本引擎可用使用信号槽connect 三种模式访问属性, 子对象使c++对象可用于用Qt Script编写的脚本C++ 类成员函数可用于脚本C++ 类属性可用于脚本对脚本中的c++对象信号的反应函数对象和本机函…...

可能会引起空指针

PreparedStatement preparedStatement null; preparedStatement conn.prepareStatement(sql); 如果直接下面这个可能会赋值给空指针 因为要在try{}和catch{}里面都用,所以要定义在try外面为null //如果只是测试,可以PreparedStatement preparedStatement conn.prepareSta…...

Linux input输入子系统

Linux input 更多内容可以查看我的github Linux输入子系统框架 Linux输入子系统由驱动层、核心层、事件处理层三部分组成。 驱动层&#xff1a;输入设备的具体驱动程序&#xff0c;负责与具体的硬件设备进行交互&#xff0c;并将底层的硬件输入转化为统一的事件形式&#xff…...

dataworks调度参数

概述 调度参数是DataWorks任务调度时使用的参数&#xff0c;调度参数会根据任务调度的业务时间及调度参数的取值格式自动替换取值&#xff0c;实现在任务调度时间内参数的动态取值。 调度参数通过赋值方式分为自定义参数&#xff08;推荐&#xff09;和系统内置变量两大类。 …...

JavaScript第五讲:事件,条件循环语句,错误处理

前言 在编程的世界里&#xff0c;事件、条件和循环语句、以及错误处理是构建任何复杂程序或应用的基石。无论是开发一个简单的网页交互&#xff0c;还是构建一个庞大的企业级系统&#xff0c;这些基础概念都扮演着至关重要的角色。今天星途将通过这篇文章&#xff0c;分别深入…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...