WordPress插件提交到官方插件目录

网上关于WordPress插件提交官方目录的教程,多是罗列手册内容的空架子,缺乏实际操作细节,开发者往往看完仍不知如何下手。我亲测完成插件上传后,整理这份指南,从前期准备到插件规范,再到SVN管理,每一步都带实操要点,帮你避开坑点,高效推进插件提交

网上能搜到的教程都是废话连篇,或是没有实际操作的SEO文章,内容跟手册列表似的,只能自己琢磨了。总之,我制作的插件也是上传成功了,在我博客分享一下经验。

你需要做的准备

1.你域名的邮箱,这个并不难,企业微信,钉钉等都可以使用自己的域名作为邮箱,不能使用QQ等三方邮箱。用自己域名,比如我的域名邮箱:[email protected]

2.注册一个你的WordPress账号,并绑定域名邮箱:https://login.wordpress.org/register?locale=zh_CN

3.为WordPress账号开启2FA验证

进入用户中心

图片[1]-WordPress插件提交到官方插件目录-王先生笔记

添加双因素验证软件,用软件扫码,填一下验证码就可以了,安卓有:Google身份验证器账户本子,苹果有:authenticator-身份验证器-身份验证

图片[2]-WordPress插件提交到官方插件目录-王先生笔记

4.SVN桌面可视化软件:https://tortoisesvn.net/downloads.zh.html

你需要下载安装本体语言包

图片[3]-WordPress插件提交到官方插件目录-王先生笔记

安装主体时,注意勾选command line client tools,命令行工具是必不可少的

图片[4]-WordPress插件提交到官方插件目录-王先生笔记

安装后重启电脑,使右键菜单生效,右键任意一个文件夹,找到该软件的设置,可以设置语言,网络(得设置,如果插件大,上传会很慢,也会网络错误)等

图片[5]-WordPress插件提交到官方插件目录-王先生笔记

WordPress插件规范

这里只讲重点

详细的要求,你应该查看去看看:WordPress详细的插件指南(中文)

插件目录结构

your-pro-plugin/  # 插件根目录(例:wxs-text-watermarking,它应该和多语言文本域,插件主文件名一致)
├── your-pro-plugin.php  # 主插件文件(入口文件,负责初始化、钩子注册,它应该和多语言文本域,插件根目录名一致)
├── readme.txt  # 插件说明文档
├── LICENSE  # 开源协议文件(例:GPL2)
├── uninstall.php  # 插件卸载清理文件(删除选项、数据表等,可选但推荐)
├── includes/  # 核心逻辑目录(存放公共功能、核心类/函数)
│   ├── class-plugin-core.php  # 插件核心类(初始化、全局配置)
│   ├── class-custom-post-type.php  # 自定义文章类型注册类
│   ├── class-shortcodes.php  # 短代码功能类
│   └── functions-helper.php  # 辅助函数文件(公共工具函数)
├── admin/  # 后台专属目录(仅管理员可见,存放后台样式、脚本、页面)
│   ├── css/
│   │   └── admin-style.css  # 后台样式文件
│   ├── js/
│   │   └── admin-script.js  # 后台脚本文件
│   ├── class-admin-settings.php  # 后台设置页面类(注册设置、字段)
│   └── templates/  # 后台模板目录(存放后台页面HTML结构)
│       └── settings-page.php  # 后台设置页面模板
├── public/  # 前台专属目录(普通用户可见,存放前台样式、脚本、逻辑)
│   ├── css/
│   │   └── public-style.css  # 前台样式文件
│   ├── js/
│   │   └── public-script.js  # 前台脚本文件
│   ├── class-public-display.php  # 前台展示逻辑类
│   └── templates/  # 前台模板目录(存放前台输出HTML结构)
│       └── content-template.php  # 前台内容展示模板
└── languages/  # 国际化语言目录(存放.po/.mo语言文件)如果要做多语言,这个目录都没必要添加
    ├── your-pro-plugin-zh_CN.po  # 中文翻译源文件
    └── your-pro-plugin-zh_CN.mo  # 中文翻译编译文件

插件主文件的注释

你的插件主文件的注释应该是这样的,#号后是我在站中加的注释,无需添加到插件注释中

