WordPress 插件编写光速入门
1 创建插件的步骤:
1)切换到 WordPress 站点根目录的 wp-content/plugins 目录;
2)创建一个新目录,并将其命名为插件的名称,如(plugin-name);
3)进入步骤 2)新建的目录,创建PHP 文件,文件命名最好和目录名一致(但没有硬性要求);
4)插件添加一个插件头注释,注释如下(按照自己插件具体修改)。
<?php
/*
Plugin Name: YOUR PLUGIN NAME
Plugin URI: https://developer.wordpress.org/plugins/the-basics/
Description: this is a test
Version: 0.9.1
Author: YOUR NAME
Author URI: https://developer.wordpress.org/
*/
到此,到wordPress 后台刷新,就可以看到所创建的插件了。
需要注意的是,如果创建的插件需要多个php 文件,只要一个php 文件包含插件头注释就可,否则 WordPress 会认为它是两个插件。
插件的加载逻辑,WordPress 会搜索 wp-content/plugins 目录及其子目录,来查找带有 WordPress 插件头文件的 PHP 文件,如果我们的插件只是一个 PHP文件,也可以不创建独立一个文件中,而直接把这个文件放在 wp-content/plugins 也行。但为了方便维护和扩充,一般新建一个目录来存放,并且后续扩充时候安装标准的目录结构来布局。
2 插件创建需要用到的三个钩子函数
register_activation_hook()
register_deactivation_hook()
register_uninstall_hook()
由名字容易得知:register_activation_hook 为插件被启用时候运行,register_deactivation_hook 是插件禁用时候运行,register_uninstall_hook 是插件被卸载时候运行。
function wp_your_code_activate() {
// codes
}
function wp_your_code_deactivate() {
// codes
}
function wp_your_code_uninstall() {
// codes
}
register_activation_hook( __FILE__, "wp_your_code_activate");
register_deactivation_hook( __FILE__, "wp_your_code_deactivate");
register_uninstall_hook( __FILE__, "wp_your_code_uninstall");
如果在插件加载和卸载时候,没有一些初始化和清理工作,这几个不写也是可以的,按需选择填写就可以了。
3 WordPress 内核交互的 Hook——Action和Filter
定制WordPress时候,我们需要先编写一个自定义函数作为钩子的回调函数,可以使用 add_action 或 add_filter 函数将我们的回调函数挂载到指定的 Action 或 Filter 上。可以简单的理解为:Action 是用来添加功能,而Filter 是用来修改数据。
例如我们若想把wp 的文章的title 变成红色显示,可以:
add_filter('the_title', function($title) {
// Make any changes here
$title = '<font color="red">' . $title . ' </font>';
return $title;
});
WordPress 的过滤构造好几百个,根据自己的需要查阅文档定制过滤就可。add_action和add_filter用法类似,但实质上add_action就是直接调用add_filter来实现的。
4 一个简单的实例
之前写过一遍《WORDPRESS 过滤垃圾评论》,是直接修改 wp 源代码来实现的,但是每次升级WordPress后,这些代码会被覆盖,得重新把代码整理回来,每次都这样弄实为烦恼,干脆把它整理为一个插件,省事,而且也方便做扩充。
<?php
/*
Plugin Name: Yuccn Comment Mini Fitering
Plugin URI: http://wordpress.org/plugins/yuccn-comment-mini-filtering/
Description: The simplest comment filtering
Version: 0.9.1.0
Author: Yuccn
Author URI: https://blog.yuccn.net/
Text Domain: yuccn-comment-mini-filtering
Copyright (C)2020 Yuccn
*/
function wp_yuccn_comment_filtering_code_activate(){
}
function wp_yuccn_comment_filtering_code_deactivate(){
// $wpfc = new WpYuccnCommentMiniFiltering();
}
register_activation_hook( __FILE__, "wp_yuccn_comment_filtering_code_activate");
register_deactivation_hook( __FILE__, "wp_yuccn_comment_filtering_code_deactivate");
class WpYuccnCommentMiniFiltering{
public function __construct(){
add_filter('comment_form_default_fields', array($this, 'onCommentFormDefaultFields'));
add_filter('preprocess_comment', array($this, 'onPreprocessComment'));
}
public function onCommentFormDefaultFields($fields) {
if (!$this->needCheckAuthCode()) {
return $fields;
}
$rand1 = rand(11,99);
$rand2 = rand(11,99);
$fields['code']='<p><label for="code">验证码<span class="required">*</span>    ' . $rand1 . '+' . $rand2 . '=? </label> <input id="code" name="code" type="text" placeholder="输入上面算术结果" size="30" maxlength="100" aria-describedby="code-notes" required=\'required\' /><input type="hidden" id="hcode" name="hcode" size="30" maxlength="100" value=' . ($rand1 + $rand2) . ' /></p>';
return $fields;
}
public function isCommentTooLong($comment_text) {
return mb_strlen($comment_text, 'utf8') > 1024;
}
public function onPreprocessComment($comment) {
if(is_user_logged_in() && !$this->needFilterLoginUser()){
// 已经登陆,并且不检查登陆用户
return $comment;
}
if ($this->isCommentTooLong($comment['comment_content'])) {
error_log("comment too long, comment:" . $comment['comment_content']);
wp_die('内容超长,请精简后再试试!');
return;
}
// 是否仅允许纯英文
if (!$this->isAllowOnlyEnglish()) {
$pattern = '/[一-龥]/u';
if (!preg_match($pattern, $comment['comment_content'])) {
error_log("comment not include Chinese word, comment:" . $comment['comment_content']);
wp_die('不支持纯英文留言(input Chinese word!)');
return;
}
}
// 检测是否是垃圾信息
if ($this->isInRubbish($comment)) {
error_log("rubbish comment:" . $comment['comment_content']);
header("Content-type: text/html; charset=utf-8");
wp_die('您评论包含辱骂,过激或其他原因,违反博客评论规则,如有疑问请联系管理员处理!返回文章页');
return;
}
// 检测验证码
if ($this->needCheckAuthCode()) {
$error = $this->checkAuthCode();
if (!empty($error)) {
error_log("checkAuthCode error:" . $error . ", comment:". $comment['comment_content']);
wp_die($error);
return;
}
}
return $comment;
}
private function isInRubbish($comment) {
return wp_blacklist_check($comment['comment_author'],
$comment['comment_author_email'],
$comment['comment_author_url'],
$comment['comment_content'],
$comment['comment_author_IP'],
$comment['comment_agent']);
}
private function isAllowOnlyEnglish() {
// 是否允许纯英文
return false;
}
private function needFilterLoginUser() {
// 预留接口,是否检测已经登陆了的用户的信息
return false;
}
private function needCheckAuthCode() {
// 预留接口,是否检测验证码
return true;
}
private function checkAuthCode() {
$code = (isset($_POST['code'])) ? $_POST['code'] : null;
$hcode = (isset($_POST['hcode'])) ? $_POST['hcode'] : null;
if (empty($code)) {
return "错误: 请输入验证码";
}
if ($code != $hcode) {
return "错误: 验证码不正确";
}
return "";
}
}
$GLOBALS["wp_yuccn_comment_filtering_code"] = new WpYuccnCommentMiniFiltering();
?>
5 更多更深入插件,得查阅 wp 开发文档。
(全文完)
(欢迎转载本站文章,但请注明作者和出处 云域 – Yuccn )