WordPress插件设计

一、WordPress介绍

如果是Php开发的同学,或者对博客和CMS有一定了解的同学都知道这个,以下是百度的解释:

WordPress是一款个人博客系统,并逐步演化成一款内容管理系统软件,它是使用PHP语言和MySQL数据库开发的,用户可以在支持 PHP 和 MySQL数据库的服务器上使用自己的博客。WordPress有许多第三方开发的免费模板,安装方式简单易用。不过要做一个自己的模板,则需要你有一定的专业知识。比如你至少要懂的标准通用标记语言下的一个应用HTML代码、CSS、PHP等相关知识。WordPress官方支持中文版,同时有爱好者开发的第三方中文语言包,如wopus中文语言包。WordPress拥有成千上万个各式插件和不计其数的主题模板样式。 [1]

https://baike.baidu.com/item/...

WordPress也是支持插件的,因为最近在做插件系统的设计,所以想分析下它的插件设计思想。

二、插件分析

关于一个支持插件的系统应该具备哪些功能,前文已有说明,有兴趣的同学可以查看:**Discuz插件设计
**

先看下WordPress插件的基本结构:

WordPress插件都要放在wp-content/plugins目录下,每个插件为一个目录,每个目录下可以放readme.txt和LICENSE.txt等说明文件,然后有一个主文件,在上面官方的 akismet 插件中,主文件就是 akismet.php。

1、关于安装和反安装

WordPress中这两个概念比较淡,取而代之的是启用和禁用,因为默认插件是不启用的,反正只有一次执行机会,最终效果差不多,只要概念上保持一致。

register_activation_hook( __FILE__, array( 'Akismet', 'plugin_activation' ) );

启用是调用register_activation_hook函数,即注册钩子的方式实现;

禁用是调用register_deactivation_hook实现,原理同上。

当然也可以注册卸载的钩子:register_uninstall_hook

2、插件说明信息

这些通过在主文件的描述里表示:

/*
Plugin Name: Akismet Anti-Spam
Plugin URI: https://akismet.com/
Description: Used by millions, Akismet is quite possibly the best way in the world to protect your blog from spam. It keeps your site protected even while you sleep. To get started: activate the Akismet plugin and then go to your Akismet Settings page to set up your API key.
Version: 4.1.5
Author: Automattic
Author URI: https://automattic.com/wordpress-plugins/
License: GPLv2 or later
Text Domain: akismet
*/

具体含义就不在这里说明了,总的来说实现还是比较简单的,这需要审核插件的人或者系统能自动审核出来,不然就尴尬了。

3、插件配置

可以在后台自己加菜单

add_action('admin_menu', 'display_copyright_menu');

当然也可以在系统已经有设置界面里设置,可以参考函数 add_settings_field 。

4、注册api

想自己注册路由,在系统中添加新的api接口的话,WordPress也是支持的

add_rewrite_rule('post/([0-9a-zA-Z\-_,]+)/([0-9a-zA-Z\-_,]+)/page/?([0-9]{1,})/?$',

5、多语言支持

需要手动调用

load_plugin_textdomain('your-unique-name', false, basename( dirname( __FILE__ ) ) . '/languages' );

6、定制系统行为

系统已经定义了许多action和filter,如果对其中的某个点比较感兴趣,可以注册自己的回调。

add_action( 'wp_insert_comment', array( 'Akismet', 'auto_check_update_meta' ), 10, 2 );
add_filter( 'preprocess_comment', array( 'Akismet', 'auto_check_comment' ), 1 );
add_filter( 'rest_pre_insert_comment', array( 'Akismet', 'rest_auto_check_comment' ), 1 );

这里说下action和filter的概念 ,这2个是WordPress中使用最多的钩子,最终实现机制差不多,都是先声明,然后在代码中使用的地方调用相关回调/钩子,最后插件可以针对自己感兴趣的action/filter注册相关的回调。

再来说下两者在语义上的区别,action是实现一些额外的逻辑,而filter可能不产生新逻辑,只是在原有内容/结果上做一些过滤。

这么说可能比较抽象,我们举一些例子,如果我们实现了一个站内信的插件,希望在发完帖子之后给用户发送一条站内信,那这个最好用action的方式实现;

如果发完帖子之后我们想做下XSS检查,那最好是以filter的方式实现。

三、整体感受

整体来说,WordPress的插件做的是比较灵活的,通过观察者模式,通过钩子回调的方式,让插件可以快速、简单的关注自己感兴趣的扩充点,做到处处可扩展。

这需要系统设计者从全局去考虑系统有多少可以扩充的点,如果没有好的规范和监管,很可能会滥用,也有可能带来安全问题。

另外也增加开发者的维护成本,因为系统多少扩充点,如果没有很好的文档,那只能自己去搜索或者看源代码了。

当然这是一个权衡的考虑,在灵活性和稳定性如何选择,需要自己根据条件去做选择。

另外WordPress后台所有插件的代码都是可以编辑的,这就要求对代码目录开放写权限,这个很容易带来安全问题。

往期精选:

Discuz插件设计

OAuth2.0及Spring实现

故障演练利器之ChaosBlade介绍

扩展Redis:增加Redis命令

你可能感兴趣的:(wordpress,插件,插件化,php)