<?php
/**
 * Plugin Name: Wxs Text Watermarking #插件名称,可中文,需要和readme.txt中的插件名一致,我建议你不要做多语言,直接中文就好,因为要做多语言,代码中文字原版必须是英文,还要申请自己插件的翻译权限,你说离谱吗
 * Plugin URI: https://wordpress.org/plugins/wxs-text-watermarking/ #上传到官方插件目录后,如果站点可链接WP插件目录,这个就没意义了
 * Description: Add blind watermark to article content, support multiple insertion methods and custom configurations, filter UA whitelist #插件的描述,这个也是可以被翻译的哦,如果你做多语言这里必须是英文
 * Requires at least: 6.3 #最低支持的WP版本
 * Requires PHP: 7.4 #最低支持的PHP版本
 * Version: 1.1.2 #当前插件版本
 * Author: twsh0305 #建议WP官网用户名 这个也是可以翻译的
 * Author URI: https://wxsnote.cn #作者地址
 * License: GPLv2 or later #开源协议,GNU通用公共许可证或更高
 * License URI: https://www.gnu.org/licenses/gpl-2.0.html #开源协议地址
 * Text Domain: wxs-text-watermarking #文本域,用来给多语言服务的,应当和,如果不做多语言,这个没有用
 * Domain Path: /languages #域目录,就是指定插件目录哪个文件是放置翻译文件的,不做多语言这个也没用
 */

readme.txt文件的编写

自述文件也有规范,在你编写好后需要验证一下是否正确

生成自述文件:https://generatewp.com/plugin-readme/

=== Wxs Text Watermarking插件名,需要和插件注释名一致 ===
Contributors: 贡献者wordprss账号(如我的是twsh0305)
Donate link: https://wxsnote.cn/zanzhu(赞助地址)
Tags: blind, watermark, copyright, protection, text(标签)
Requires at least: 6.3
Tested up to: 6.9
Stable tag: 1.1.2
Requires PHP: 7.4
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
  
== Description ==
  
描述


## 描述标题1

描述段落

- 描述列表1(li标签)
- 描述列表2(li标签)

## 描述标题2
描述段落,a标签的写法如下

[王先生笔记](https://wxsnote.cn/)

  
== Frequently Asked Questions ==
  
= 提问1? =
  
回答1,这是问答区域

= 提问2? =

回答2
  
== Screenshots ==
1. 对应截图1的描述,会自动获取插件仓库的图片,后面会说明
2. 对应截图2的描述
3. 对应截图3的描述
4. 对应截图4的描述

== External services ==

如果是外部API服务,例如支付平台开发的插件,需要对接其它平台,需要声明,它前面是== External services ==

  
== Changelog ==
= 1.2 =
更新日志,建议十进制,每次比上次大

= 1.1 =
修改xx

= 1.0 =
xx发布

官方标准写法:https://wordpress.org/plugins/readme.txt

自述文件验证:https://wordpress.org/plugins/developers/readme-validator/

自述文件效果预览验证:https://wpreadme.com/

图片[6]-WordPress插件提交到官方插件目录-王先生笔记

LICENSE开源协议文件

我建议你直接用GNU 通用公共许可证,版本 2

协议介绍:https://www.gnu.org/licenses/old-licenses/gpl-2.0.html

示例:https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt

图片[7]-WordPress插件提交到官方插件目录-王先生笔记

uninstall.php卸载文件编写

不推荐在主文件中添加卸载函数,我建议使用uninstall.php文件,如果在主文件中添加,会出现各种问题,这个卸载删除数据,务必确认好,不要瞎删数据,只能删除自己插件的数据,在上传更新插件时,先测试一下卸载删除功能!

<?php
// 确保直接访问此文件时退出
if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) {
    exit;
}
// 删除插件选项
delete_option( 'your_plugin_settings' );
// 若有自定义数据表,可在此删除
// global $wpdb;
// $wpdb->query( "DROP TABLE IF EXISTS {$wpdb->prefix}your_plugin_table" );

关于函数命名(重要)

函数命名,必须4个字符以上前缀加作用英文命名

例如下图:

是以wxstbw开头的,所有函数名都是这个开头,实际意义是,我的标签wxs和Blind text watermarking,后面就是函数作用英文,这是为了与其它插件主题的函数相同避免冲突的

图片[8]-WordPress插件提交到官方插件目录-王先生笔记

编写代码正确做法(重要)

开启Debug模式,解决所有报错,在wp-config.php文件添加以下启用

define( 'WP_DEBUG', true);

你不必再次添加wordpress已经有的库,例如wp已经自带jquery,那你直接用就可以了,为什么还要再添加一个,这是多余的举动

尽量使用wordpress自带的函数,比如:wp_is_mobile(),不必再次封装函数,再造轮子

获取的数据要消毒,什么意思呢,不要使用不推荐的PHP函数,如:$_SERVER['REMOTE_ADDR'],在取值时应该过滤内容或使用wp提供的函数

添加静态资源要用wp_enqueuewp_localize等,不要直接打印,静态配置要用json打印出来,如下

