为WordPress的经典编辑器添加“代码插入”弹窗功能

释放双眼,带上耳机,听听看~!
AI智能摘要
同事写文章插入代码总是整整齐齐,换行和缩进一个不乱,我问他是不是装了什么插件,他笑着说根本不用复杂操作。我翻遍主题设置才发现,原来B2Pro经典编辑器早就没了代码按钮,可他却能一键弹出窗口,自动转义标签、智能区分行内和块级代码。更离谱的是,连空行丢失这种老毛病都解决了——这背后到底动了什么手脚?你敢信这居然只靠几行代码就实现了?
— AI 生成的文章内容摘要

首先对于B2Pro主题的经典编辑器用户来说,后台插入代码真的费劲,因为主题已经不再对经典编辑器做更好的适配,区块编辑器已成主流,因此经典编辑器的菜单栏根本没有插入代码的按钮,只能手打标签或者代码模式点按标签按钮。

本教程旨在解决 WordPress 经典编辑器插入代码时的常见痛点,其他主题也可使用:

  • 代码不换行:长代码会把页面撑变形。
  • 空行丢失:代码中间的空行在保存后消失。
  • 标签混乱:搞不清什么时候用 <code>,什么时候用 <pre>。
  • 我们将通过开发一个简单的 TinyMCE 插件,实现:点击按钮弹出窗口。
  1. 默认模式:生成 <pre><code>…</code></pre>,完美保留代码空行和格式(用于代码高亮插件)。
  2. 普通模式:生成 <code>…</code>,自动处理换行符,防止代码变成一行(用于简短代码)。
  3. 自动转义:自动将代码中的 < > 等符号转义为 HTML 实体,防止代码被浏览器执行。

添加教程

第一步:修改 functions.php 注册插件

在子主题的 functions.php 文件最末尾(?> 之前)添加以下代码。

这段代码的作用是告诉 WordPress:“我要加载一个 TinyMCE 插件,并且在工具栏上加一个按钮”。

/**
 * 为经典编辑器添加“插入代码”按钮
 */

// 1. 注册 TinyMCE 插件 JS 文件
add_filter('mce_external_plugins', 'chunnel_register_code_plugin');
function chunnel_register_code_plugin($plugins) {
    $plugins['chunnel_code'] = get_stylesheet_directory_uri() . '//cdn.chunnel.cn/Assets/js/tinymce-code.js';
    return $plugins;
}

// 2. 在工具栏第一行添加按钮
add_filter('mce_buttons', 'chunnel_add_code_button');
function chunnel_add_code_button($buttons) {
    array_push($buttons, 'chunnel_code');
    return $buttons;
}

第二步:创建 JS 交互逻辑文件

这是功能的核心。在子主题目录下新建文件:

/b2child/Assets/js/tinymce-code.js

如果 Assets 或 js 文件夹不存在,请先自行创建。

将以下代码复制进去:

(function() {
    tinymce.create('tinymce.plugins.ChunnelCode', {
        init: function(editor, url) {
            // 添加工具栏按钮
            editor.addButton('chunnel_code', {
                title: '插入代码片段',
                text: '[Code]', // 按钮显示的文字
                icon: 'code',   // 使用 TinyMCE 自带的 code 图标
                onclick: function() {
                    // 打开弹窗
                    editor.windowManager.open({
                        title: '插入代码',
                        body: [
                            {
                                type:  'textbox',
                                name:  'code_content',
                                label: '请粘贴代码',
                                multiline: true,
                                minWidth:  editor.getParam('code_dialog_width', 600),
                                minHeight: editor.getParam('code_dialog_height', 400),
                                spellcheck: false, // 关闭拼写检查
                                style: 'font-family: Consolas, Monaco, monospace; font-size: 14px;'
                            },
                            {
                                type:  'checkbox',
                                name:  'use_pre',
                                label: '启用代码高亮 (<pre><code>)',
                                checked: true // 默认选中
                            }
                        ],
                        onsubmit: function(e) {
                            var rawCode = e.data.code_content;
                            
                            // 1. 移除首尾的空白行(防止上下多余的空行)
                            rawCode = rawCode.replace(/^\n+|\n+$/g, '');

                            // 2. HTML 实体转义(关键!防止 < > 被浏览器解析)
                            var escapedCode = rawCode
                                .replace(/&/g, "&amp;")
                                .replace(/</g, "&lt;")
                                .replace(/>/g, "&gt;");

                            var html = '';

                            // 3. 根据勾选状态包裹标签
                            if (e.data.use_pre) {
                                // 模式 A:<pre><code>...</code></pre>
                                // 保留换行符 \n,HTML 的 <pre> 标签会自动识别换行并显示
                                // 注意:如果你的代码高亮插件用的是 class="prism" 或 "hljs",请修改下面的 prettyprint linenums,此处为B2主题后台高亮设置,所属类名linenums
                                html = '<pre class="prettyprint linenums"><code>' + escapedCode + '</code></pre>';
                            } else {
                                // 模式 B:<code>...</code>
                                // <code> 是行内元素,不识别 \n。
                                // 为了适配“代码换行”和“中间空行”,我们把 \n 替换成 <br>
                                var visualCode = escapedCode.replace(/\n/g, "<br>");
                                html = '<code>' + visualCode + '</code>';
                            }

                            // 4. 插入到编辑器
                            editor.insertContent(html);
                        }
                    });
                }
            });
        },

        createControl: function(n, cm) {
            return null;
        },

        getInfo: function() {
            return {
                longname: 'Chunnel Insert Code',
                author: 'Chunnel',
                version: '1.0'
            };
        }
    });

    // 注册插件
    tinymce.PluginManager.add('chunnel_code', tinymce.plugins.ChunnelCode);
})();

