跳到主内容

从零写你的第一个 WordPress 插件:短代码、钩子与激活逻辑

100%
从零写你的第一个 WordPress 插件:短代码、钩子与激活逻辑

一句话结论

写一个 WordPress 插件,最小成本就是「一个带插件头注释的 PHP 文件」:加一个 Plugin Name 头、用 add_shortcode() 暴露一个短代码、用 register_activation_hook() 处理启用时的初始化,就能在后台「插件」里出现并运行。本文带你从零捏出第一个能用的插件,并讲清钩子(hooks)与短代码的正确写法。

一、插件的基本形态

WordPress 插件本质上是一个带特定头注释的 PHP 文件。推荐做法是建一个以插件命名的文件夹,里面放主文件,避免和别的插件撞名:

wp-content/plugins/my-first-plugin/my-first-plugin.php

主文件顶部必须有插件头(只在一个文件里写):

/**
 * Plugin Name: My First Plugin
 * Description: 我的第一个 WordPress 插件
 * Version:     1.0.0
 * Author:      jin
 * License:     GPL-2.0-or-later
 */

保存后,后台「插件」列表就会多出这一项。仅此而已,一个插件就「存在」了。

二、用短代码输出内容

短代码(shortcode)是最快的「把动态内容塞进文章/页面」的方式。注册一个 [wporg] 标签:

add_action( 'init', 'myplugin_register_shortcodes' );
function myplugin_register_shortcodes() {
  add_shortcode( 'greet', 'myplugin_greet_shortcode' );
}
function myplugin_greet_shortcode( $atts = [], $content = null ) {
  $atts = shortcode_atts( array( 'name' => '访客' ), $atts, 'greet' );
  return '你好,' . esc_html( $atts['name'] ) . '!';
}
短代码回调只能 return 字符串,不能直接 echo。直接输出会导致内容跑到页面错误位置。这是新手最常踩的坑。

三、钩子:插件与 WordPress 对话的方式

WordPress 靠「钩子」在固定时机让你插入逻辑,分两类:

  • Action(动作):在某一时刻「做一件事」,如 init、wp_head。
  • Filter(过滤器):把一段内容「改完再还给系统」,如 the_content。

三个最基础的插件生命周期钩子:

register_activation_hook( __FILE__, 'myplugin_activate' );
register_deactivation_hook( __FILE__, 'myplugin_deactivate' );
register_uninstall_hook( __FILE__, 'myplugin_uninstall' );

分别在启用、停用、删除时触发,用来建默认选项、清临时数据、删干净自己留下的痕迹。

激活钩子里为什么不能直接 add_action?

注册激活钩子要在插件被包含之前完成,因此不能把它写进 plugins_loaded 或 init 内部;用 __FILE__ 作为第一参数是官方推荐写法,能正确拼出 activate_<插件路径> 这个动作名。

四、从零到上线的步骤


  1. 在 wp-content/plugins 下建文件夹 my-first-plugin,新建同名 PHP 主文件。

  2. 写入插件头注释(Plugin Name 必填),保存后到后台启用。

  3. 用 add_action(‘init’) 注册一个短代码,回调里 return 内容。

  4. 用 register_activation_hook 在启用时写入默认选项(如 update_option)。

  5. 在文章里写 [greet name=”小明”] 验证输出,确认无 PHP 报错。

相关阅读

官方文档:Plugin Basics

插件一定要放在自己的文件夹里吗?
单个 PHP 文件可以直接放 plugins 根目录(如 Hello Dolly),但多文件插件务必建文件夹,避免和其他插件文件名冲突、也方便管理。

短代码名字会被别的插件抢走吗?
会。标签名全局唯一,重复时「后加载的覆盖先加载的」。务必用带前缀的标签(如 myplugin_greet)降低冲突概率。

启用钩子能放数据库初始化吗?
可以,常见做法是启用时写入默认选项;但要结合 uninstall 钩子在删除时清理,否则会留下脏数据。

插件和主题里的 functions.php 有什么区别?
主题负责「展示」,插件负责「功能」。把功能写进插件,换主题时功能不丢——这是官方推荐的实践。

这篇有帮助吗?
云上的幻象
云上的幻象查看主页

七彩云博客,分享 WordPress 建站实战与 AI 工具测评,覆盖服务器运维、站长工具、软件资源与电商运营干货,专注原创实用的主题插件、网站加速与安全优化教程。

878文章4评论

相关文章

评论 (0)

欢迎你,新朋友,感谢参与互动!文明发言,理性交流 · 首次评论将在审核后展示