You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:02:27