<script type="text/javascript" id="wxstbw-watermark-script-js-extra">
/* <![CDATA[ */
var wxstbwConfig = {"enable":"1","user_group_enable":"1","user_group_type":"wordpress","wordpress_user_roles":["editor","author","contributor","subscriber"],"min_paragraph_length":"20","insert_method":"2","random":{"count_type":"2","custom_count":"1","word_based_ratio":"400"},"fixed":{"interval":"20"},"watermark_content":{"include_ip":"1","include_user":"1","include_time":"1","include_custom":"1","custom_text":"\u738b\u5148\u751f\u7b14\u8bb0 \u7248\u6743\u6240\u6709"},"htmlTags":["p","li"],"jsGlobalEnable":"0","jsClassSelectors":"","jsIdSelectors":"","global_force_article":"0","bot_ua":["googlebot","bingbot","baiduspider","sogou web spider","360spider","yisouspider","bytespider","duckduckbot","yandexbot","yahoo"],"debug_mode":"0","run_mode":"hybrid"};
//# sourceURL=wxstbw-watermark-script-js-extra
/* ]]> */
</script>

创建API时应该使用WP端点,但国内肯定很多禁用的,那就创建模板以查询参数方式返回信息,不能单独创建一个PHP文件返回信息

/**
 * 注册自定义查询变量
 */
add_filter('query_vars', function ($vars) {
    $vars[] = 'wxstbw_query';
    return $vars;
});

/**
 * 处理IP请求的端点逻辑
 */
add_action('template_redirect', function () {
    // 仅处理带有wxstbw_query参数的请求
    if (get_query_var('wxstbw_query') !== 'getip') {
        return;
    }

    // 验证请求方法
    if (!isset($_SERVER['REQUEST_METHOD']) || $_SERVER['REQUEST_METHOD'] !== 'GET') {
        wp_die('Invalid request method', 400);
    }

    // 验证来源
    $referer = isset($_SERVER['HTTP_REFERER']) 
        ? wp_parse_url(sanitize_text_field(wp_unslash($_SERVER['HTTP_REFERER']))) 
        : false;
    
    $host = isset($_SERVER['HTTP_HOST']) 
        ? sanitize_text_field(wp_unslash($_SERVER['HTTP_HOST'])) 
        : '';
    
    // 安全验证
    if ($referer && !empty($host) && strpos($referer['host'], $host) === false) {
        wp_die('Invalid referer', 403);
    }

    // 强制不缓存该响应
    nocache_headers();
    header('Content-Type: application/json; charset=utf-8');

    // IP获取和响应构建
    try {
        $visitor_ip = wxstbw_get_client_ip();
        $response = [
            'success' => !empty($visitor_ip) && $visitor_ip !== 'unknown',
            'ip' => $visitor_ip,
            'timestamp' => time()
        ];
    } catch (Exception $e) {
        $response = [
            'success' => false,
            'ip' => '',
            'error' => $e->getMessage()
        ];
    }

    wp_send_json($response);
});

最后,你应该用Plugin Check (PCP)插件验证你的插件是否有误,选择你的插件,会检测所有插件中所有PHP文件,将不符合wp开发标准的文件,函数,原因都标记出来了,需要依次修复。

图片[9]-WordPress插件提交到官方插件目录-王先生笔记

提交审核wordpress插件及期间准备

看来你应该做好了上传插件的准备,将插件压缩为zip文件后上传,注意要低于10MB

提交你的插件:https://cn.wordpress.org/plugins/developers/add/

图片[10]-WordPress插件提交到官方插件目录-王先生笔记

提交期间,你应该去准备插件展示页所用的资源,icon是主图片,banner是横幅,screenshot是截图,后面是指定的像素尺寸,例如banner-772x250.png是默认图,所有地区均显示该图,banner-772x250-zh_CN.png就是中文版本的,这是多语言所需的,非多语言,只需要添加7个默认图就好

icon-128x128png

banner-772x250.png
banner-772x250-zh_CN.png

banner-1544x500.png
banner-1544x500-zh_CN.png

screenshot-1.png #与自述文档的截图描述1对应
screenshot-1-zh_CN.png
screenshot-2.png #与自述文档的截图描述2对应
screenshot-2-zh_CN.png
screenshot-3.png #与自述文档的截图描述3对应
screenshot-3-zh_CN.png
screenshot-4.png #与自述文档的截图描述4对应
screenshot-4-zh_CN.png

图片地址:https://plugins.svn.wordpress.org/wxs-text-watermarking/assets/

图片[11]-WordPress插件提交到官方插件目录-王先生笔记

