用途
本技能面向 WordPress 插件开发,讲解如何使用现代 PHP 8.3+ 实践、面向对象架构、Composer 自动加载以及 WordPress 6.7+ API 来构建安全、可维护的插件。内容围绕插件的结构组织、钩子集成、数据库管理与设置页面展开。
当前标准
- WordPress:6.7+(全站编辑稳定)
- PHP:推荐 8.3(最低 7.4)
- 架构:面向对象,采用 PSR-4 自动加载
- 安全:三层模型(清理、验证、转义)
- 测试:PHPUnit + WPCS 合规
安装
composer require --dev wp-coding-standards/wpcs:"^3.0"
composer require --dev phpunit/phpunit:"^9.6"
插件架构
目录结构
采用 Composer 自动加载的现代插件组织方式:
my-plugin/
├── my-plugin.php # 主插件文件(元数据头)
├── composer.json # 依赖管理(必需)
├── includes/ # 核心业务逻辑(PSR-4 自动加载)
│ ├── Core.php # 插件引导/加载类
│ ├── Admin/ # 管理端功能
│ │ ├── Settings.php
│ │ └── MetaBoxes.php
│ ├── Frontend/ # 面向公众的功能
│ │ └── Shortcodes.php
│ └── API/ # REST API 端点
│ └── CustomEndpoint.php
├── assets/ # CSS、JS、图片
│ ├── css/
│ ├── js/
│ └── images/
├── languages/ # 翻译文件
├── tests/ # PHPUnit 测试
│ ├── unit/
│ ├── integration/
│ └── bootstrap.php
├── .phpcs.xml.dist # PHP_CodeSniffer 配置(WPCS)
└── README.md
主插件文件
主插件文件包含插件元数据头、安全防护(阻止直接访问)、插件常量定义、Composer 自动加载引入,以及激活/停用钩子。示例中通过 plugins_loaded 钩子初始化核心类,并在激活与停用时调用相应处理类并刷新重写规则。
核心插件类(单例模式)
includes/Core.php 使用单例模式确保插件只有一个实例。构造函数中依次加载依赖、定义钩子、加载文本域。define_hooks() 注册 init、admin_menu、admin_enqueue_scripts、wp_enqueue_scripts、rest_api_init 等钩子。类中还包含注册自定义文章类型(如 book)、自定义分类法(如 genre)、注册管理菜单、渲染设置页面、按需加载管理端与前端资源、注册 REST 路由等方法。
Composer 配置
composer.json 声明插件类型为 wordpress-plugin,要求 PHP >=8.1,开发依赖包括 WPCS、PHPUnit 与 yoast/phpunit-polyfills,并配置 PSR-4 自动加载映射 MyPlugin\ 到 includes/,同时提供 phpcs、phpcbf、test 脚本。
钩子系统
动作与过滤器对比
- 动作(Actions):在特定点执行代码,无返回值,使用
do_action()/add_action(),例如发送邮件、记录事件、注册自定义文章类型。 - 过滤器(Filters):在使用/输出前修改数据,必须返回值,使用
apply_filters()/add_filter(),例如修改文章内容、过滤查询。
常见动作
init:注册文章类型、分类法、重写规则。plugins_loaded:在所有插件加载后初始化插件。wp_enqueue_scripts:加载前端 CSS/JS。admin_enqueue_scripts:加载管理端 CSS/JS,可按页面钩子限定加载范围。save_post:文章保存/更新时运行,示例中包含 nonce 验证、自动保存检查、权限检查与元数据保存。
常见过滤器
the_content:输出前修改文章内容,示例添加预计阅读时间,并强调必须返回内容。pre_get_posts:执行前修改 WP_Query,示例调整归档页每页数量与排序。excerpt_length:修改摘要字数。
钩子优先级与执行顺序
优先级范围 1-999,默认 10,数字越小越早执行。可通过 remove_action / remove_filter 移除钩子。
创建自定义钩子
- 自定义动作:通过
do_action( 'my_plugin_order_processed', $order_id, $order_data )暴露扩展点,其他开发者可用add_action挂接。 - 自定义过滤器:通过
apply_filters( 'my_plugin_product_price', $price, $product_id )允许修改价格,示例中通过过滤器实现会员折扣。
数据库交互
使用全局 $wpdb 对象,并通过 $wpdb->prepare() 编写预处理语句以防止 SQL 注入。示例涵盖 get_results、get_row、get_var 等查询方法,均配合占位符(如 %d、%s)使用。
适用场景
适合需要按现代标准开发 WordPress 插件的开发者,尤其是希望采用面向对象架构、Composer 自动加载、规范钩子集成与安全数据库访问的项目。
限制
资料未提供关于收费、价格、平台支持范围、实际效果或具体使用步骤的更多信息,相关内容暂未提供。