WordPress打开post/page编辑器时是否存在可用hook?
WordPress 编辑器场景可用Hook及自动插入代码片段实现
打开WordPress的post/page编辑器时,有对应可用的Hook实现内容抓取、自动插入指定片段的需求,注意古腾堡块编辑器(5.0+默认)和经典编辑器的Hook逻辑不通用,按你实际启用的编辑器选择即可:
分编辑器可用Hook及适用场景
古腾堡(块编辑器)
- 新建文章/页面场景:直接用后端过滤器
default_content即可,打开新建编辑页时会自动把你指定的片段预填充到编辑器中 - 编辑已有文章/页面场景:块编辑器是前端React渲染,无法直接用PHP过滤器修改输出的编辑内容,需要通过JS侧编辑器API实现,配合
enqueue_block_editor_assets加载自定义脚本即可操作编辑器内容、插入指定片段
经典编辑器(TinyMCE旧版编辑器)
- 新建文章/页面场景:和古腾堡通用
default_content过滤器 - 编辑已有文章/页面场景:可以直接用PHP过滤器
the_editor_content,在编辑器内容输出到页面前完成内容抓取、片段追加逻辑,不需要额外写JS
可直接复用的代码示例
1. 新建文章自动预填充片段(两类编辑器通用)
add_filter( 'default_content', 'auto_insert_custom_snippet_for_new_post', 10, 2 ); function auto_insert_custom_snippet_for_new_post( $content, $post ) { // 仅在post、page类型的新建页生效 if ( in_array( $post->post_type, ['post', 'page'] ) ) { // 替换为你需要插入的自定义代码片段 $snippet = '<!-- 自定义埋点代码 --><div class="custom-block">自定义通用模块</div>'; $content .= $snippet; } return $content; }
2. 经典编辑器打开已有文章自动追加片段
add_filter( 'the_editor_content', 'auto_insert_snippet_for_existing_post_classic', 10, 1 ); function auto_insert_snippet_for_existing_post_classic( $content ) { $screen = get_current_screen(); // 排除非post/page编辑页 if ( !$screen || !in_array( $screen->post_type, ['post', 'page'] ) || $screen->base !== 'post' ) { return $content; } $snippet = '<!-- 自定义埋点代码 --><div class="custom-block">自定义通用模块</div>'; // 做重复判断,避免每次打开编辑都重复插入片段 if ( strpos( $content, $snippet ) === false ) { $content .= $snippet; } return $content; }
3. 古腾堡编辑器打开已有文章自动追加片段
首先通过PHP钩子加载自定义编辑器脚本:
add_action( 'enqueue_block_editor_assets', 'load_custom_gutenberg_editor_script' ); function load_custom_gutenberg_editor_script() { $screen = get_current_screen(); if ( !$screen || !in_array( $screen->post_type, ['post', 'page'] ) ) { return; } // 替换为你自定义JS文件的路径,依赖wp-blocks、wp-data、wp-dom-ready核心依赖 wp_enqueue_script( 'custom-gutenberg-script', get_template_directory_uri() . '/assets/js/custom-editor.js', ['wp-blocks', 'wp-data', 'wp-dom-ready'], '1.0.0', true ); }
在对应自定义JS文件中写入内容插入逻辑:
wp.domReady(() => { let hasInserted = false; wp.data.subscribe(() => { // 等待编辑器初始化完成 const isReady = wp.data.select('core/editor').isReady(); if (!isReady || hasInserted) return; const snippet = '<!-- 自定义埋点代码 --><div class="custom-block">自定义通用模块</div>'; const currentContent = wp.data.select('core/editor').getEditedPostContent(); // 不存在目标片段则插入自定义HTML块 if (currentContent.indexOf(snippet) === -1) { const newBlock = wp.blocks.createBlock('core/html', {content: snippet}); wp.data.dispatch('core/block-editor').insertBlocks(newBlock); hasInserted = true; } }) })
注意事项
- 所有逻辑都要加页面判断,不要在后台非编辑页加载相关代码,避免干扰其他后台功能
- 必须加重复插入判断逻辑,否则每次打开编辑器都会重复追加相同片段
- 如果插入的是可执行代码(比如JS统计代码),注意做好用户权限校验,避免低权限用户编辑时被恶意篡改内容
内容的提问来源于stack exchange,提问作者Aftermaz
相关产品推荐
相关产品推荐