在提交后的14天内(差不多就这个时间),会有审核团队的人员联系你,不合规的地方会告诉你

在你按要求修改后,需要在提交插件的地方再次上传修改后的插件,并回复邮件

经历几次整改后,你终于收到了通过审核邮件通知

你将收到你的插件仓库地址,例如以下

https://plugins.svn.wordpress.org/wxs-text-watermarking/
图片[12]-WordPress插件提交到官方插件目录-王先生笔记

管理SVN仓库

关于这个你可以看看:插件的规划、提交与维护

打开你的个人信息Account & Security,选择SVN credentials,生成你的SVN仓库密码

https://profiles.wordpress.org/你的wp用户名/profile/edit/group/3/
图片[13]-WordPress插件提交到官方插件目录-王先生笔记

你应该已经安装了Tortoisesvn软件,在你电脑本地创建一个文件夹,用作管理仓库

图片[14]-WordPress插件提交到官方插件目录-王先生笔记

右键,选择Tortoisesvn的检出,就是拉取仓库内容到这这个目录

图片[15]-WordPress插件提交到官方插件目录-王先生笔记

这时需要你填写仓库地址,账号(wordpress账号名)和密码(在SVN credentials生成的密码)

仓库地址例如:

https://plugins.svn.wordpress.org/wxs-text-watermarking/

用户名例如:

图片[16]-WordPress插件提交到官方插件目录-王先生笔记

SVN密码例如(瞎拼的,开头是SVN_就没错):

svn_123456qwertyASDFGas8564fg86as8dfg7
图片[17]-WordPress插件提交到官方插件目录-王先生笔记

会下载到下面几个目录

图片[18]-WordPress插件提交到官方插件目录-王先生笔记

assets文件夹是放图片资源的,之前准备的图片就可以用的到了

图片[19]-WordPress插件提交到官方插件目录-王先生笔记

trunk文件夹是开发目录,在这里提交更改,将插件文件夹中的文件复制到这里

图片[20]-WordPress插件提交到官方插件目录-王先生笔记

接下来选中trunk文件夹,右键,选择SVN提交

图片[21]-WordPress插件提交到官方插件目录-王先生笔记

大概是软件的原因,提交信息需要英文?

图片[22]-WordPress插件提交到官方插件目录-王先生笔记

然后,你应该依据插件主文件注释和readme中的版本号创建版本到tags文件夹中

更新插件与提交

第一次上传插件和更新插件都是这个操作

在提交目录中右键,打开终端

图片[23]-WordPress插件提交到官方插件目录-王先生笔记

命令复制trunk目录下的文件到tags下的1.0版本号目录中,这仅仅是本地操作

svn cp trunk tags/1.0

由于网络问题,再次提交肯定不现实,我们直接用命令,直接操作仓库做这个操作,这样就免去了再次上传导致上传很久的尴尬局面

svn cp https://plugins.svn.wordpress.org/wxs-text-watermarking/trunk https://plugins.svn.wordpress.org/wxs-text-watermarking/tags/1.0 -m "Release 1.0, Upload version 1.0 plug-in"

在你更新插件时,直接编辑trunk目录的文件即可,主文件注释版本号,统一版本号,readme中的版本号和更新记录

其实在宝塔面板插件商店找到了这个插件,我暂时没有使用过,你可以去研究一下。如果你有美国云服务器,可以试试这个,毕竟wordprss插件仓库的服务器就在那里,肯定比自己这边快

图片[24]-WordPress插件提交到官方插件目录-王先生笔记

结语

以上流程从准备到落地全经实践验证,只要按规范做好插件开发、耐心应对审核反馈,就能成功将插件上架官方目录。后续插件更新也可沿用文中SVN操作方法,保障流程顺畅。若遇问题,可借助文中工具与链接排查,也欢迎交流经验,让你的插件更快融入WordPress官方生态。

其它

关于提交翻译,如果你做了多语言,可以看看下文,怎么提交翻译到官方

原文链接(非王先生笔记发布均为盗版):https://wxsnote.cn/7116.html

评论后可接收该文章的更新邮箱通知
友情赞助

如果你喜欢我的内容,可以赞助我哦!你的一点点心意,是我不断前进的动力!
温馨提示: 本文最后更新于2025-12-23 21:32:18,某些文章具有时效性,若有错误或已失效,请在下方留言或加入QQ群: 399019539 联系群主反馈。注意一些链接无法访问可能是你网络的原因,如Github,并非资源地址失效。
© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
相关推荐
评论 共2条

请登录后发表评论

    请登录后查看评论内容

王先生笔记