WordPress插件开发介绍
什么是Wordpress插件
WordPress有三大组件,核心、主题和插件。
WordPress插件是由 PHP,图像,CSS,HTML,JavaScript组成的,它主要作用是扩展Wordpress的功能,比如你想用Wordpress当一个论坛(原Wordpress是没有论坛功能的),你可以自己写个插件,在初始化时创建论坛对应的表,写一些模板文件来管理论坛,操作这些表,这就是插件。
当然你也可以写一些简单的插件,比如说文章图片放大功能,就只是在触发某个钩子是执行一段JavaScript代码即可。
为什么要开发Wordpress插件
有些Wordpress主题里也有不少扩展功能,但是为什么要把它们抽离出来做为插件呢?主要是以下三点:
- 不改变 WordPress内核:Wordpress是有一些核心文件的,它们会随着版本的升级而变动,而插件则是单独出来的,做出来的功能是不会影响核心代码的。
- 开发简单:最简单的Wordpress插件无非就是新建一个PHP文件,写上特定的声明头,就可以使用了。
- 市场很大:做出来的插件可以放到Wordpress插件市场上,由于Wordpress用户众多,说不定会有很多人使用你做的插件呢。
WordPress插件开发基础
快速创建一个插件
- 切换到 WordPress 站点的 wp-content/plugins 目录
- 创建一个新目录,并将其命名为插件的名称,如(plugin-name)
- 切换到你新建的目录
- 创建一个 PHP 文件(插件名称最好和目录名称保持一致。当然,其他名称也是可以的)
- 写入特定的声明头,就可以在后台的插件列表中显示了。
<?php
/*
Plugin Name: PLUGIN NAME
*/
插件头文件属性
- Plugin Name:(必需)你的插件名称,会显示在 WordPress 后台的插件列表中。
- Plugin URI:插件主页,应该是唯一的URL,最好在你自己的网站上。对于你的插件来说,必须是独一无二的,不能使用 WordPress.org 上的网址。
- Description:插件的简短描述,在 WordPress插件管理界面显示,不要超过 140 个字符。
- Version:插件的当前版本号,例如 1.0 或 1.0.3。
- Author:插件作者名字,如果插件有多个作者,作者之间可以使用逗号分隔开。
- Author URI:作者网站或其他网站上的个人资料,如 WordPress.org。
- License URI:许可证的全文链接。
- Text Domain:插件的 Gettext 文本域。
- Domain Path:域名路径告诉 WordPress 在哪里可以找到翻译。
插件架构模式
WordPress插件虽然有很多结构模式,但是大体上可以分为 3 种:
- 单个文件,包含很多函数
- 单核插件文件,包含一个类,然后实例化这个类
- 有一个主插件文件,包含一个或多个类文件
插件钩子的激活和禁用
使用 register_activation_hook
激活一个插件,设置一个回调函数:
register_activation_hook( __FILE__, 'pluginprefix_function_to_run' )
使用 register_deactivation_hook
禁用一个插件,设置一个回调函数:
register_deactivation_hook( __FILE__, 'pluginprefix_function_to_run' );
插件的卸载
如果我们的插件添加了一些设置到数据库中,或者在用户使用插件时生成了一些缓存文件,当用户卸载插件时,这些设置和文件很可能已经没用了。我们需要在用户卸载插件时删除这些数据。下面的表格说明了停用和卸载钩子之间的区别。
卸载的两种方法:
- 使用
register_uninstall_hook
,设置一个回调函数。 - 使用
uninstall.php
文件,插件卸载时会自动运行。
WordPress插件安全
检查用户能力
这里要特别提醒写插件的小伙伴,检查用户能力这个点很重要,如果你不注意的话会导致难以挽回的结果,比如说你写了个在前端删除文章的插件,如果不检查用户是否管理员或者是对应能力,普通用户登录也可以删除你的文章,这就糟糕了。
用户角色超高,能力就越多,越高的角色会自动拥有比他小的角色的所有能力,限制角色操作就显得非常有必要了。
数据验证
数据验证是指根据预定义的一个或多个规则分析数据的过程,数据验证结果只有两个,有效或无效。数据验证经常用于处理外部传输进来的数据,如用户输入和通过 API 调用的 Web 服务数据。
数据验证的简单例子:
- 检查必须字段是否为空
- 检查输入的电话号码是否只包含数字和符号
- 检查邮编是否为有效的邮政编码
- 检查数量字段是否大于 0
- 检查 Email 是否为有效的 Email 地址
PHP有一些内置函数可以做一些基本的数据验证:
- isset() 和 empty() 可以用来检查一个变量是否存在
- mb_strlen() 或者 strlen() 可以用来检查一个字符串长度是否符合要求
- preg_match(),strpos() 用于检查字符串中是否包含某些指定的字符串
- count() 用于检查数组中有多少元素
- in_array() 用于检查数组中是否存在某元素
WordPress核心也有一些验证函数:
- is_email() 验证电子邮件地址是否有效。
- term_exists() 检查分类项目是否存在。
- username_exists() 检查用户名是否存在
- validate_file() 检查输入的文件路径是不是一个真实的路径(不是检查文件是否存在)’
除了内置的一些数据验证的函数,我们也可以自定义验证,它最好遵循为 is_
开发命名的原则。
安全输入
保证安全输入是对用户输入的数据进行清理(净化、过滤)的过程。比如说它可以抵御一些基本的 xss 攻击。
安全输出
安全输出是转义数据输出的过程。
一些转义函数:
- esc_html()
- esc_url()
- esc_js()
- esc_attr()
本地化的转义函数:
- esc_html __()
- esc_html_e()
- esc_html_x()
- esc_attr__()
- esc_attr_e()
- esc_attr_x()
也可以定义自定义转义函数:
$allowed_html = [
'a' => [
'href' => [],
'title' => [],
],
'br' => [],
'em' => [],
'strong' => [],
];
echo wp_kses( $custom_content, $allowed_html );
WordPress简码
什么是简码
简码是用于动态添加内容的代码,使用简码,我们可以在文章中动态的创建相册、播放视频,插入表单或者实现更多的自定义操作。
为什么使用简码
- 保持文章内容的干净且语义化
- 扩展性强,支持接受参数
WordPress内置简码
- caption – 为图片或视频添加说明的简码
- gallery – 显示相册的简码
- audio – 嵌入和播放音频文件的简码
- video – 嵌入和播放视频文件的简码
- playlist – 显示音频或视频文件的简码
- embed – 显示嵌入式内容的简码
WordPress简码API
添加简码
<?php
add_shortcode(
string $tag,
callable $func
);
删除简码
<?php
remove_shortcode(
string $tag
);
判断简码是否存在
shortcode_exists(string $tag)
WordPress设置选项
为了使管理界面易于构建,安全,并在设计上和 WordPress 管理界面保持一致,WordPress 提供了设置API和选项API。
为什么使用设置API
- 视觉一致性
- 健壮性(面向未来)
- 底层优化
设置API
添加设置
register_setting(
string $option_group,
string $option_name,
callable $sanitize_callback = ''
);
添加分节
add_settings_section(
string $id,
string $title,
callable $callback,
string $page
);
获取设置
get_option(
string $option,
mixed $default = false
);
选项API
选项 API 可以让我们添加、获取、更新和删除 WordPress 选项,结合设置 API,我们可以控制设置页面中的自定义选项。
存储选项,单个值
<?php
// add a new option
add_option('wporg_custom_option', 'hello world!');
// get an option
$option = get_option('wporg_custom_option');
存储选项,多个值
<?php
// array of options
$data_r = ['title' => 'hello world!', 1, false];
// add a new option
add_option('wporg_custom_option', $data_r);
// get an option
$options_r = get_option('wporg_custom_option');
// output the title
echo esc_html($options_r['title']);
更多选项API:
- add_option()
- add_site_option()
- get_option()
- get_site_option()
- update_option()
- update_site_option()
- delete_option()
- delete_site_option()
WordPress元数据
什么是元数据
文章、用户、评论和分类法项目的附加信息。
元数据API
- add_post_meta()
- update_post_meta()
- delete_post_meta()
自定义元数据盒子
文章编辑界面的盒子元素,可以是表单或任何HTML。
它的作用是增强编辑页面功能,并且它非常灵活和定制化强。
- add_meta_boxes()
- remove_meta_boxes()
自定义文章类型
可以单独管理自定义文章,为自定义文章添加不一样的模板。
使用 register_post_type
注册自定义文章类型:
function wporg_custom_post_type() {
register_post_type( 'wporg_product',
[
'labels' => [
'name' => __( 'Products' ),
'singular_name' => __( 'Product' ),
],
'public' => true,
'has_archive' => true,
]
);
}
add_action( 'init', 'wporg_custom_post_type' );
自定义分类方法
自定义分类方法可以让我们独立管理“分类目录”和“标签”,在不同Wordpress网站上重复使用。
它的显示位置与文章分类,标签位置一样。
下面创建一个自定义分类方法“课程”的插件:
/*
* Plugin Name: Course Taxonomy
* Description: A short example showing how to add a taxonomy called Course.
* Version: 1.0
* Author: developer.wordpress.org
* Author URI: https://codex.wordpress.org/User:Aternus
*/
function wporg_register_taxonomy_course() {
$labels = [
'name' => _x( 'Courses', 'taxonomy general name' ),
'singular_name' => _x( 'Course', 'taxonomy singular name' ),
'search_items' => __( 'Search Courses' ),
'all_items' => __( 'All Courses' ),
'parent_item' => __( 'Parent Course' ),
'parent_item_colon' => __( 'Parent Course:' ),
'edit_item' => __( 'Edit Course' ),
'update_item' => __( 'Update Course' ),
'add_new_item' => __( 'Add New Course' ),
'new_item_name' => __( 'New Course Name' ),
'menu_name' => __( 'Course' ),
];
$args = [
'hierarchical' => true, // make it hierarchical (like categories)
'labels' => $labels,
'show_ui' => true,
'show_admin_column' => true,
'query_var' => true,
'rewrite' => [ 'slug' => 'course' ],
];
register_taxonomy( 'course', [ 'post' ], $args );
}
add_action( 'init', 'wporg_register_taxonomy_course' );
在后台启用插件,新建一篇文章,就可以看到右侧有 Courses
的卡片,和分类标签一样。
WordPress用户、角色和能力
WordPress用户是由用户名,密码,电子邮箱构成的,每个用户都会被分配一个角色,每个角色都会有一些能力。
WordPress 遵守最少能力原则,即只赋予用户执行操作所需要的必不可少的能力的做法。
操作用户API
创建用户
wp_create_user(
string $username,
string $password,
string $email = ''
);
插入用户
wp_insert_user(
array|object|WP_User $userdata
);
更新用户
wp_update_user(
mixed $userdata
);
删除用户
wp_delete_user(
int $id,
int $reassign = null
);
用户元数据操作API
添加用户元数据
add_user_meta(
int $user_id,
string $meta_key,
mixed $meta_value,
bool $unique = false
);
更新用户元数据
update_user_meta(
int $user_id,
string $meta_key,
mixed $meta_value,
mixed $prev_value = ''
);
删除用户元数据
delete_user_meta(
int $user_id,
string $meta_key,
mixed $meta_value = ''
);
获取用户元数据
get_user_meta(
int $user_id,
string $key = '',
bool $single = false
);
WordPress用户角色与能力
默认情况下,WordPress 有 6 个角色。
- 超级管理员
- 管理员
- 编辑
- 作者
- 投稿者
- 订阅用户
相关API
- add_role()
- remove_role()
- get_role()
- add_cap()
- user_can()
- current_user_can()
- current_user_can_for_blog()
评论(0)