前言
wordpress插件开发知识点总结
- 核心:包括wp-admin/和wp-includes目录下的所有文件
- 主题:一般放在wp-content/theme目录下,负责控制WordPress站点的外观表现
- 插件:一般放在wp-content/plugins目录下,用来增强或改变WordPress功能
基础知识
插件
插件是扩展 WordPress 核心功能的代码包,WordPress插件由 PHP 代码和其他相关资源(如图像、CSS 和 JavaScript)组成。
插件实际上只需要一个主文件,在这个文件中,有特定格式的 DocBlock 作为文件头,包含 WordPress插件的一些信息,以便 WordPress 识别这个插件。
开发入门
- 切换到 WordPress 站点的 wp-content/plugins 目录
- 创建一个新目录,并将其命名为插件的名称,如(woo-bpay)
- 切换到你新建的目录
- 创建一个PHP文件(插件名称最好和目录名称保持一致。当然,其他名称也是可以的)
插件头注释
你好多莉的插件头部
<?php
/**
* @package Hello_Dolly
* @version 1.7.2
*/
/*
Plugin Name: Hello Dolly
Plugin URI: http://wordpress.org/plugins/hello-dolly/
Description: This is not just a plugin, it symbolizes the hope and enthusiasm of an entire generation summed up in two words sung most famously by Louis Armstrong: Hello, Dolly. When activated you will randomly see a lyric from <cite>Hello, Dolly</cite> in the upper right of your admin screen on every page.
Author: Matt Mullenweg
Version: 1.7.2
Author URI: http://ma.tt/
*/
钩子Action和Filter
WordPress 钩子可以让我们在特定的时机介入 WordPress 的代码执行流程,不需要编辑任何核心文件就可以改变 WordPress 的行为。
WordPress 中有两种类型的钩子,Action 和 Filter,Action 可以让我们添加或修改 WordPress 功能,而 Filter 可以让我们修改用户提交的或展示给用户的内容。
- register_activation_hook //激活插件时运行
- register_deactivation_hook //禁用插件时运行
- register_uninstall_hook //卸载插件时运行
实践
关于 WordPress插件开发的一些最佳实践,可以帮助我们在开发插件时更合理的组织代码。
避免命名冲突
当我们的插件和其他主题或插件使用了同一个函数或类名时,就会发生命名冲突。幸运的是,我们可以通过下面的方法来避免命名冲突。
为什么会冲突
默认情况下,所有变量、函数和类全部在全局命名空间中定义,也就是说,一个插件或主题可以覆盖另外一个插件的变量、函数和类(在函数或类中定义的变量不会被覆盖)。
为所有定义加上前缀
所有变量、函数和类都应该有一个唯一前缀,前缀可以帮助我们避免和其他插件使用同一个变量、函数和类名,也可以避免这些定义被其他插件或主题覆盖。
检查所有的定义
PHP 提供了许多函数来验证变量、函数、类和常量是否存在,如果这些定义存在,这些函数将返回 true
- 变量:isset()
- 函数: function_exists()
- 类: class_exists()
- 常量: defined()
<?php
//Create a function called wporg_init if it doesn't already exist
if ( !function_exists( 'wporg_init' ) ) {
function wporg_init() {
register_setting( 'wporg_settings', 'wporg_option_foo' );
}
}
//Create a function called wporg_get_foo if it doesn't already exist
if ( !function_exists( 'wporg_get_foo' ) ) {
function wporg_get_foo() {
return get_option( 'wporg_option_foo' );
}
}
- OOP面向对象编程
解决命名空间冲突更简单的办法是使用类来组织插件的代码,使用这个方法时,我们仍然需要检查类名是否已经被其他插件或主题使用,相对于非 OOP 变成来说,我们只需要检查类名即可。
<?php
if ( !class_exists( 'WPOrg_Plugin' ) ) {
class WPOrg_Plugin
{
public static function init() {
register_setting( 'wporg_settings', 'wporg_option_foo' );
}
public static function get_foo() {
return get_option( 'wporg_option_foo' );
}
}
WPOrg_Plugin::init();
WPOrg_Plugin::get_foo();
}
- 组织插件文件
插件根目录应该包含一个名为插件名称的 plugin-name.php 文件,如果需要在卸载时执行一些操作,还可以包含 uninstall.php 文件,其他文件尽可能组织到插件的子目录中,子目录名称应该尽量符合语义化规则。
目录结构
一个清晰的目录结构应该把类型或功能相似的文件保存在同一个目录中,下面是一个示例目录结构。
/ plugin-name
plugin-name.php
uninstall.php
/ languages
/ includes
/ admin
/ js
/ css
/ images
/ public
/ js
/ css
/ images
对于有大量代码的大型插件,我们应该参考上面的目录结构,把样式、JavaScript 脚本独立出来,实现插件功能的不同函数或类也尽量独立出来,放在单独的子目录,这将有助于保持插件代码清晰和长期维护。
按需加载
将插件的管理代码和公共代码分开是很有必要的,我们可以使用 WordPress 条件函数 is_admin 来实现,例如:
<?php
if ( is_admin() ) {
// we are in admin mode
require_once( dirname( __FILE__ ) . '/admin/plugin-name-admin.php' );
}
架构模式
虽然有很多结构模式,但是大体上可以分为 3 种:
- 单个文件,包含很多函数
- 单核插件文件,包含一个类,然后实例化这个类
- 有一个主插件文件,包含一个或多个类文件
更多
更多知识请访问: WordPress插件开发教程手册
评论 (0)