WordPress后台编辑页发布按钮gettext过滤器失效问题求助
解决WordPress编辑页面发布按钮标签无法替换的问题
嘿,我之前也碰到过类似的坑!你的代码能改页面列表里的“draft”,是因为那里的文本用普通gettext钩子就能捕获,但编辑页面的发布按钮文本情况不一样,主要是这两个原因:
- 带上下文的翻译机制:WordPress后台很多按钮、状态标签会用
_x()或_ex()这类带上下文的翻译函数——毕竟同一个单词在不同场景下可能需要不同翻译(比如“Draft”在页面列表和发布按钮的上下文是完全不同的)。而你的代码只注册了gettext和ngettext钩子,没处理带上下文的gettext_with_context过滤器,自然捕获不到这些文本。 - 全局替换的局限性:你用
str_ireplace做全局替换,不仅容易误改其他地方的“draft”(比如插件里的相关文本),而且对带上下文的翻译完全无效——因为这类文本的钩子会传递更多参数(上下文、原文本、文本域),全局替换根本没用到这些关键信息。
改进后的解决方案
给你调整后的代码,既支持带上下文的翻译,又能精准替换避免副作用:
function custom_translate_draft_to_offline( $translated, $text, $domain, $context = null ) { // 只处理WordPress核心文本域,避免干扰插件/主题的翻译 if ( 'default' !== $domain ) { return $translated; } // 定义需要替换的文本映射 $replacements = array( 'Draft' => 'Offline', 'Save Draft' => 'Save Offline' ); // 处理普通gettext/ngettext的场景(比如页面列表) if ( isset( $replacements[ $text ] ) ) { return $replacements[ $text ]; } // 处理带上下文的场景(比如发布按钮的状态标签) if ( $context && 'Post status' === $context && 'Draft' === $text ) { return 'Offline'; } return $translated; } // 注册普通翻译钩子 add_filter( 'gettext', 'custom_translate_draft_to_offline', 10, 3 ); add_filter( 'ngettext', 'custom_translate_draft_to_offline', 10, 3 ); // 注册带上下文的翻译钩子 add_filter( 'gettext_with_context', 'custom_translate_draft_to_offline', 10, 4 );
调试确认上下文(可选)
如果上面的代码还是没生效,你可以临时加调试代码,精准定位目标文本的上下文:
function debug_translation_contexts( $translated, $text, $domain, $context = null ) { if ( is_admin() && str_contains( $text, 'Draft' ) ) { // 把调试信息写入WordPress的debug.log error_log( "Text: '$text' | Context: '$context' | Domain: '$domain'" ); } return $translated; } add_filter( 'gettext', 'debug_translation_contexts', 10, 3 ); add_filter( 'gettext_with_context', 'debug_translation_contexts', 10, 4 );
开启WordPress调试模式后,去编辑页面操作,然后查看wp-content/debug.log,就能找到发布按钮对应的text和context值,再把代码里的上下文改成你查到的内容就行。
额外注意事项
- 过滤器优先级:如果有其他插件也在修改翻译,你可以把钩子的优先级从10改成20(比如
add_filter( 'gettext', ..., 20, 3 )),确保你的代码最后执行。 - 缓存问题:修改代码后记得清空WordPress的翻译缓存,或者重新登录后台刷新页面,避免旧缓存影响效果。
内容的提问来源于stack exchange,提问作者laurent
相关产品推荐
相关产品推荐

