快速学习WordPress 插件开发

wordpress插件开发思维导图

WordPress插件开发介绍

什么是Wordpress插件

WordPress有三大组件,核心、主题和插件。

WordPress插件是由 PHP,图像,CSS,HTML,JavaScript组成的,它主要作用是扩展Wordpress的功能,比如你想用Wordpress当一个论坛(原Wordpress是没有论坛功能的),你可以自己写个插件,在初始化时创建论坛对应的表,写一些模板文件来管理论坛,操作这些表,这就是插件。

当然你也可以写一些简单的插件,比如说文章图片放大功能,就只是在触发某个钩子是执行一段JavaScript代码即可。

为什么要开发Wordpress插件

有些Wordpress主题里也有不少扩展功能,但是为什么要把它们抽离出来做为插件呢?主要是以下三点:

  1. 不改变 WordPress内核:Wordpress是有一些核心文件的,它们会随着版本的升级而变动,而插件则是单独出来的,做出来的功能是不会影响核心代码的。
  2. 开发简单:最简单的Wordpress插件无非就是新建一个PHP文件,写上特定的声明头,就可以使用了。
  3. 市场很大:做出来的插件可以放到Wordpress插件市场上,由于Wordpress用户众多,说不定会有很多人使用你做的插件呢。

WordPress插件开发基础

快速创建一个插件

  1. 切换到 WordPress 站点的 wp-content/plugins 目录
  2. 创建一个新目录,并将其命名为插件的名称,如(plugin-name)
  3. 切换到你新建的目录
  4. 创建一个 PHP 文件(插件名称最好和目录名称保持一致。当然,其他名称也是可以的)
  5. 写入特定的声明头,就可以在后台的插件列表中显示了。
<?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()

本文系作者 @ 原创发布在 极客猿小兵的博客。未经许可,禁止转载。


极客猿小兵 » 快速学习WordPress 插件开发

发表回复