如何开发一个简单的wordpress插件?

这不是我第一次产生这种需求,之前也完成过一些简单插件的开发。因为针对Wordpress(包括php)的整个学习过程都是碎片化的,这导致去我对wordpress架构缺乏系统的认知,当然对php更是如此,我应该花时间认真去了解自己所使用的东西。今天关于插件开发的内容,我打算以一篇2021年1月份的教程开始吧,教程来自codeable,阅读原文可访问@https://www.codeable.io/blog/wordpress-plugin-development.

文章名为“A Step-By-Step Guide to WordPress Plugin Development (And Tips for Success!)”。开篇提到”Wordpress在2020年全球网站的应用率到达39.1%”,近似2/5,这确实是一个惊人的数字,这得益于Wordpress平台自身的种种优势,其中之一就是可高度定制化的插件(plugin)功能。文章中提到,php编程和sql查询是驱动wordpress的重要支撑,因此是进行plugin开发的必要背景知识。

WordPress插件开发需要知晓的几个基本概念:Hooks,Shortcodes,Widgets

Hooks直译成中文为“钩子”,钩子分为Actions和Filters两种类型。Actions用于在进程中的某个特定阶段产生作用,进一步说action本身就是一个进程,action钩子允许你在特定的操作中添加一个进程

An action is a process in WordPress. An action hook allows you to add a process.

在插件中使用Actions的好处之一就是你不用去修改Wordpress的核心代码(因为wordpress核心代码会时常更新,更新后的代码会覆盖掉你的修改,这样或增加维护难度)。Action的用法示例如下:

function custom_function( $post_id ) {
    //do something
}
add_action( 'save_post','custom_function' );

‘save_post’就是Wordpress中预置好的允许添加action的动作(操作)*,我们自己定义的custom_function将在save post的操作中添加一个进程。事实上,允许action这类钩子的动作都是Wordpress预置的,比如save,publish,update,delete等,这些基本上涵盖了可能的定制化需求,因此不建议也无法创建新的其他的自定义动作。Wordpress的开发手册中可以很容易查询到各种允许添加Action钩子的用法和示例。传送门:https://developer.wordpress.org/plugins/hooks/actions/

A filter is a hook that modifies a process. Filters help in manipulating existing data, without the need to alter its source.

而Filters则是用来调整(修改)一个进程,从产生过滤的作用而午休修改其来源。通常可以使用apply_filters(),他需要两个参数:filter名和要过滤的值。

echo apply_filters( 'filter_name','filter_variable' );

更进一步也可以使用add_filter()去创建一个自定义过滤器,他的结构如下:

function modify_value( $filter ) {
    //change $filter and return new value
}
add_filter( 'original_filter','modify_value' );

了解Wordpress Hook的相关知识最佳途径就是阅读Wordpress的开发手册,其陈述详尽且举例详实。接下来简单聊一下Short CodeWidget。Short Code在目前看来是一个过时的概念,Wordpress在Gutenburg之前使用的 wysiwyg编辑器叫做tinyMce,这是一款十分经典的富文本编辑器,几乎伴随了Wordpress前期阶段的十余年。通过在富文本编辑器中输入简短的代码和参数,就能够在前端获取想要的数据和功能。短代码简单如以下形式[hello_world_shortcode],将其放置入编辑器中单独一行并保存,就可以在前端观察到其显示效果。示例如下:

//Register shortcode
add_shortcode( 'hello_world_shortcode','hello_world_output' );

//define function to show output
function hello_world_output( $atts, $content = '', $tag ){
    $html = '';
    $html .= 'Hello World';
    return $html;
}

在Wordpress Gutenburg(block editor)编辑器替代TinyMce编辑器之后,短代码虽然依旧得到支持,但是基于Gutenburg越来越强的特性,很多功能需求可以通过对Gutenberg的开发而实现。尤其是在前后端分离的情况下,通过开发Gutenberg block进行输出要比用Short Code更易于支持。

和short code一样,Widget在Gutenberg出现之后也成为一个较为过时的理念,因为此二者主要注重于布局,在开发php主题的情况下运用的比较多,如果是前后端分离的情况,其实并不需要太多了解。不过本篇文章之前,我对widget的了解不多,本次阅读还是有新的认识:后续有机会好好了解一下这个WP_widget类.

WordPress has a WP_widget class in PHP, that you need to extend to create a widget for your plugin.

开发Wordpress插件的步骤

Step 1:定义需求

作为日常记录思考和情绪的载体,我希望尽可能简单地使用Wordpress. 对我来说,Wordpress平台的方便之处在于Block Editor作为出色的Mark down编辑工具使用,再者,Wordpress官方开发的App在iOS和Android平台都有良好的支撑,随手记个日记发着照片什么的简直不要太容易,再辅助以可定制化的界面UI,那些不想在朋友圈展示的内容可以轻而易举的Po到这里。

本次开发的主要需求是“自动化日记格式”(Auto-Diary)。我习惯在Wordpress移动端App上随时记录一些自己的想法,这些想法可能只有短短几个字而无需填写标题,也有可能在后续补充成长篇,但是在最初记录时要尽可能简单地专注于想法和内容,其实前端的操作就是新建按钮+图文输入+发布即可,不需要更为复杂的设置。

<?php 
/** 
 * Hello World 
 * 
 * @package HelloWorld 
 * @author Your Name
 * @copyright 2020 Your Name 
 * @license GPL-2.0-or-later 
 * 
 * @wordpress-plugin 
 * Plugin Name: Hello World 
 * Plugin URI: https://mysite.com/hello-world 
 * Description: Prints "Hello World" in WordPress admin. 
 * Version: 0.0.1 
 * Author: Your Name 
 * Author URI: https://mysite.com 
 * Text Domain: hello-world 
 * License: GPL v2 or later 
 * License URI: http://www.gnu.org/licenses/gpl-2.0.txt */
...
?>

因此这些想法会归入默认的分类中(uncategory),因此需要在后端

1、
2、Wordpressc插件开发的关键步骤
Step1:定义需求
Step2:建立Wordpress的


*允许日志在rest-api中显示
*图片圆角的幅度

*动作(操作),这可能并不是一个很贴切的术语,此处想表明的是,action钩子就是在做增删改查这些操作时嵌入的。