📋 第一部分:WordPress 总体概述
43%+
全球网站市占率
20+
年发展历史
60,000+
官方插件
10,000+
官方主题
📖
什么是 WordPress?
WordPress 是全球最流行的开源内容管理系统(CMS),基于 PHP 编程语言和 MySQL/MariaDB 数据库构建。它最初由 Matt Mullenweg 和 Mike Little 于 2003 年创建,最初是一个简单的博客平台,现已发展成为功能强大、生态完善的通用 CMS 系统。
核心特点
- 开源免费: 遵循 GPLv2 许可证,任何人都可以自由使用、修改和分发
- 插件架构: 拥有超过 60,000 个官方插件,几乎可以实现任何功能
- 主题系统: 支持高度自定义的前端展示,拥有庞大的主题生态
- REST API: 提供完整的 RESTful API,支持 Headless CMS 模式
- Gutenberg 编辑器: 基于块的现代化内容编辑器
- 多站点网络: 支持在单一安装中管理多个网站
- 国际化: 支持超过 200 种语言
- 社区庞大: 拥有全球最活跃的开源社区之一
WordPress 的两个版本
- WordPress.org(自托管): 免费下载的开源软件,需自行部署在服务器上,拥有完全控制权
- WordPress.com(托管服务): 由 Automattic 公司提供的托管平台,免费版有功能限制
💡 提示:
本教程主要围绕 WordPress.org 自托管版本展开,涵盖从安装部署到高级开发的完整技术栈。
🏛️
WordPress 版本发展历程
了解 WordPress 的发展历史有助于理解其设计理念和技术演进方向。
| 版本 | 发布年份 | 重要特性 | 代号 |
|---|---|---|---|
| 1.0 | 2004 | 永久链接、多分类、评论审核 | Davis |
| 1.5 | 2005 | 静态页面支持、主题系统(Kubrick) | Strayhorn |
| 2.0 | 2005 | 富文本编辑器、后台 UI 革新 | Duke |
| 3.0 | 2010 | 多站点合并、自定义菜单、Twenty Ten | Thelonious |
| 4.0 | 2014 | 媒体库网格视图、嵌入式编辑器 | Benny |
| 5.0 | 2018 | Gutenberg 块编辑器上线 | Bebo |
| 5.8 | 2021 | 全站编辑(FSE)、区块小组件 | Art Tatum |
| 6.0 | 2022 | 改进的写作体验、多模板切换 | Arturo |
| 6.3-6.5 | 2023-2024 | 站点编辑器优化、字体管理、脚本策略 | Lionel / Adderley |
🔧
技术栈概览
WordPress 的核心技术栈由以下组件构成:
🐘
PHP 7.4+
服务端编程语言,WordPress 核心代码全部基于 PHP 编写,建议使用 PHP 8.0+ 以获得更好的性能
🗃️
MySQL 5.7+ / MariaDB
关系型数据库,存储网站所有内容、配置和用户数据
🌐
Apache / Nginx
Web 服务器软件,处理 HTTP 请求和静态资源分发
📦
JavaScript
前端交互与 Gutenberg 编辑器基于 React 构建
📐
HTML5 + CSS3
前端页面结构和样式
🔧
Composer
PHP 依赖管理工具(高级开发使用)
✅ 推荐环境配置:
PHP 8.2+ / MySQL 8.0+ 或 MariaDB 10.5+ / Nginx 1.24+ / Redis 缓存
🏗️ 第二部分:WordPress 软件架构设计
📐
整体架构分层图
WordPress 采用经典的分层架构设计模式,从上到下依次为:
┌─────────────────────────────────────────────────────────────┐ │ 用户层 (User Layer) │ │ 浏览器请求 / API 调用 / CLI 命令 │ ├─────────────────────────────────────────────────────────────┤ │ Web 服务器层 (Web Server) │ │ Apache (.htaccess) / Nginx │ ├─────────────────────────────────────────────────────────────┤ │ WordPress 核心加载 (wp-load.php) │ │ wp-config.php → wp-settings.php → 核心初始化 │ ├─────────────────────────────────────────────────────────────┤ │ 应用层 (Application Layer) │ │ ┌──────────┬──────────┬──────────┬─────────────────────┐ │ │ │ 主题层 │ 插件层 │ 核心功能 │ REST API Controller │ │ │ │ Theme │ Plugins │ Core │ RESTful Endpoints │ │ │ └──────────┴──────────┴──────────┴─────────────────────┘ │ ├─────────────────────────────────────────────────────────────┤ │ 数据访问层 (Data Access Layer) │ │ ┌──────────────┬──────────────┬──────────────────────┐ │ │ │ WP_Query │ wpdb Class │ Options/Transients │ │ │ │ WP_User_Query│ CRUD 操作 │ 缓存层 (Object Cache) │ │ │ └──────────────┴──────────────┴──────────────────────┘ │ ├─────────────────────────────────────────────────────────────┤ │ 数据库层 (Database Layer) │ │ MySQL / MariaDB / SQLite (实验) │ └─────────────────────────────────────────────────────────────┘
核心加载流程
- index.php:入口文件,定义常量并加载 wp-blog-header.php
- wp-blog-header.php:加载 WordPress 环境并执行主查询
- wp-load.php:定位并加载 wp-config.php
- wp-config.php:数据库连接配置、安全密钥、调试设置
- wp-settings.php:核心初始化,加载所有必须文件、激活插件、初始化主题
muplugins_loaded- Must-Use 插件加载完成plugins_loaded- 所有插件加载完成setup_theme- 主题即将加载after_setup_theme- 主题加载完成(主题初始化最佳位置)init- WordPress 初始化完成(注册文章类型/分类法)wp_loaded- WordPress 完全加载(最早可以安全使用所有核心功能)parse_request- 开始解析请求parse_query- 查询变量已解析pre_get_posts- 主查询即将执行(修改查询参数的最后机会)the_post- 循环中每篇文章处理时wp_head- <head> 标签结束前wp_footer- </body> 标签结束前shutdown- PHP 即将关闭(缓冲区刷新前)- 生产环境必须使用 HTTPS
- 始终在 permission_callback 中验证用户权限
- 对所有输入数据进行清理和验证
- 实施速率限制防止滥用
- 不要在前端代码中暴露敏感密钥
- 使用标签化的 PHP,避免
<?php的短标签<? - 不要在关闭标签
?>(纯 PHP 文件不需要) - 使用单引号定义字符串,除非需要变量解析
- 花括号必须在新行开始(Allman 风格)
- Yoda 条件:将常量放在比较的左侧
if ( 'publish' === $status ) - 函数:小写加下划线
my_plugin_function_name() - 类:首字母大写
My_Plugin_Class - 变量:小写加下划线
$my_variable - 常量:全大写加下划线
MY_PLUGIN_CONSTANT - Hook 名称:使用插件/主题前缀
my_plugin_custom_hook - PHP CodeSniffer: 代码规范检查(WordPress Coding Standards)
- Query Monitor: 性能分析插件,查看 SQL 查询、钩子、HTTP 请求等
- Debug Bar: 调试信息展示面板
- WP Debug Log: 错误日志记录
- 在代码中使用
__()等函数包裹所有用户可见的字符串 - 使用 WP-CLI 或 Poedit 生成
.pot模板文件 - 翻译者使用 Poedit 创建对应语言的
.po文件 - 编译
.po文件生成机器可读的.mo文件 - WordPress 自动根据用户语言设置加载对应翻译
// WordPress 入口文件 index.php 核心代码
define
(
'WP_USE_THEMES'
,
true
);
/** 加载 WordPress 环境 */
require
(
DIR
.
'/wp-blog-header.php'
);
// wp-blog-header.php 内部流程:
// 1. 加载 wp-load.php(引导文件)
// 2. 设置 WP 全局变量
// 3. 执行 WP_Query 主查询
// 4. 加载主题模板
📁
WordPress 目录结构详解
标准 WordPress 安装的目录结构如下:
wordpress/
├──
index.php
主入口文件
├──
wp-config.php
配置文件(自动生成或手动创建)
├──
wp-config-sample.php
配置模板文件
├──
wp-blog-header.php
博客头文件,加载 WP 环境
├──
wp-load.php
引导加载器
├──
wp-settings.php
核心设置和初始化
├──
wp-cron.php
定时任务执行器
├──
wp-signup.php
多站点注册页面
├──
wp-activate.php
用户激活处理
├──
wp-links-opml.php
链接 OPML 导出
├──
wp-login.php
登录页面处理器
├──
wp-mail.php
邮件发布处理器
├──
wp-trackback.php
Trackback 处理器
├──
wp-comments-post.php
评论提交处理
├──
xmlrpc.php
XML-RPC 接口
├──
license.txt
GPL 许可证
├──
readme.html
安装说明
│ ├──
wp-admin/
后台管理面板
│ ├──
index.php
后台入口
│ ├──
admin-ajax.php
AJAX 请求处理器
│ ├──
admin-post.php
表单提交处理
│ ├──
includes/
后台核心函数库
│ ├──
css/
后台样式
│ ├──
js/
后台脚本
│ └──
network/
多站点管理
│ ├──
wp-includes/
核心函数和类库
│ ├──
functions.php
核心函数集
│ ├──
class-wp-query.php
查询类
│ ├──
class-wp-rest-server.php
REST API 服务器
│ ├──
class-wp-hook.php
钩子系统
│ ├──
class-wpdb.php
数据库抽象类
│ ├──
pluggable.php
可被插件覆盖的函数
│ ├──
blocks/
核心 Gutenberg 区块
│ ├──
widgets/
核心小组件
│ ├──
rest-api/
REST API 端点
│ ├──
theme-compat/
主题兼容模板
│ ├──
js/
核心脚本库
│ ├──
css/
核心样式
│ └──
images/
核心图片资源
│ ├──
wp-content/
用户自定义内容(最重要!)
│ ├──
themes/
主题目录
│ │ ├──
twentytwentyfour/
默认主题
│ │ ├──
my-custom-theme/
自定义主题
│ │ └── ... │ ├──
plugins/
插件目录
│ │ ├──
akismet/
反垃圾评论插件
│ │ ├──
my-plugin/
自定义插件
│ │ └── ... │ ├──
uploads/
媒体文件上传目录
│ │ └──
2024/
按年月组织
│ │ └──
01/
│ ├──
languages/
语言文件
│ ├──
cache/
缓存目录
│ └──
upgrade/
升级临时目录
│ └──
.htaccess
Apache 重写规则
⚠️ 重要安全原则:
wp-content
目录是用户唯一需要直接修改的目录。永远不要直接修改
wp-includes
和
wp-admin
中的核心文件,应通过钩子(hooks)机制扩展功能。
🔄
WordPress 请求处理生命周期
每个 HTTP 请求到达 WordPress 后,会经历以下完整的处理生命周期:
用户浏览器请求 │ ▼ ┌───────────────┐ │ Web 服务器 │ ── .htaccess / nginx.conf 重写规则 │ (Apache/Nginx)│ 将请求路由到 index.php └───────┬───────┘ │ ▼ ┌───────────────┐ │ index.php │ ── 定义 WP_USE_THEMES │ 入口文件 │ require wp-blog-header.php └───────┬───────┘ │ ▼ ┌───────────────┐ │ wp-load.php │ ── 定位 wp-config.php │ │ 设置 ABSPATH 等常量 └───────┬───────┘ │ ▼ ┌───────────────┐ │ wp-config.php │ ── DB_NAME, DB_USER, DB_PASSWORD │ 配置文件 │ AUTH_KEY, SALT, TABLE_PREFIX └───────┬───────┘ WP_DEBUG, WP_CACHE │ ▼ ┌───────────────┐ │wp-settings.php│ ── 加载核心文件 │ 核心初始化 │ 注册默认常量 └───────┬───────┘ 设置默认时区 │ 连接数据库 (wpdb) ▼ ┌───────────────────────────────────────┐ │ 加载 Must-Use 插件 (mu-plugins/) │ │ 加载已激活的插件 │ │ 加载主题 functions.php │ │ 触发 init / wp_loaded 等钩子 │ └───────────────┬───────────────────────┘ │ ▼ ┌───────────────────────────────┐ │ WP::main() - 解析请求 │ │ 设置全局 $wp_query │ │ 解析 URL → 查询变量 │ │ 执行主查询 (WP_Query) │ └───────────────┬───────────────┘ │ ▼ ┌───────────────────────────────┐ │ 模板加载器 (template-loader) │ │ 根据条件选择模板文件 │ │ 单页? 文章? 归档? 404? │ └───────────────┬───────────────┘ │ ▼ ┌───────────────────────────────┐ │ 主题模板渲染 │ │ header.php → 内容 → footer │ │ 输出 HTML 响应 │ └───────────────┬───────────────┘ │ ▼ 返回 HTTP 响应给浏览器
核心钩子触发顺序
🪝
钩子系统(Hooks)- WordPress 的核心扩展机制
钩子(Hooks)是 WordPress 架构中最核心的设计模式,它允许开发者在不修改核心代码的前提下,向系统注入自定义逻辑。WordPress 中有两种类型的钩子:
| 类型 | 用途 | 核心函数 | 返回值 |
|---|---|---|---|
| Action(动作钩子) | 在特定时间点执行代码 | add_action() | 无返回值 |
| Filter(过滤器钩子) | 修改数据并返回 | add_filter() | 必须返回修改后的值 |
Action 钩子使用示例
// 在 WordPress 初始化时注册自定义文章类型
add_action
(
'init'
,
'my_register_post_types'
);
function
my_register_post_types
() {
register_post_type
(
'portfolio'
,
array
(
'labels'
=>
array
(
'name'
=>
'作品集'
,
'singular_name'
=>
'作品'
),
'public'
=>
true
,
'has_archive'
=>
true
,
'supports'
=>
array
(
'title'
,
'editor'
,
'thumbnail'
),
'rewrite'
=>
array
(
'slug'
=>
'portfolio'
), )); }
// 带优先级和参数数量的 Action
add_action
(
'save_post'
,
'my_save_post_handler'
,
10
,
3
);
function
my_save_post_handler
(
$post_id
,
$post
,
$update
) {
// 保存文章时执行自定义逻辑
if
(
$post
->post_type ===
'portfolio'
) {
// 处理作品集特有的保存逻辑
update_post_meta
(
$post_id
,
'_custom_field'
,
$_POST
[
'custom_field'
]); } }
Filter 钩子使用示例
// 修改文章标题
add_filter
(
'the_title'
,
'my_modify_title'
,
10
,
2
);
function
my_modify_title
(
$title
,
$post_id
) {
if
(
is_admin
()) {
return
$title
; }
return
'【原创】'
.
$title
; }
// 修改主查询参数
add_action
(
'pre_get_posts'
,
'my_modify_main_query'
);
function
my_modify_main_query
(
$query
) {
if
(!
is_admin
() &&
$query
->
is_main_query
()) {
if
(
$query
->
is_home
()) {
$query
->
set
(
'posts_per_page'
,
12
);
$query
->
set
(
'orderby'
,
'date'
); } } }
✅ 优先级说明:
钩子的第三个参数是优先级(默认值为 10)。数字越小,执行越早。相同优先级的钩子按注册顺序执行。
🎯
设计模式在 WordPress 中的应用
WordPress 在其架构中广泛运用了多种经典设计模式:
1. 观察者模式(Observer Pattern)
WordPress 的钩子系统本质上就是观察者模式的实现。WP_Hook 类维护一个监听器列表,当事件发生时通知所有注册的回调函数。
// WP_Hook 类内部实现简化版
class
WP_Hook
{
public
$callbacks
=
array
();
public function
add_filter
(
$tag
,
$function
,
$priority
,
$accepted_args
) {
$this
->callbacks[
$priority
][
$function
] =
array
(
'function'
=>
$function
,
'accepted_args'
=>
$accepted_args
); }
public function
apply_filters
(
$value
,
$args
) {
foreach
(
$this
->callbacks
as
$priority
=>
$callbacks
) {
foreach
(
$callbacks
as
$cb
) {
$value
=
call_user_func_array
(
$cb
[
'function'
],
$args
); } }
return
$value
; } }
2. 单例模式(Singleton Pattern)
全局 $wpdb 数据库对象是典型的单例模式——整个应用共享同一个数据库连接实例。
3. 工厂模式(Factory Pattern)
WP_Query 和 WP_Post 对象在需要时被工厂方法创建。
4. 门面模式(Facade Pattern)
WordPress 的全局函数如 get_posts()、wp_insert_post() 等作为底层复杂类的简化门面接口。
5. 模板方法模式(Template Method Pattern)
WordPress 的模板层次系统定义了页面渲染的骨架,各主题通过覆盖不同模板文件来实现具体展示。
6. 策略模式(Strategy Pattern)
WordPress 的缓存机制支持多种缓存策略(Memcached、Redis、文件缓存),通过配置切换。
⚙️
wp-config.php 配置文件详解
wp-config.php 是 WordPress 最重要的配置文件,定义了数据库连接、安全密钥和核心行为。
<?php
// ===== 数据库配置 =====
define
(
'DB_NAME'
,
'wordpress_db'
);
// 数据库名
define
(
'DB_USER'
,
'wp_user'
);
// 数据库用户名
define
(
'DB_PASSWORD'
,
'secure_password'
);
// 数据库密码
define
(
'DB_HOST'
,
'localhost'
);
// 数据库主机
define
(
'DB_CHARSET'
,
'utf8mb4'
);
// 字符集(支持Emoji)
define
(
'DB_COLLATE'
,
''
);
// 排序规则
// ===== 安全密钥(从 https://api.wordpress.org/secret-key/1.1/salt/ 获取)=====
define
(
'AUTH_KEY'
,
'随机字符串1'
);
define
(
'SECURE_AUTH_KEY'
,
'随机字符串2'
);
define
(
'LOGGED_IN_KEY'
,
'随机字符串3'
);
define
(
'NONCE_KEY'
,
'随机字符串4'
);
define
(
'AUTH_SALT'
,
'随机字符串5'
);
define
(
'SECURE_AUTH_SALT'
,
'随机字符串6'
);
define
(
'LOGGED_IN_SALT'
,
'随机字符串7'
);
define
(
'NONCE_SALT'
,
'随机字符串8'
);
// ===== 数据库表前缀 =====
$table_prefix
=
'wp_'
;
// 建议使用非默认前缀增强安全
// ===== 调试配置 =====
define
(
'WP_DEBUG'
,
false
);
// 生产环境设为 false
define
(
'WP_DEBUG_LOG'
,
true
);
// 错误日志写入 wp-content/debug.log
define
(
'WP_DEBUG_DISPLAY'
,
false
);
// 生产环境不在前端显示错误
define
(
'SCRIPT_DEBUG'
,
false
);
// 使用压缩版本的 JS/CSS
// ===== 性能配置 =====
define
(
'WP_CACHE'
,
true
);
// 启用对象缓存(需 drop-in 插件)
define
(
'WP_MEMORY_LIMIT'
,
'256M'
);
// PHP 内存限制
define
(
'WP_MAX_MEMORY_LIMIT'
,
'512M'
);
// 后台内存限制
// ===== 自动更新配置 =====
define
(
'WP_AUTO_UPDATE_CORE'
,
true
);
// 自动更新核心
define
(
'AUTOMATIC_UPDATER_DISABLED'
,
false
);
// ===== 安全增强 =====
define
(
'DISALLOW_FILE_EDIT'
,
true
);
// 禁止后台编辑主题/插件文件
define
(
'DISALLOW_FILE_MODS'
,
false
);
// 禁止安装/更新插件主题
define
(
'FORCE_SSL_ADMIN'
,
true
);
// 强制后台使用 HTTPS
// ===== URL 配置(硬编码,提升性能)=====
define
(
'WP_SITEURL'
,
);
define
(
'WP_HOME'
,
);
// ===== 多站点配置 =====
// define('WP_ALLOW_MULTISITE', true);
// define('MULTISITE', true);
// define('SUBDOMAIN_INSTALL', false);
// ===== 文件权限 =====
define
(
'FS_METHOD'
,
'direct'
);
// 文件更新方式
// define('FTP_HOST', 'ftp.example.com');
// define('FTP_USER', 'ftpuser');
// define('FTP_PASS', 'ftppass');
/* 好了!请不要再编辑此行之后的内容。 */
if
(!
defined
(
'ABSPATH'
)) {
define
(
'ABSPATH'
,
DIR
.
'/'
); }
require_once
ABSPATH
.
'wp-settings.php'
;
🗄️ 第三部分:数据库设计与操作
📊
WordPress 数据库表结构详解
WordPress 默认安装包含 12 张核心数据表(使用 wp_ 前缀,可在配置中自定义):
| 表名 | 用途 | 关键字段 |
|---|---|---|
wp_posts | 存储所有内容(文章、页面、附件、菜单项、修订版本) | ID, post_title, post_content, post_status, post_type |
wp_postmeta | 文章的自定义字段(元数据) | meta_id, post_id, meta_key, meta_value |
wp_users | 用户基本信息 | ID, user_login, user_email, user_pass |
wp_usermeta | 用户元数据(角色、偏好等) | umeta_id, user_id, meta_key, meta_value |
wp_terms | 分类术语(分类名、标签名) | term_id, name, slug, term_group |
wp_term_taxonomy | 分类法类型(category、post_tag、自定义分类法) | term_taxonomy_id, term_id, taxonomy, count |
wp_term_relationships | 文章与分类的关联关系 | object_id, term_taxonomy_id |
wp_comments | 评论数据 | comment_ID, comment_post_ID, comment_author |
wp_commentmeta | 评论元数据 | meta_id, comment_id, meta_key, meta_value |
wp_options | 站点配置选项 | option_id, option_name, option_value, autoload |
wp_links | 友情链接(已弃用) | link_id, link_url, link_name |
wp_termmeta | 分类术语元数据 | meta_id, term_id, meta_key, meta_value |
wp_posts (核心内容表) │ ├──→ wp_postmeta (1:N) ── 文章自定义字段 │ ├──→ wp_comments (1:N) ── 文章评论 │ │ │ └──→ wp_commentmeta (1:N) ── 评论元数据 │ └──→ wp_term_relationships (N:N) │ └──→ wp_term_taxonomy (N:1) │ └──→ wp_terms │ └──→ wp_termmeta (1:N) wp_users (用户表) │ └──→ wp_usermeta (1:N) ── 用户角色、头像、偏好设置等 wp_options (独立表) ── 站点设置、小工具、定时任务等
🔍
WP_Query 查询类高级用法
WP_Query 是 WordPress 中最强大的数据库查询类,用于从 wp_posts 表及其关联表中获取数据。
基础查询示例
// 获取最新的 10 篇已发布文章
$args
=
array
(
'post_type'
=>
'post'
,
'post_status'
=>
'publish'
,
'posts_per_page'
=>
10
,
'orderby'
=>
'date'
,
'order'
=>
'DESC'
, );
$query
=
new
WP_Query
(
$args
);
if
(
$query
->
have_posts
()) {
while
(
$query
->
have_posts
()) {
$query
->
the_post
();
echo
'<h2>'
.
get_the_title
() .
'</h2>'
;
echo
'<p>'
.
get_the_excerpt
() .
'</p>'
; }
wp_reset_postdata
();
// 必须重置全局文章数据
}
高级元数据查询
// 查询带有特定自定义字段的精选文章
$args
=
array
(
'post_type'
=>
'post'
,
'meta_query'
=>
array
(
'relation'
=>
'AND'
,
array
(
'key'
=>
'featured'
,
'value'
=>
'1'
,
'compare'
=>
'='
, ),
array
(
'key'
=>
'views_count'
,
'value'
=>
1000
,
'compare'
=>
'>='
,
'type'
=>
'NUMERIC'
, ), ),
'tax_query'
=>
array
(
array
(
'taxonomy'
=>
'category'
,
'field'
=>
'slug'
,
'terms'
=>
array
(
'tech'
,
'design'
),
'operator'
=>
'IN'
, ), ),
'date_query'
=>
array
(
array
(
'after'
=>
'2024-01-01'
,
'before'
=>
'2024-12-31'
, ), ), );
$query
=
new
WP_Query
(
$args
);
性能优化:使用 get_posts() 替代
// get_posts() 默认禁止了 SQL_CALC_FOUND_ROWS,性能更好
$posts
=
get_posts
(
array
(
'numberposts'
=>
5
,
'post_type'
=>
'portfolio'
,
'orderby'
=>
'menu_order'
,
'order'
=>
'ASC'
, ));
foreach
(
$posts
as
$post
) {
setup_postdata
(
$post
);
// 使用模板标签...
}
wp_reset_postdata
();
🛡️
wpdb 类:安全的数据库操作
$wpdb 是 WordPress 提供的数据库操作抽象类,所有数据库交互都应通过该类进行,以确保安全性和兼容性。
安全查询方法
global
$wpdb
;
// 1. 安全的 SELECT 查询(使用 prepare 防止 SQL 注入)
$results
=
$wpdb
->
get_results
(
$wpdb
->
prepare
(
"SELECT * FROM {$wpdb->prefix}posts WHERE post_type = %s AND post_status = %s ORDER BY post_date DESC LIMIT %d"
,
'portfolio'
,
'publish'
,
10
) );
// 2. 获取单个值
$count
=
$wpdb
->
get_var
(
$wpdb
->
prepare
(
"SELECT COUNT(*) FROM {$wpdb->posts} WHERE post_status = %s"
,
'publish'
) );
// 3. 获取单行数据
$row
=
$wpdb
->
get_row
(
$wpdb
->
prepare
(
"SELECT * FROM {$wpdb->users} WHERE ID = %d"
,
1
) );
// 4. 插入数据
$wpdb
->
insert
(
$wpdb
->prefix .
'custom_table'
,
array
(
'name'
=>
'张三'
,
'email'
=>
'zhangsan@example.com'
,
'created'
=>
current_time
(
'mysql'
), ),
array
(
'%s'
,
'%s'
,
'%s'
)
// 数据格式化
);
$insert_id
=
$wpdb
->insert_id;
// 获取插入的 ID
// 5. 更新数据
$wpdb
->
update
(
$wpdb
->prefix .
'custom_table'
,
array
(
'name'
=>
'李四'
),
// 要更新的数据
array
(
'ID'
=>
1
),
// WHERE 条件
array
(
'%s'
),
// 数据格式
array
(
'%d'
)
// WHERE 格式
);
// 6. 删除数据
$wpdb
->
delete
(
$wpdb
->prefix .
'custom_table'
,
array
(
'ID'
=>
5
),
array
(
'%d'
) );
🚨 安全警告:
永远不要直接拼接 SQL 字符串!始终使用
$wpdb->prepare()
进行参数化查询,防止 SQL 注入攻击。占位符类型:
%s
(字符串)、
%d
(整数)、
%f
(浮点数)。
💾
缓存系统:Transients 与 Object Cache
WordPress 提供多层次的缓存机制来提升性能:
Transients API(瞬态缓存 - 存储在数据库中)
// 设置一个 1 小时过期的瞬态缓存
set_transient
(
'my_cached_data'
,
$data
,
HOUR_IN_SECONDS
);
// 获取瞬态缓存
$cached_data
=
get_transient
(
'my_cached_data'
);
if
(
false
===
$cached_data
) {
// 缓存不存在或已过期,执行耗时操作
$cached_data
=
expensive_query_operation
();
set_transient
(
'my_cached_data'
,
$cached_data
,
HOUR_IN_SECONDS
); }
// 删除瞬态缓存
delete_transient
(
'my_cached_data'
);
// 站点级瞬态(多站点环境使用)
set_site_transient
(
'network_data'
,
$data
,
DAY_IN_SECONDS
);
Object Cache(对象缓存 - 内存级)
// 对象缓存 - 仅在当前请求中有效(无持久化后端时)
// 配置 Redis/Memcached 后可持久化
wp_cache_set
(
'user_123_data'
,
$user_data
,
'my_plugin_group'
,
3600
);
$data
=
wp_cache_get
(
'user_123_data'
,
'my_plugin_group'
);
wp_cache_delete
(
'user_123_data'
,
'my_plugin_group'
);
时间常量
| 常量 | 秒数 |
|---|---|
MINUTE_IN_SECONDS | 60 |
HOUR_IN_SECONDS | 3600 |
DAY_IN_SECONDS | 86400 |
WEEK_IN_SECONDS | 604800 |
MONTH_IN_SECONDS | 2592000 |
YEAR_IN_SECONDS | 31536000 |
🎨 第四部分:主题开发完全指南
📄
模板层次系统(Template Hierarchy)
WordPress 的模板层次系统是其最优雅的设计之一。当用户请求某个页面时,WordPress 会按照特定规则查找模板文件:
模板查找优先级
【单篇文章 (Single Post)】 single-{post-type}-{slug}.php → single-{post-type}.php → single.php → singular.php → index.php 【页面 (Page)】 page-{slug}.php → page-{id}.php → page.php → singular.php → index.php 【分类归档 (Category Archive)】 category-{slug}.php → category-{id}.php → category.php → archive.php → index.php 【标签归档 (Tag Archive)】 tag-{slug}.php → tag-{id}.php → tag.php → archive.php → index.php 【自定义分类法归档】 taxonomy-{taxonomy}-{term}.php → taxonomy-{taxonomy}.php → taxonomy.php → archive.php → index.php 【作者归档】 author-{nicename}.php → author-{id}.php → author.php → archive.php → index.php 【日期归档】 date.php → archive.php → index.php 【搜索结果】 search.php → index.php 【404 页面】 404.php → index.php 【首页】 front-page.php → home.php → index.php
💡 工作原理:
WordPress 总是从最具体的模板开始查找,如果找不到,就逐步退回到更通用的模板。
index.php
是最终的 fallback(后备)模板,每个主题都必须至少包含它。
🎨
现代主题开发:完整主题结构
经典主题文件结构
my-theme/
├──
style.css
主题样式 + 主题头信息(必须)
├──
index.php
主模板文件(必须)
├──
functions.php
主题功能注册和自定义函数
├──
header.php
头部模板
├──
footer.php
页脚模板
├──
sidebar.php
侧边栏模板
├──
single.php
单篇文章模板
├──
page.php
页面模板
├──
archive.php
归档模板
├──
search.php
搜索结果模板
├──
404.php
404错误页面模板
├──
comments.php
评论模板
├──
front-page.php
首页模板
├──
home.php
博客首页模板
├──
category.php
分类归档模板
├──
tag.php
标签归档模板
├──
author.php
作者归档模板
├──
single-portfolio.php
自定义文章类型单页模板
├──
page-about.php
特定页面模板
├──
template-parts/
可复用的模板片段
│ ├──
content-post.php
│ ├──
content-page.php
│ ├──
hero-section.php
│ └──
card-grid.php
├──
inc/
功能模块目录
│ ├──
customizer.php
主题定制器
│ ├──
widgets.php
自定义小组件
│ ├──
custom-post-types.php
自定义文章类型
│ └──
hooks.php
自定义钩子
├──
assets/
静态资源
│ ├──
css/
│ ├──
js/
│ ├──
images/
│ └──
fonts/
├──
languages/
翻译文件
│ ├──
my-theme-zh_CN.po
│ └──
my-theme-zh_CN.mo
└──
screenshot.png
主题预览图(1200x900px)
style.css 主题头信息(必须)
/* Theme Name: My Awesome Theme Theme URI: https://example.com/my-theme Author: Your Name Author URI: https://example.com Description: 这是一个现代化的 WordPress 自定义主题 Version: 1.0.0 Requires at least: 6.0 Tested up to: 6.5 Requires PHP: 7.4 License: GNU General Public License v2 or later License URI: http://www.gnu.org/licenses/gpl-2.0.html Text Domain: my-theme Tags: blog, custom-logo, e-commerce, full-site-editing */
functions.php 核心功能注册
<?php
/** * My Theme functions and definitions */
// 主题设置钩子
add_action
(
'after_setup_theme'
,
'mytheme_setup'
);
function
mytheme_setup
() {
// 让主题支持核心功能
add_theme_support
(
'title-tag'
);
// 自动输出标题标签
add_theme_support
(
'post-thumbnails'
);
// 特色图片支持
add_theme_support
(
'custom-logo'
);
// 自定义 Logo
add_theme_support
(
'html5'
,
array
(
// HTML5 标记支持
'search-form'
,
'comment-form'
,
'comment-list'
,
'gallery'
,
'caption'
));
add_theme_support
(
'customize-selective-refresh-widgets'
);
add_theme_support
(
'responsive-embeds'
);
add_theme_support
(
'align-wide'
);
add_theme_support
(
'editor-styles'
);
add_theme_support
(
'wp-block-styles'
);
// 注册导航菜单位置
register_nav_menus
(
array
(
'primary'
=>
__
(
'主导航菜单'
,
'my-theme'
),
'footer'
=>
__
(
'页脚菜单'
,
'my-theme'
),
'social'
=>
__
(
'社交媒体菜单'
,
'my-theme'
), ));
// 设置内容宽度
global
$content_width
;
if
(!
isset
(
$content_width
)) {
$content_width
=
1200
; }
// 添加自定义图片尺寸
add_image_size
(
'card-thumbnail'
,
400
,
300
,
true
);
add_image_size
(
'hero-image'
,
1920
,
600
,
true
); }
// 加载样式和脚本
add_action
(
'wp_enqueue_scripts'
,
'mytheme_scripts'
);
function
mytheme_scripts
() {
// 主样式表
wp_enqueue_style
(
'mytheme-style'
,
get_stylesheet_uri
(),
array
(),
wp_get_theme
()->
get
(
'Version'
) );
// Google Fonts
wp_enqueue_style
(
'mytheme-fonts'
,
'https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@400;700&display=swap'
,
array
(),
null
);
// 主脚本
wp_enqueue_script
(
'mytheme-script'
,
get_template_directory_uri
() .
'/assets/js/main.js'
,
array
(
'jquery'
),
'1.0.0'
,
true
// 放在 footer
);
// 传递数据给 JavaScript
wp_localize_script
(
'mytheme-script'
,
'myThemeData'
,
array
(
'ajaxUrl'
=>
admin_url
(
'admin-ajax.php'
),
'nonce'
=>
wp_create_nonce
(
'mytheme_nonce'
), ));
// 条件加载
if
(
is_singular
() &&
comments_open
()) {
wp_enqueue_script
(
'comment-reply'
); } }
// 注册侧边栏/小工具区域
add_action
(
'widgets_init'
,
'mytheme_widgets_init'
);
function
mytheme_widgets_init
() {
register_sidebar
(
array
(
'name'
=>
__
(
'主侧边栏'
,
'my-theme'
),
'id'
=>
'sidebar-1'
,
'description'
=>
__
(
'显示在内容右侧的小工具区域'
,
'my-theme'
),
'before_widget'
=>
'<section id="%1$s" class="widget %2$s">'
,
'after_widget'
=>
'</section>'
,
'before_title'
=>
'<h3 class="widget-title">'
,
'after_title'
=>
'</h3>'
, )); }
🧱
块主题(Block Theme)与全站编辑(FSE)
WordPress 5.9+ 引入了块主题(Block Theme)概念,配合全站编辑(Full Site Editing)功能,允许用户通过可视化界面编辑整个网站的布局。
块主题文件结构
my-block-theme/
├──
style.css
主题头信息
├──
theme.json
主题配置(颜色、字体、间距等)
├──
functions.php
PHP 函数(可选,块主题可不需要)
├──
templates/
页面模板(HTML 格式,使用区块标记)
│ ├──
index.html
必须存在的 fallback 模板
│ ├──
single.html
单篇文章
│ ├──
page.html
页面
│ ├──
archive.html
归档页
│ ├──
home.html
博客首页
│ ├──
search.html
搜索结果
│ ├──
404.html
404 页面
│ └──
blank.html
空白模板
├──
parts/
模板部件(可复用的区块组合)
│ ├──
header.html
页头部件
│ └──
footer.html
页脚部件
├──
patterns/
区块模式
│ └──
hero-pattern.php
英雄区域模式
└──
assets/
字体、图片等资源
theme.json 配置示例
{
"$schema"
:
"https://schemas.wp.org/trunk/theme.json"
,
"version"
:
3
,
"settings"
: {
"color"
: {
"palette"
: [ {
"slug"
:
"primary"
,
"color"
:
"#0073aa"
,
"name"
:
"Primary"
}, {
"slug"
:
"secondary"
,
"color"
:
"#23282d"
,
"name"
:
"Secondary"
} ],
"custom"
:
false
,
"defaultPalette"
:
false
},
"typography"
: {
"fontFamilies"
: [ {
"fontFamily"
:
"\"Noto Sans SC\", sans-serif"
,
"slug"
:
"noto-sans"
,
"name"
:
"Noto Sans SC"
} ],
"fontSizes"
: [ {
"slug"
:
"small"
,
"size"
:
"0.875rem"
,
"name"
:
"Small"
}, {
"slug"
:
"medium"
,
"size"
:
"1rem"
,
"name"
:
"Medium"
}, {
"slug"
:
"large"
,
"size"
:
"1.5rem"
,
"name"
:
"Large"
} ] },
"layout"
: {
"contentSize"
:
"800px"
,
"wideSize"
:
"1200px"
},
"spacing"
: {
"units"
: [
"px"
,
"em"
,
"rem"
,
"%"
,
"vw"
] } },
"styles"
: {
"color"
: {
"background"
:
"var(--wp--preset--color--white)"
,
"text"
:
"var(--wp--preset--color--secondary)"
},
"typography"
: {
"fontFamily"
:
"var(--wp--preset--font-family--noto-sans)"
,
"fontSize"
:
"var(--wp--preset--font-size--medium)"
,
"lineHeight"
:
"1.8"
},
"elements"
: {
"link"
: {
"color"
: {
"text"
:
"var(--wp--preset--color--primary)"
} } } },
"templateParts"
: [ {
"name"
:
"header"
,
"title"
:
"Header"
,
"area"
:
"header"
}, {
"name"
:
"footer"
,
"title"
:
"Footer"
,
"area"
:
"footer"
} ] }
区块模板示例 (templates/single.html)
<!-- wp:template-part {"slug":"header","tagName":"header"} /-->
<!-- wp:group {"tagName":"main","layout":{"type":"constrained"}} --> <main class="wp-block-group">
<!-- wp:post-title {"level":1} /-->
<!-- wp:group {"layout":{"type":"flex"}} -->
<div class="wp-block-group">
<!-- wp:post-date /-->
<!-- wp:post-author-name /-->
<!-- wp:post-terms {"term":"category"} /-->
</div>
<!-- /wp:group -->
<!-- wp:post-featured-image /-->
<!-- wp:post-content {"layout":{"type":"constrained"}} /-->
<!-- wp:separator -->
<hr class="wp-block-separator"/>
<!-- /wp:separator -->
<!-- wp:comments -->
<div class="wp-block-comments">
<!-- wp:comments-title /-->
<!-- wp:comment-template -->
<!-- wp:avatar /-->
<!-- wp:comment-author-name /-->
<!-- wp:comment-date /-->
<!-- wp:comment-content /-->
<!-- wp:comment-reply-link /-->
<!-- /wp:comment-template -->
<!-- wp:comments-pagination -->
<!-- wp:comments-pagination-previous /-->
<!-- wp:comments-pagination-numbers /-->
<!-- wp:comments-pagination-next /-->
<!-- /wp:comments-pagination -->
<!-- wp:post-comments-form /-->
</div>
<!-- /wp:comments -->
</main>
<!-- /wp:group -->
<!-- wp:template-part {"slug":"footer","tagName":"footer"} /-->
🎛️
主题定制器(Customizer)开发
WordPress 主题定制器提供了一个实时预览的可视化配置界面,让用户无需编写代码即可自定义主题外观。
add_action
(
'customize_register'
,
'mytheme_customize_register'
);
function
mytheme_customize_register
(
$wp_customize
) {
// ===== 添加一个新的面板(Panel)=====
$wp_customize
->
add_panel
(
'mytheme_panel'
,
array
(
'title'
=>
__
(
'主题设置'
,
'my-theme'
),
'priority'
=>
10
, ));
// ===== 添加一个区块(Section)=====
$wp_customize
->
add_section
(
'mytheme_hero_section'
,
array
(
'title'
=>
__
(
'英雄区域设置'
,
'my-theme'
),
'panel'
=>
'mytheme_panel'
,
'priority'
=>
10
, ));
// ===== 添加设置(Setting)=====
$wp_customize
->
add_setting
(
'hero_title'
,
array
(
'default'
=>
__
(
'欢迎来到我们的网站'
,
'my-theme'
),
'sanitize_callback'
=>
'sanitize_text_field'
,
'transport'
=>
'postMessage'
,
// 实时预览
));
// ===== 添加控件(Control)=====
$wp_customize
->
add_control
(
'hero_title'
,
array
(
'label'
=>
__
(
'英雄区域标题'
,
'my-theme'
),
'section'
=>
'mytheme_hero_section'
,
'type'
=>
'text'
,
'priority'
=>
10
, ));
// 颜色选择器
$wp_customize
->
add_setting
(
'primary_color'
,
array
(
'default'
=>
'#0073aa'
,
'sanitize_callback'
=>
'sanitize_hex_color'
, ));
$wp_customize
->
add_control
(
new
WP_Customize_Color_Control
(
$wp_customize
,
'primary_color'
,
array
(
'label'
=>
__
(
'主色调'
,
'my-theme'
),
'section'
=>
'mytheme_hero_section'
, ) ));
// 图片上传
$wp_customize
->
add_setting
(
'hero_background'
,
array
(
'default'
=>
''
,
'sanitize_callback'
=>
'esc_url_raw'
, ));
$wp_customize
->
add_control
(
new
WP_Customize_Image_Control
(
$wp_customize
,
'hero_background'
,
array
(
'label'
=>
__
(
'英雄区域背景图'
,
'my-theme'
),
'section'
=>
'mytheme_hero_section'
, ) )); }
// 输出动态 CSS
add_action
(
'wp_head'
,
'mytheme_customizer_css'
);
function
mytheme_customizer_css
() {
$primary_color
=
get_theme_mod
(
'primary_color'
,
'#0073aa'
); ?> <style type="text/css"> :root { --primary-color: <?php echo
esc_attr
(
$primary_color
); ?>; } .site-header, .btn-primary { background-color: var(--primary-color); } </style> <?php }
🔌 第五部分:插件开发完全指南
📝
插件基础结构与开发规范
WordPress 插件是扩展核心功能的标准方式。一个良好的插件应该遵循 WordPress 编码标准。
插件目录结构
my-plugin/
├──
my-plugin.php
主插件文件(必须,包含头信息)
├──
uninstall.php
卸载清理脚本
├──
readme.txt
WordPress.org 插件说明
├──
includes/
PHP 类和函数
│ ├──
class-my-plugin.php
主类
│ ├──
class-admin.php
后台功能
│ └──
class-frontend.php
前端功能
├──
admin/
后台资源
│ ├──
css/
│ ├──
js/
│ └──
views/
├──
public/
前端资源
│ ├──
css/
│ ├──
js/
│ └──
partials/
├──
templates/
模板文件
├──
languages/
国际化翻译
│ └──
my-plugin-zh_CN.po
└──
assets/
通用资源
插件主文件头信息
<?php
/** * Plugin Name: My Awesome Plugin * Plugin URI: https://example.com/my-plugin * Description: 一个功能强大的 WordPress 插件,用于实现 XXX 功能。 * Version: 1.0.0 * Requires at least: 6.0 * Requires PHP: 7.4 * Author: Your Name * Author URI: https://example.com * License: GPL v2 or later * License URI: https://www.gnu.org/licenses/gpl-2.0.html * Text Domain: my-plugin * Domain Path: /languages * Network: false */
// 防止直接访问
if
(!
defined
(
'ABSPATH'
)) {
exit
;
// Exit if accessed directly
}
// 定义插件常量
define
(
'MY_PLUGIN_VERSION'
,
'1.0.0'
);
define
(
'MY_PLUGIN_FILE'
,
FILE
);
define
(
'MY_PLUGIN_DIR'
,
plugin_dir_path
(
FILE
));
define
(
'MY_PLUGIN_URL'
,
plugin_dir_url
(
FILE
));
define
(
'MY_PLUGIN_BASENAME'
,
plugin_basename
(
FILE
));
激活、停用和卸载钩子
// 插件激活时执行
register_activation_hook
(
FILE
,
'my_plugin_activate'
);
function
my_plugin_activate
() {
// 创建自定义数据表
global
$wpdb
;
$table_name
=
$wpdb
->prefix .
'my_plugin_data'
;
$charset_collate
=
$wpdb
->
get_charset_collate
();
$sql
=
"CREATE TABLE $table_name ( id bigint(20) NOT NULL AUTO_INCREMENT, user_id bigint(20) NOT NULL, data_key varchar(255) NOT NULL, data_value longtext, created_at datetime DEFAULT CURRENT_TIMESTAMP, updated_at datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY user_id (user_id), KEY data_key (data_key) ) $charset_collate;"
;
require_once
(
ABSPATH
.
'wp-admin/includes/upgrade.php'
);
dbDelta
(
$sql
);
// 设置默认选项
add_option
(
'my_plugin_version'
, MY_PLUGIN_VERSION);
add_option
(
'my_plugin_settings'
,
array
(
'enabled'
=>
true
,
'display_mode'
=>
'grid'
, ));
// 刷新永久链接
flush_rewrite_rules
(); }
// 插件停用时执行
register_deactivation_hook
(
FILE
,
'my_plugin_deactivate'
);
function
my_plugin_deactivate
() {
// 清除定时任务
wp_clear_scheduled_hook
(
'my_plugin_daily_task'
);
flush_rewrite_rules
(); }
// uninstall.php 文件内容(在插件被删除时执行)
// 注意:uninstall.php 必须首先检查 WP_UNINSTALL_PLUGIN 常量
// uninstall.php
<?php
if
(!
defined
(
'WP_UNINSTALL_PLUGIN'
)) {
exit
; }
// 删除插件创建的数据表
global
$wpdb
;
$wpdb
->
query
(
"DROP TABLE IF EXISTS {$wpdb->prefix}my_plugin_data"
);
// 删除选项
delete_option
(
'my_plugin_version'
);
delete_option
(
'my_plugin_settings'
);
// 删除用户元数据
delete_metadata
(
'user'
,
0
,
'my_plugin_pref'
,
''
,
true
);
🏢
面向对象插件架构设计
现代 WordPress 插件推荐使用面向对象编程(OOP)方式组织代码:
<?php
/** * 插件主类 - 单例模式 */
final class
My_Plugin
{
// 单例实例
private static
$instance
=
null
;
// 子模块
public
$admin
;
public
$frontend
;
public
$api
;
/** * 获取单例实例 */
public static function
get_instance
() {
if
(
null
===
self
::
$instance
) {
self
::
$instance
=
new
self
(); }
return
self
::
$instance
; }
/** * 私有构造函数 */
private function
__construct
() {
$this
->
define_constants
();
$this
->
includes
();
$this
->
init_hooks
(); }
/** * 定义常量 */
private function
define_constants
() {
if
(!
defined
(
'MY_PLUGIN_VERSION'
)) {
define
(
'MY_PLUGIN_VERSION'
,
'1.0.0'
); } }
/** * 加载必要文件 */
private function
includes
() {
require_once
MY_PLUGIN_DIR .
'includes/class-admin.php'
;
require_once
MY_PLUGIN_DIR .
'includes/class-frontend.php'
;
require_once
MY_PLUGIN_DIR .
'includes/class-api.php'
;
require_once
MY_PLUGIN_DIR .
'includes/functions.php'
; }
/** * 初始化钩子 */
private function
init_hooks
() {
add_action
(
'init'
,
array
(
$this
,
'init'
),
0
);
add_action
(
'plugins_loaded'
,
array
(
$this
,
'load_textdomain'
)); }
/** * 插件初始化 */
public function
init
() {
// 根据环境加载不同模块
if
(
is_admin
()) {
$this
->admin =
new
My_Plugin_Admin
(); }
else
{
$this
->frontend =
new
My_Plugin_Frontend
(); }
$this
->api =
new
My_Plugin_API
();
// 触发自定义钩子
do_action
(
'my_plugin_loaded'
); }
/** * 加载语言文件 */
public function
load_textdomain
() {
load_plugin_textdomain
(
'my-plugin'
,
false
,
dirname
(MY_PLUGIN_BASENAME) .
'/languages/'
); } }
// 启动插件
My_Plugin
::
get_instance
();
⚡
AJAX 请求处理与安全验证
WordPress 提供了完善的 AJAX 处理机制,同时强调安全性验证(Nonce)。
后端 PHP 处理
// 注册 AJAX 处理器(登录用户和未登录用户)
add_action
(
'wp_ajax_my_custom_action'
,
'handle_my_ajax_request'
);
add_action
(
'wp_ajax_nopriv_my_custom_action'
,
'handle_my_ajax_request'
);
function
handle_my_ajax_request
() {
// 1. 验证 Nonce(安全令牌)
if
(!
check_ajax_referer
(
'my_plugin_nonce'
,
'nonce'
,
false
)) {
wp_send_json_error
(
array
(
'message'
=>
'安全检查失败'
),
403
); }
// 2. 验证权限
if
(!
current_user_can
(
'edit_posts'
)) {
wp_send_json_error
(
array
(
'message'
=>
'权限不足'
),
403
); }
// 3. 获取并清理输入数据
$post_id
=
absint
(
$_POST
[
'post_id'
]);
$action_type
=
sanitize_text_field
(
$_POST
[
'action_type'
]);
// 4. 执行业务逻辑
$result
=
process_data
(
$post_id
,
$action_type
);
// 5. 返回 JSON 响应
if
(
$result
) {
wp_send_json_success
(
array
(
'message'
=>
'操作成功'
,
'data'
=>
$result
, )); }
else
{
wp_send_json_error
(
array
(
'message'
=>
'操作失败'
)); } }
前端 JavaScript 调用
// 使用 jQuery
jQuery.
ajax
({ url: myPluginData.ajaxUrl,
// 通过 wp_localize_script 传递
type:
'POST'
, data: { action:
'my_custom_action'
,
// 对应 wp_ajax_ 后的 action
nonce: myPluginData.nonce, post_id: postId, action_type:
'like'
}, success:
function
(response) {
if
(response.success) { console.
log
(response.data.message);
// 更新 UI
}
else
{ console.
error
(response.data.message); } }, error:
function
(xhr) { console.
error
(
'请求失败:'
, xhr.statusText); } });
// 使用 Fetch API(现代方式)
const
formData =
new
FormData
(); formData.
append
(
'action'
,
'my_custom_action'
); formData.
append
(
'nonce'
, myPluginData.nonce); formData.
append
(
'post_id'
, postId);
fetch
(myPluginData.ajaxUrl, { method:
'POST'
, body: formData }) .
then
(response => response.
json
()) .
then
(data => {
if
(data.success) {
// 成功处理
} });
📋
自定义文章类型与分类法
自定义文章类型(Custom Post Types)和自定义分类法(Custom Taxonomies)是 WordPress 内容建模的核心工具。
注册自定义文章类型
add_action
(
'init'
,
'register_portfolio_post_type'
);
function
register_portfolio_post_type
() {
$labels
=
array
(
'name'
=>
__
(
'作品集'
,
'my-plugin'
),
'singular_name'
=>
__
(
'作品'
,
'my-plugin'
),
'menu_name'
=>
__
(
'作品集'
,
'my-plugin'
),
'add_new'
=>
__
(
'添加新作品'
,
'my-plugin'
),
'add_new_item'
=>
__
(
'添加新作品'
,
'my-plugin'
),
'edit_item'
=>
__
(
'编辑作品'
,
'my-plugin'
),
'new_item'
=>
__
(
'新作品'
,
'my-plugin'
),
'view_item'
=>
__
(
'查看作品'
,
'my-plugin'
),
'search_items'
=>
__
(
'搜索作品'
,
'my-plugin'
),
'not_found'
=>
__
(
'没有找到作品'
,
'my-plugin'
), );
$args
=
array
(
'labels'
=>
$labels
,
'public'
=>
true
,
'has_archive'
=>
true
,
'publicly_queryable'
=>
true
,
'show_ui'
=>
true
,
'show_in_menu'
=>
true
,
'show_in_rest'
=>
true
,
// 启用 Gutenberg 和 REST API
'menu_position'
=>
5
,
'menu_icon'
=>
'dashicons-portfolio'
,
'supports'
=>
array
(
'title'
,
'editor'
,
'thumbnail'
,
'excerpt'
,
'custom-fields'
,
'revisions'
),
'taxonomies'
=>
array
(
'portfolio_category'
,
'portfolio_tag'
),
'rewrite'
=>
array
(
'slug'
=>
'portfolio'
,
'with_front'
=>
false
, ),
'capability_type'
=>
'post'
,
'hierarchical'
=>
false
, );
register_post_type
(
'portfolio'
,
$args
); }
注册自定义分类法
add_action
(
'init'
,
'register_portfolio_taxonomy'
);
function
register_portfolio_taxonomy
() {
$labels
=
array
(
'name'
=>
__
(
'作品分类'
,
'my-plugin'
),
'singular_name'
=>
__
(
'分类'
,
'my-plugin'
),
'add_new_item'
=>
__
(
'添加新分类'
,
'my-plugin'
), );
$args
=
array
(
'labels'
=>
$labels
,
'public'
=>
true
,
'show_in_rest'
=>
true
,
'hierarchical'
=>
true
,
// true = 类似分类,false = 类似标签
'show_admin_column'
=>
true
,
'rewrite'
=>
array
(
'slug'
=>
'portfolio-category'
), );
register_taxonomy
(
'portfolio_category'
,
'portfolio'
,
$args
); }
⏰
WP-Cron 定时任务
WordPress 内置了伪定时任务系统(WP-Cron),基于页面访问触发。
// 1. 注册自定义时间间隔
add_filter
(
'cron_schedules'
,
'add_custom_cron_intervals'
);
function
add_custom_cron_intervals
(
$schedules
) {
$schedules
[
'every_five_minutes'
] =
array
(
'interval'
=>
300
,
'display'
=>
__
(
'每五分钟'
,
'my-plugin'
), );
return
$schedules
; }
// 2. 在激活时安排定时任务
function
my_plugin_activate
() {
if
(!
wp_next_scheduled
(
'my_plugin_daily_cleanup'
)) {
wp_schedule_event
(
time
(),
'daily'
,
'my_plugin_daily_cleanup'
); } }
// 3. 注册定时任务钩子
add_action
(
'my_plugin_daily_cleanup'
,
'do_daily_cleanup'
);
function
do_daily_cleanup
() {
// 执行每日清理任务
global
$wpdb
;
$wpdb
->
query
(
"DELETE FROM {$wpdb->prefix}my_plugin_data WHERE created_at < DATE_SUB(NOW(), INTERVAL 30 DAY)"
); }
// 4. 在停用时取消定时任务
function
my_plugin_deactivate
() {
wp_clear_scheduled_hook
(
'my_plugin_daily_cleanup'
); }
✅ 生产环境建议:
禁用默认的 WP-Cron(在 wp-config.php 中添加
define('DISABLE_WP_CRON', true);
),然后使用服务器的真实 Cron Job 每隔几分钟访问
wp-cron.php
,以获得更可靠的定时任务执行。
🧩
Shortcode 短代码开发
短代码允许用户在文章内容中嵌入动态内容。
// 注册短代码: [my_gallery id="123" columns="3"]
add_shortcode
(
'my_gallery'
,
'render_my_gallery'
);
function
render_my_gallery
(
$atts
,
$content
=
null
) {
// 解析属性,设置默认值
$atts
=
shortcode_atts
(
array
(
'id'
=>
0
,
'columns'
=>
3
,
'size'
=>
'medium'
,
'class'
=>
''
, ),
$atts
,
'my_gallery'
);
$id
=
absint
(
$atts
[
'id'
]);
$columns
=
absint
(
$atts
[
'columns'
]);
$size
=
sanitize_text_field
(
$atts
[
'size'
]);
$class
=
sanitize_html_class
(
$atts
[
'class'
]);
// 获取图片数据
$images
=
get_post_meta
(
$id
,
'_gallery_images'
,
true
);
if
(empty(
$images
)) {
return
''
; }
// 加载模板并渲染
ob_start
();
include
MY_PLUGIN_DIR .
'templates/gallery.php'
;
return
ob_get_clean
(); }
🔗 第六部分:WordPress REST API
🌐
REST API 概述与内置端点
WordPress REST API 提供了一套完整的 HTTP 接口,允许外部应用程序与 WordPress 站点进行交互。API 的基础 URL 为 /wp-json/wp/v2/。
核心内置端点
| 端点 | 方法 | 说明 |
|---|---|---|
/wp/v2/posts | GET/POST | 获取/创建文章 |
/wp/v2/posts/{id} | GET/PUT/DELETE | 操作单篇文章 |
/wp/v2/pages | GET/POST | 获取/创建页面 |
/wp/v2/categories | GET/POST | 文章分类 |
/wp/v2/tags | GET/POST | 文章标签 |
/wp/v2/users | GET/POST | 用户信息 |
/wp/v2/comments | GET/POST | 评论数据 |
/wp/v2/media | GET/POST | 媒体文件 |
/wp/v2/types | GET | 文章类型 |
/wp/v2/taxonomies | GET | 分类法 |
/wp/v2/settings | GET/PUT | 站点设置 |
常用查询参数
分页和排序
GET /wp-json/wp/v2/posts?page=2&per_page=10&orderby=date&order=desc
按分类筛选
GET /wp-json/wp/v2/posts?categories=3,5
按标签筛选
GET /wp-json/wp/v2/posts?tags=8
搜索
GET /wp-json/wp/v2/posts?search=WordPress
日期筛选
GET /wp-json/wp/v2/posts?after=2024-01-01T00:00:00&before=2024-12-31T23:59:59
指定返回字段
GET /wp-json/wp/v2/posts?_fields=id,title,date,excerpt
嵌入关联数据
GET /wp-json/wp/v2/posts?_embed
🔧
自定义 REST API 端点开发
// 注册自定义 REST API 路由
add_action
(
'rest_api_init'
,
'register_custom_routes'
);
function
register_custom_routes
() {
// 获取推荐文章列表
register_rest_route
(
'myplugin/v1'
,
'/featured'
,
array
(
'methods'
=>
'GET'
,
'callback'
=>
'get_featured_posts'
,
'permission_callback'
=>
'__return_true'
,
// 公开访问
'args'
=>
array
(
'count'
=>
array
(
'required'
=>
false
,
'default'
=>
5
,
'sanitize_callback'
=>
'absint'
,
'validate_callback'
=>
function
(
$param
) {
return
is_numeric
(
$param
) &&
$param
<=
50
; }, ), ), ));
// 用户点赞操作
register_rest_route
(
'myplugin/v1'
,
'/posts/(?P<id>\d+)/like'
,
array
(
'methods'
=>
'POST'
,
'callback'
=>
'handle_like_post'
,
'permission_callback'
=>
function
() {
return
is_user_logged_in
(); },
'args'
=>
array
(
'id'
=>
array
(
'validate_callback'
=>
function
(
$param
) {
return
is_numeric
(
$param
); }, ), ), ));
// 提交联系表单
register_rest_route
(
'myplugin/v1'
,
'/contact'
,
array
(
'methods'
=>
'POST'
,
'callback'
=>
'handle_contact_form'
,
'permission_callback'
=>
'__return_true'
, )); }
// 回调函数实现
function
get_featured_posts
(
$request
) {
$count
=
$request
->
get_param
(
'count'
);
$posts
=
get_posts
(
array
(
'meta_key'
=>
'_featured'
,
'meta_value'
=>
'1'
,
'numberposts'
=>
$count
,
'orderby'
=>
'date'
,
'order'
=>
'DESC'
, ));
$data
=
array
();
foreach
(
$posts
as
$post
) {
$data
[] =
array
(
'id'
=>
$post
->ID,
'title'
=>
$post
->post_title,
'excerpt'
=>
get_the_excerpt
(
$post
),
'thumbnail'
=>
get_the_post_thumbnail_url
(
$post
,
'medium'
),
'link'
=>
get_permalink
(
$post
),
'date'
=>
$post
->post_date, ); }
return
new
WP_REST_Response
(
$data
,
200
); }
function
handle_like_post
(
$request
) {
$post_id
=
$request
[
'id'
];
$user_id
=
get_current_user_id
();
// 检查是否已点赞
$liked
=
get_user_meta
(
$user_id
,
'_liked_posts'
,
true
);
$liked
=
$liked
?
$liked
:
array
();
if
(
in_array
(
$post_id
,
$liked
)) {
return
new
WP_Error
(
'already_liked'
,
'您已经点过赞了'
,
array
(
'status'
=>
400
)); }
// 记录点赞
$liked
[] =
$post_id
;
update_user_meta
(
$user_id
,
'_liked_posts'
,
$liked
);
// 更新点赞数
$count
= (
int
)
get_post_meta
(
$post_id
,
'_like_count'
,
true
);
update_post_meta
(
$post_id
,
'_like_count'
,
$count
+
1
);
return
new
WP_REST_Response
(
array
(
'success'
=>
true
,
'like_count'
=>
$count
+
1
, ),
200
); }
🔐
REST API 认证与安全
WordPress REST API 支持多种认证方式:
1. Cookie 认证(前端 AJAX 使用)
// WordPress 自动在页面中设置 nonce
// 通过 wp_localize_script 或 wp_rest 获取
fetch
(
'/wp-json/wp/v2/posts'
, { method:
'POST'
, headers: {
'Content-Type'
:
'application/json'
,
'X-WP-Nonce'
: wpApiSettings.nonce
// Cookie 认证 nonce
}, body: JSON.
stringify
({ title:
'新文章标题'
, content:
'文章内容...'
, status:
'draft'
}) });
2. Application Passwords(WP 5.6+)
使用 Application Password 进行 HTTP Basic 认证
curl --user "username:xxxx xxxx xxxx xxxx xxxx xxxx" \ https://example.com/wp-json/wp/v2/posts
3. JWT Token 认证(需插件)
// 获取 JWT Token
const
response =
await
fetch
(
'/wp-json/jwt-auth/v1/token'
, { method:
'POST'
, headers: {
'Content-Type'
:
'application/json'
}, body: JSON.
stringify
({ username:
'admin'
, password:
'password'
}) });
const
{ token } =
await
response.
json
();
// 使用 Token 访问受保护资源
const
data =
await
fetch
(
'/wp-json/wp/v2/users/me'
, { headers: {
'Authorization'
:
Bearer ${token}
} });
🚨 安全最佳实践:
🔒 第七部分:WordPress 安全实践
🛡️
常见安全威胁与防御
1. SQL 注入防御
// ❌ 危险:直接拼接
$wpdb
->
query
(
"SELECT * FROM {$wpdb->posts} WHERE ID = "
.
$_GET
[
'id'
]);
// ✅ 安全:使用 prepare
$wpdb
->
get_results
(
$wpdb
->
prepare
(
"SELECT * FROM {$wpdb->posts} WHERE ID = %d"
,
absint
(
$_GET
[
'id'
]) ));
2. XSS(跨站脚本)防御
// 输出到 HTML 属性
echo
esc_attr
(
$value
);
// <input value="...">
echo
esc_html
(
$value
);
// HTML 文本内容
echo
esc_url
(
$value
);
// URL 链接
echo
esc_textarea
(
$value
);
// <textarea> 内容
echo
esc_js
(
$value
);
// JavaScript 字符串
echo
wp_kses_post
(
$value
);
// 允许安全的 HTML 标签
echo
wp_kses
(
$value
,
$allowed_tags
);
// 自定义允许的标签
3. CSRF(跨站请求伪造)防御
// 生成 Nonce
$nonce
=
wp_create_nonce
(
'my_action_nonce'
);
// 在表单中使用
<form method="post"> <input type="hidden" name="_wpnonce" value="<?php echo
esc_attr
(
$nonce
); ?>"> <?php
wp_nonce_field
(
'my_action'
,
'my_nonce_field'
); ?> </form>
// 验证 Nonce
if
(!
wp_verify_nonce
(
$_POST
[
'my_nonce_field'
],
'my_action'
)) {
die
(
'安全检查失败'
); }
4. 数据清理(Sanitization)
// 输入数据清理
$text
=
sanitize_text_field
(
$_POST
[
'text_field'
]);
=
sanitize_email
(
$_POST
[
'email'
]);
$url
=
esc_url_raw
(
$_POST
[
'url'
]);
$int
=
absint
(
$_POST
[
'number'
]);
$html
=
wp_kses_post
(
$_POST
[
'content'
]);
$key
=
sanitize_key
(
$_POST
[
'meta_key'
]);
$class
=
sanitize_html_class
(
$_POST
[
'css_class'
]);
$file
=
sanitize_file_name
(
$filename
);
$title
=
sanitize_title
(
$_POST
[
'title'
]);
🔑
用户认证与权限管理
WordPress 内置角色与权限
| 角色 | 英文 | 核心权限 |
|---|---|---|
| 超级管理员 | Super Admin | 多站点网络完全控制 |
| 管理员 | Administrator | 单站点完全控制 |
| 编辑 | Editor | 管理所有文章和页面 |
| 作者 | Author | 管理自己的文章 |
| 贡献者 | Contributor | 撰写文章但不能发布 |
| 订阅者 | Subscriber | 仅管理个人资料 |
自定义角色与权限
// 创建自定义角色
add_action
(
'init'
,
'create_custom_roles'
);
function
create_custom_roles
() {
add_role
(
'content_manager'
,
'内容经理'
,
array
(
'read'
=>
true
,
'edit_posts'
=>
true
,
'delete_posts'
=>
true
,
'publish_posts'
=>
true
,
'upload_files'
=>
true
,
'edit_published_posts'
=>
true
,
'manage_categories'
=>
true
, ));
// 为已有角色添加权限
$role
=
get_role
(
'editor'
);
$role
->
add_cap
(
'manage_portfolio'
); }
// 权限检查
if
(!
current_user_can
(
'manage_options'
)) {
wp_die
(
'您没有权限访问此页面'
); }
⚡ 第八部分:性能优化策略
🚀
缓存策略全景
多层缓存架构
用户请求 │ ▼ ┌───────────────┐ │ CDN 缓存 │ ← CloudFlare / AWS CloudFront │ (边缘缓存) │ 缓存静态资源、页面 HTML └───────┬───────┘ │ ▼ ┌───────────────┐ │ 页面缓存 │ ← WP Super Cache / W3 Total Cache │ (全页 HTML) │ 生成静态 HTML 文件 └───────┬───────┘ │ ▼ ┌───────────────┐ │ 对象缓存 │ ← Redis / Memcached │ (数据库查询) │ 缓存 WP_Query 结果、选项 └───────┬───────┘ │ ▼ ┌───────────────┐ │ 数据库缓存 │ ← MySQL Query Cache │ (查询结果) │ 数据库层缓存 └───────────────┘
Redis 对象缓存配置
// wp-config.php 中添加
define
(
'WP_CACHE'
,
true
);
define
(
'WP_REDIS_HOST'
,
'127.0.0.1'
);
define
(
'WP_REDIS_PORT'
,
6379
);
define
(
'WP_REDIS_PASSWORD'
,
'your_password'
);
define
(
'WP_REDIS_DATABASE'
,
0
);
define
(
'WP_REDIS_TIMEOUT'
,
1
);
define
(
'WP_REDIS_READ_TIMEOUT'
,
1
);
// 安装 Redis Object Cache 插件
// 或放置 wp-content/object-cache.php drop-in
代码级性能优化
// 1. 缓存昂贵的数据库查询
function
get_expensive_data
() {
$cache_key
=
'expensive_data_cache'
;
$cached
=
get_transient
(
$cache_key
);
if
(
false
!==
$cached
) {
return
$cached
; }
// 执行耗时操作
$data
=
complex_database_query
();
// 缓存 24 小时
set_transient
(
$cache_key
,
$data
,
DAY_IN_SECONDS
);
return
$data
; }
// 2. 延迟加载不关键的脚本
add_action
(
'wp_enqueue_scripts'
,
function
() {
// 添加 defer/async 属性
add_filter
(
'script_loader_tag'
,
function
(
$tag
,
$handle
) {
if
(
in_array
(
$handle
, [
'analytics'
,
'chat-widget'
])) {
return
str_replace
(
' src'
,
' defer src'
,
$tag
); }
return
$tag
; },
10
,
2
); });
// 3. 禁用不需要的 Emoji 和 Embeds
add_action
(
'init'
,
function
() {
remove_action
(
'wp_head'
,
'print_emoji_detection_script'
,
7
);
remove_action
(
'wp_print_styles'
,
'print_emoji_styles'
);
remove_action
(
'wp_head'
,
'wp_oembed_add_discovery_links'
);
remove_action
(
'wp_head'
,
'wp_oembed_add_host_js'
); });
// 4. 禁用 Heartbeat API(减少 AJAX 请求)
add_action
(
'init'
,
function
() {
if
(!
is_admin
()) {
wp_deregister_script
(
'heartbeat'
); } });
📦
数据库优化与维护
-- 清理文章修订版本(保留最近5个)
DELETE FROM wp_posts WHERE post_type = 'revision' AND ID NOT IN ( SELECT * FROM ( SELECT ID FROM wp_posts WHERE post_type = 'revision' ORDER BY post_modified DESC LIMIT 5 ) AS t );
-- 删除垃圾评论
DELETE FROM wp_comments WHERE comment_approved = 'spam';
-- 删除未使用的文章元数据
DELETE pm FROM wp_postmeta pm LEFT JOIN wp_posts p ON pm.post_id = p.ID WHERE p.ID IS NULL;
-- 优化所有表
OPTIMIZE TABLE wp_posts; OPTIMIZE TABLE wp_postmeta; OPTIMIZE TABLE wp_options;
-- 清理 transients 过期缓存
DELETE FROM wp_options WHERE option_name LIKE '_transient_timeout_%' AND option_value < UNIX_TIMESTAMP();
⚠️ 注意:
在执行任何数据库操作之前,务必备份完整数据库!建议使用 WP-CLI 命令
wp db export
导出备份。
🚀 第九部分:部署与 DevOps
🖥️
WP-CLI 命令行工具
WP-CLI 是 WordPress 的官方命令行工具,可以高效管理 WordPress 站点。
安装 WP-CLI
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar chmod +x wp-cli.phar sudo mv wp-cli.phar /usr/local/bin/wp
核心管理
wp core download
下载 WordPress
wp core install --url=example.com --title="Site" --admin_user=admin wp core update
更新核心
wp core version
查看版本
wp core verify-checksums
验证核心文件完整性
插件管理
wp plugin install woocommerce --activate
安装并激活插件
wp plugin update --all
更新所有插件
wp plugin list --status=active
列出激活的插件
wp plugin deactivate plugin-name
停用插件
主题管理
wp theme install flavor flavor
安装主题
wp theme activate flavor flavor
激活主题
wp theme update --all
更新所有主题
数据库管理
wp db export backup.sql
导出数据库
wp db import backup.sql
导入数据库
wp db optimize
优化数据库
wp db repair
修复数据库
wp db reset --yes
重置数据库(危险!)
缓存管理
wp cache flush
清除对象缓存
wp transient delete --all
删除所有瞬态缓存
搜索替换(迁移域名时使用)
wp search-replace 'old-domain.com' 'new-domain.com' --all-tables --dry-run wp search-replace 'old-domain.com' 'new-domain.com' --all-tables
用户管理
wp user create john john@email.com --role=editor --user_pass=pass123 wp user list --role=administrator wp user update admin --user_pass=newpass123
定时任务
wp cron event list
列出所有定时任务
wp cron event run --all
立即执行所有定时任务
wp cron event delete my_event
删除特定定时任务
生成虚拟数据(开发测试用)
wp post generate --count=100 --post_type=post wp user generate --count=50
🐳
Docker 容器化部署
docker-compose.yml 配置
version
:
'3.8'
services
:
wordpress
:
image
: wordpress:latest
ports
: -
"8080:80"
environment
: WORDPRESS_DB_HOST: db WORDPRESS_DB_USER: wp_user WORDPRESS_DB_PASSWORD: secure_password WORDPRESS_DB_NAME: wordpress
volumes
: - wp_data:/var/www/html - ./wp-content/themes/my-theme:/var/www/html/wp-content/themes/my-theme - ./wp-content/plugins/my-plugin:/var/www/html/wp-content/plugins/my-plugin
depends_on
: - db
restart
: always
db
:
image
: mysql:8.0
environment
: MYSQL_DATABASE: wordpress MYSQL_USER: wp_user MYSQL_PASSWORD: secure_password MYSQL_ROOT_PASSWORD: root_secure_password
volumes
: - db_data:/var/lib/mysql
restart
: always
redis
:
image
: redis:alpine
ports
: -
"6379:6379"
restart
: always
nginx
:
image
: nginx:alpine
ports
: -
"80:80"
-
"443:443"
volumes
: - wp_data:/var/www/html - ./nginx.conf:/etc/nginx/conf.d/default.conf - ./ssl:/etc/nginx/ssl
depends_on
: - wordpress
restart
: always
volumes
: wp_data: db_data:
Nginx 配置
server { listen 80; server_name example.com; root /var/www/html; index index.php index.html; # 上传大小限制 client_max_body_size 64M; # Gzip 压缩 gzip on; gzip_types text/css application/javascript application/json image/svg+xml; # 静态资源缓存 location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ { expires 1y; add_header Cache-Control "public, immutable"; } # WordPress 重写规则 location / { try_files $uri $uri/ /index.php?$args; } # PHP 处理 location ~ \.php$ { fastcgi_pass wordpress:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # 禁止访问敏感文件 location ~* /(?:uploads|files)/.*\.php$ { deny all; } location ~ /\.ht { deny all; } location ~ /wp-config\.php { deny all; } }
📚 第十部分:最佳实践与进阶技巧
📐
WordPress 编码规范
PHP 编码规范
// ✅ 正确
if
(
true
===
$is_valid
) {
return
; }
$name
=
'WordPress'
;
$greeting
=
"Hello, $name!"
;
// 需要变量解析时使用双引号
function
my_function
(
$arg1
,
$arg2
=
'default'
) {
// 函数体
}
// ✅ 正确的 DocBlock 注释
/** * 获取用户的头像 URL。 * * @since 1.0.0 * * @param int $user_id 用户 ID。 * @param string $size 头像尺寸。默认 'thumbnail'。 * @return string|false 头像 URL,失败时返回 false。 */
function
get_user_avatar_url
(
$user_id
,
$size
=
'thumbnail'
) {
// ...
}
命名约定
🧪
单元测试与代码质量
使用 PHPUnit 进行测试
<?php
class
My_Plugin_Tests
extends
WP_UnitTestCase
{
public function
setUp
():
void
{
parent
::
setUp
();
// 测试前的准备工作
}
public function
test_register_post_type
() {
register_portfolio_post_type
();
$this
->
assertTrue
(
post_type_exists
(
'portfolio'
)); }
public function
test_sanitize_input
() {
$dirty
=
'<script>alert("xss")</script>Hello'
;
$clean
=
sanitize_text_field
(
$dirty
);
$this
->
assertStringNotContainsString
(
'<script>'
,
$clean
); }
public function
test_custom_query
() {
// 创建测试文章
$post_id
=
$this
->
factory
->post->
create
(
array
(
'post_type'
=>
'portfolio'
,
'post_status'
=>
'publish'
, ));
$query
=
new
WP_Query
(
array
(
'post_type'
=>
'portfolio'
, ));
$this
->
assertTrue
(
$query
->
have_posts
()); }
public function
tearDown
():
void
{
// 测试后的清理工作
parent
::
tearDown
(); } }
开发工具推荐
🌍
国际化与本地化(i18n)
// 1. 基本翻译函数
__
(
'Hello World'
,
'my-plugin'
);
// 返回翻译字符串
_e
(
'Hello World'
,
'my-plugin'
);
// 直接输出翻译
esc_html__
(
'Hello'
,
'my-plugin'
);
// 返回并转义
esc_attr__
(
'Hello'
,
'my-plugin'
);
// 用于属性值
// 2. 带变量的翻译
printf
(
esc_html__
(
'Welcome, %s!'
,
'my-plugin'
),
esc_html
(
$username
) );
// 3. 单复数翻译
printf
(
_n
(
'%d item'
,
'%d items'
,
$count
,
'my-plugin'
),
$count
);
// 4. 带上下文的翻译
_x
(
'Post'
,
'noun'
,
'my-plugin'
);
// "Post" as noun
_x
(
'Post'
,
'verb'
,
'my-plugin'
);
// "Post" as verb
// 5. 生成 .pot 文件(使用 WP-CLI)
// wp i18n make-pot . languages/my-plugin.pot
翻译工作流
🎯
开发工作流与版本控制
推荐的 Git 工作流
.gitignore 示例
忽略 WordPress 核心文件(如果单独管理主题/插件)
wp-config.php wp-content/uploads/ wp-content/cache/ wp-content/backupwordpress-/ .sql .sql.gz .DS_Store Thumbs.db node_modules/ vendor/ .log
分支策略
main
生产环境
staging
预发布环境
develop
开发主分支
feature/*
功能分支
hotfix/*
紧急修复分支
release/*
发布准备分支
环境管理
| 环境 | 用途 | WP_DEBUG | 缓存 |
|---|---|---|---|
| Local(本地) | 开发调试 | true | 关闭 |
| Development | 功能测试 | true | 关闭 |
| Staging | 预发布验证 | false | 开启 |
| Production | 生产环境 | false | 开启 |
🆕
WordPress 2024-2026 新趋势
🎨
全站编辑(FSE)成熟化
Site Editor 功能越来越完善,传统主题开发逐步向块主题过渡
🤖
AI 集成
WordPress 核心和插件生态中 AI 功能快速增加(内容生成、SEO 优化等)
⚛️
Headless WordPress
使用 Next.js/Nuxt.js 等前端框架 + WP REST API/GraphQL 构建现代应用
📊
性能优先
Core Web Vitals 优化、Speculative Loading、AVIF 图片支持
🔐
安全增强
Passkeys 支持、更严格的权限控制、自动安全更新
📱
PWA 支持
渐进式 Web 应用功能逐步内置,提升移动端体验