wordpress插件开发流程梳理
1.声明一个插件
首先我们必须明白,wordpress的插件可以是单文件,也可以是多文件,css/html都不是必须的,以下举例暂且在单文件模式下
比如我们要创建一个名为 hellophp的插件,那我们就需要在wp-content/plugins目录下新建hellophp文件夹和hellophp.php文件,但是这还是不能让系统识别这个插件。插件的主文件名要和目录一致。
在wordpress中,要让系统识别一个插件,首先要做的就是,声明一个DOCBLOCK(文档块)
示例:
wp-content/plugins/hellophp/hellophp.php
<?php
/**
* Plugin Name: hellophp
* Plugin URI: https://example.com/plugins/the-basics/
* Description: Basic WordPress Plugin Header Comment
* Version: 0.0.0
* Author: WordPress.org
* Author URI: https://author.example.com/
* License: GPL2
* License URI: https://www.gnu.org/licenses/gpl-2.0.html
* Text Domain: wporg
* Domain Path: /languages
*/
//完整的示例是这样,但是除了Plugin Name其他都不是必须的
2.初始化插件
wordpress-hook
- register_activation_hook( FILE, ‘pluginprefix_function_to_run’ ); //启用插件时的钩子
- register_deactivation_hook( FILE, ‘pluginprefix_function_to_run’ );//停用插件时的钩子
示例:
示例摘自官方文档,启动插件钩子最常见的用途之一是当插件注册自定义帖子类型时刷新WordPress永久链接。这摆脱了令人讨厌的404错误。
//启用插件时的处理
function pluginprefix_setup_post_type() {
// register the "book" custom post type
register_post_type( 'book', ['public' => 'true'] );
}
add_action( 'init', 'pluginprefix_setup_post_type' );
function pluginprefix_install() {
// trigger our function that registers the custom post type
pluginprefix_setup_post_type();
// clear the permalinks after the post type has been registered
flush_rewrite_rules();
}
register_activation_hook( __FILE__, 'pluginprefix_install' );
//停用插件时的处理
function pluginprefix_deactivation() {
// unregister the post type, so the rules are no longer in memory
unregister_post_type( 'book' );
// clear the permalinks to remove our post type's rules from the database
flush_rewrite_rules();
}
register_deactivation_hook( __FILE__, 'pluginprefix_deactivation' );
如果您不熟悉注册自定义帖子类型,请不要担心 - 稍后将对此进行介绍。使用这个例子只是因为它很常见。
注:这部分看不懂也没关系,这两个钩子也并不是必须的,如果你要做一些必要的前置工作,比如说启用插件时,创建一个新的数据表,初始化一些变量之类的前置操作来保证插件的正常运行,可以使用这个钩子,如果没有这样的操作,这个钩子不用也可以。
3.插件的卸载
从站点卸载插件时,您的插件可能需要进行一些清理。
如果用户已停用插件,则会认为已卸载插件,然后单击WordPress管理中的删除链接。
卸载插件时,您需要清除插件和/或其他数据库实体(如表)的任何插件选项和/或设置。
卸载插件有两种方法:
- 系统的钩子函数
register_uninstall_hook(__FILE__, 'pluginprefix_function_to_run');
- 自定义卸载脚本
uninstall.php
你需要在你插件的根目录创建一个uninstall.php文件
示例:
示例脚本演示了一个删除自定义表的清理工作。
// if uninstall.php is not called by WordPress, die
// 防止误操作直接访问该文件
if (!defined('WP_UNINSTALL_PLUGIN')) {
die;
}
$option_name = 'wporg_option';
//这两行是删除插件的一些附加配置,后边我会继续说这个
delete_option($option_name);
// for site options in Multisite
delete_site_option($option_name);
// drop a custom database table
global $wpdb;
$wpdb->query("DROP TABLE IF EXISTS {$wpdb->prefix}mytable");
这是wordpress插件开发流程梳理的第一篇,就先这样,后续会继续梳理。本文的示例和描述,大部分来自官方文档。
wordpress插件开发流程梳理的更多相关文章
- wordpress插件开发流程梳理-二
开发插件的最佳实践 避免命名冲突 当您的插件对变量,函数或类使用相同的名称作为另一个插件时,会发生命名冲突. 幸运的是,您可以使用以下方法避免命名冲突. 程序性 默认情况下,所有变量,函数和类都在全局 ...
- zookeeper心跳机制流程梳理
zookeeper心跳机制流程梳理 Processor链Chain protected void setupRequestProcessors() { RequestProcessor finalPr ...
- 黄聪:《跟黄聪学WordPress插件开发》
续<跟黄聪学WordPress主题开发>之后,又一个作品完成!<跟黄聪学Wordpress插件开发>,国内最好的Wordpress插件开发视频教程!! 目录预览: WordPr ...
- WORDPRESS插件开发(二)HELLO WORLD改进版
在上一篇文章中WORDPRESS插件开发(一)HELLO WORLD,演示了Hello World的最简单实现,只是在每篇文章的后面加入Hello World字符,而且字符也是写死的. 如果用户需要自 ...
- WORDPRESS插件开发学习(一)HELLO WORLD
WORDPRESS插件开发学习系列文章第一篇,在每篇文章的后面追加固定的字符“Hello World” 一.打开wordpress目录->wp-content->plugins 二.在pl ...
- 《WordPress插件开发手冊》文件夹
翻译前言:国内没有关于WordPress插件开发比較具体而且系统的资料 前言 第一章:准备一个本地开发环境 介绍 在你的电脑上安装一个站点server 下载并配置一个本地的WordPress 创建一个 ...
- Eureka服务端源码流程梳理
一.简述 spring cloud三步走,一导包,二依赖,三配置为我们简化了太多东西,以至于很多东西知其然不知其所以然,了解底层实现之后对于一些问题我们也可以快速的定位问题所在. spring clo ...
- .16-浅析webpack源码之编译后流程梳理
这节把编译打包后的流程梳理一下,然后集中处理compile. 之前忽略了一个点,如下: new NodeEnvironmentPlugin().apply(compiler); // 引入插件加载 i ...
- 北航操作系统实验2019:Lab4-1流程梳理
北航操作系统实验2019:Lab4-1流程梳理 前言 操作系统的实验课实在令人头秃.我们需要在两周时间内学习相关知识.读懂指导书.读懂代码.补全代码.处理玄学bug和祖传bug,以及回答令人窒息的思考 ...
随机推荐
- Python函数Day3
一.函数名的应用 函数名类似于特殊的变量,打印函数名就是打印函数的内存地址 ① 函数名就是函数的内存地址 def func(): pass >>>func <function ...
- 关于ubuntu软件图标的问题
原因是这样的,有一次我更新我的IDEA之后,程序图标就不见了. 怎么说呢,就是以下显示的这样. 在Frequent中显示正常, 在All中却没有!!! 是的,它就是在一边有一边没有... 奇了怪了. ...
- C#预处理器指令——学习
若要详细了解如何使用 C# 预处理器指令选择性地编译代码段,请参阅 #define(C# 参考)和 #if(C# 参考). #define(C# 参考) 地址:https://docs.microso ...
- Java8新特性--Optional
Java 8引入了一个新的Optional类.Optional类的Javadoc描述如下: 这是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会 ...
- 1. vue如何实现双向数据绑定
- go常量的定义和枚举类型
const a,b int = 1,2 const a,b = 1,2 const ( a = "hello" b,c =3,4 ) 常量数值可作为各种类型使用 枚举类型的 ...
- postgresql sql查询结果添加序号列与每组第一个序号应用
1.postgresql 查询每组第一个 ROW_NUMBER () OVER (partition by 字段 ORDER BY 字段 DESC) 写法:SELECT ROW_NUMBER ( ...
- 02_Tutorial 2: Requests and Responses 请求和响应
1.请求和响应 1.文档 https://www.django-rest-framework.org/tutorial/2-requests-and-responses/ https://q1mi.g ...
- 34、[源码]-AOP原理-链式调用通知方法
34.[源码]-AOP原理-链式调用通知方法
- 004_硬件基础电路_AD各层含义