WordPress 插件编写光速入门

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>&nbsp&nbsp&nbsp&nbsp' . $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

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注