注意:如果你的网站使用的是 Prism.js 或 Highlight.js 等高亮插件,请将代码中的 prettyprint 替换为你插件对应的类名(如 language-php、hljs 等)。

使用方法与效果

清理缓存:清理浏览器缓存或强制刷新(Ctrl+F5)。

找到按钮:进入后台 -> 文章 -> 写文章。在经典编辑器的第一行工具栏,你会看到一个名为 [Code] 的按钮。

插入代码:

点击按钮,弹出窗口。

粘贴你的代码。

默认勾选状态(适用于大段代码):

将生成 <pre class=”prettyprint linenums”><code>…</code></pre>。

即使代码中间有空行,保存后也会完美保留。

取消勾选状态(适用于简短文字内的代码):

将生成 <code>…</code>。

程序会自动将回车换行符转换为 <br>,防止代码变成一行,保持可读性。

发布:点击插入按钮后,代码会按照你设定的格式进入编辑器,发布到前台即可完美展示。

常见问题

  • Q: 我点击按钮没反应?
  • A: 请检查是否安装了“经典编辑器”插件,或者主题设置里是否切换为了古腾堡编辑器。此功能仅适用于经典编辑器。
  • Q: 我的前台代码没有高亮颜色?
  • A: 此教程只负责生成正确的 HTML 结构。前台高亮需要你额外安装代码高亮插件(如 WP-GeSHi-Highlight、Prism.js 等)。如果你用的是 Prism,记得把第二步 JS 里的 prettyprint 改成 language-xxx。

© 版权声明

本文采用 知识共享署名-非商业性使用 4.0 国际许可协议(CC BY-NC 4.0) 进行许可

转载必须 注明原作者+原文链接,不得篡改来源

仅限非商业用途,禁止用于盈利性场景(广告/付费专栏等)

可修改衍生,衍生作品需同步遵循本协议

不得删除或修改本文版权声明及核心信息

本站部分文章可能为网络转载,转载已尽力标注原作者及来源,旨在分享优质内容;若涉及版权争议或侵权,请联系我们及时删除,感谢理解与配合。

商用需授权 | 官方协议:CC BY-NC 4.0 全文

技术教程

B2Pro主题首页模块双端缓存问题解决:针对Nginx FastCGI缓存环境

2026-1-23 20:26:22

技术教程

AI模型选型指南:如何从零开始选择最适合你的大语言模型与多模态AI?

2026-1-12 23:59:32

0 条回复 A文章作者 M管理员
dogedoge-圣诞OKW-哈哈爱心傲娇保卫萝卜-哭哭保卫萝卜-哇保佑抱拳吃瓜呲牙打call大哭大笑呆点赞调皮嘟嘟翻白眼奋斗福福到了尴尬干杯高考加油高兴给心心狗子鼓掌怪我咯跪了哈哈哈欠害羞黑洞滑稽画风突变鸡腿加油奸笑锦鲤惊喜惊讶囧嗑瓜子抠鼻口罩哭泣蜡烛辣眼睛老鼠冷脸红脸红-旧灵魂出窍洛天依妙啊妙啊-圣诞墨镜母亲节奶茶干杯难过牛年哦呼撇嘴泼水节气愤亲亲热三星堆生病生气胜利十周年耍帅水稻思考酸了汤圆疼偷笑吐脱单doge歪嘴微笑委屈无语捂脸捂脸-圣诞捂眼喜欢喜极而泣吓嫌弃响指笑笑哭星星眼羞羞嘘声雪花雪容融疑惑阴险拥抱月饼再见支持抓狂总冠军粽子足球
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索