更改“发布”按钮上的文本


Answers:


16

如果您查看/wp-admin/edit-form-advanced.php,则会找到元框:

add_meta_box('submitdiv', __('Publish'), 'post_submit_meta_box', $post_type, 'side', 'core');

注意__('Publish')–函数__()会指向translate()您获取过滤器的位置'gettext'

有两种方法可以解决您的问题:1.在单个专用函数中处理字符串(请确保匹配正确的textdomain!);或2.使用更通用的方法。

@Rarst 刚刚发布了版本1,因此我将添加版本2。:)

<?php
/*
Plugin Name: Retranslate
Description: Adds translations.
Version:     0.1
Author:      Thomas Scholz
Author URI:  http://toscho.de
License:     GPL v2
*/

class Toscho_Retrans {
    // store the options
    protected $params;

    /**
     * Set up basic information
     * 
     * @param  array $options
     * @return void
     */
    public function __construct( array $options )
    {
        $defaults = array (
            'domain'       => 'default'
        ,   'context'      => 'backend'
        ,   'replacements' => array ()
        ,   'post_type'    => array ( 'post' )
        );

        $this->params = array_merge( $defaults, $options );

        // When to add the filter
        $hook = 'backend' == $this->params['context'] 
            ? 'admin_head' : 'template_redirect';

        add_action( $hook, array ( $this, 'register_filter' ) );
    }

    /**
     * Conatiner for add_filter()
     * @return void
     */
    public function register_filter()
    {
        add_filter( 'gettext', array ( $this, 'translate' ), 10, 3 );
    }

    /**
     * The real working code.
     * 
     * @param  string $translated
     * @param  string $original
     * @param  string $domain
     * @return string
     */
    public function translate( $translated, $original, $domain )
    {
        // exit early
        if ( 'backend' == $this->params['context'] )
        {
            global $post_type;

            if ( ! empty ( $post_type ) 
                && ! in_array( $post_type, $this->params['post_type'] ) )
            {
                return $translated;
            }
        }

        if ( $this->params['domain'] !== $domain )
        {
            return $translated;
        }

        // Finally replace
        return strtr( $original, $this->params['replacements'] );
    }
}

// Sample code
// Replace 'Publish' with 'Save' and 'Preview' with 'Lurk' on pages and posts
$Toscho_Retrans = new Toscho_Retrans(
    array (
        'replacements' => array ( 
            'Publish' => 'Save'
        ,   'Preview' => 'Lurk' 
        )
    ,   'post_type'    => array ( 'page', 'post' )
    )
);

您无需将代码用作插件。在主题的functions.php中包含它就足够了。

更新资料

要删除原始的“保存”按钮(不确定“草稿”按钮是什么),请将以下代码添加到您的functions.php / a插件中:

add_action( 'admin_print_footer_scripts', 'remove_save_button' );
function remove_save_button()
{   
?>
<script>
jQuery(document).ready(function($){$('#save-post').remove();});
</script><?php
}

是的,这很丑。


1
那更像是版本20 :)很棒的代码!
拉斯特

我也喜欢 仍然无法隐藏其他按钮。
hakre 2010年

删除保存按钮确实很困难,因为post_submit_meta_box()仅转储其内容即可。完全没有过滤器。Javascript或ob_start()可以解决这个问题。两者都不是很优雅。
fuxia

嗯,好的,我添加了一些代码以删除原来的“保存”按钮。没那么难。:)
fuxia

我想念这句话:)-之前曾说过:使用逗号格式化数组值得PHP格式化者奖 +1+
brasofilo 2012年

11

hakre建议使用翻译过滤器的代码如下所示:

add_filter( 'gettext', 'change_publish_button', 10, 2 );

function change_publish_button( $translation, $text ) {

if ( $text == 'Publish' )
    return 'Save';

return $translation;
}

是否有理由说明“版本1”(当前接受的答案,由@toscho编写)优于/劣于此方法?对我来说,这似乎是两者中更好的选择-更简单,不需要黑客删除“保存”按钮,并且更具前瞻性。
rinogo

您的回答启发了我-我发展了您的方法以涵盖更多字符串。wordpress.stackexchange.com/a/230513/10388
rinogo

2
不利的一面是转换过滤器会触发很多次,而将其挂在钩子上会带来很大的性能开销。通过仅在有限的时间内进行过滤,可以通过在运行时将过滤器添加/删除到必要的位置来减少这种情况。
拉斯特

4

这不是一个完整的答案,而是一些指导:显示的所有文本都超过翻译过滤器,因此可以在回调函数(挂钩)中进行更改。因此,如果挂钩仅在您要更改的页面上注册,则说明工作已完成。

可以通过CSS隐藏草稿按钮来“将其删除”。可以<head>使用另一个回调将CSS注入到admin 的-tag中。我认为需要过滤器admin_head。由于按钮仍然存在,因此有点脏,例如,如果用户关闭CSS。


3

为了保持一致性,我假设您希望在整个Wordpress中使用“保存”而不是“发布”,而不是仅在按钮文本上使用。

元框

帖子列表

在@Rarst提供的解决方案的基础上,我扩展了代码,以便将“发布”一词的许多(全部?)其他实例转换为“保存”的适当变体。

add_filter("gettext", "translate_publish_post_status", 10, 2);
add_filter("ngettext", "translate_publish_post_status_number", 10, 5);
add_filter("ngettext_with_context", "translate_publish_post_status_number", 10, 6);

function translate_publish_post_status($translation, $text) {
    switch($text) {
        case "Publish":                     return "Save";
        case "Published on: <b>%1\$s</b>":  return "Saved on: <b>%1\$s</b>";
        case "Publish <b>immediately</b>":  return "Approve <b>immediately</b>";
        case "Publish on: <b>%1\$s</b>":    return "Approve on: <b>%1\$s</b>";
        case "Privately Published":         return "Privately Saved";
        case "Published":                   return "Saved";
        case "Save & Publish":              return "Save"; //"Double-save"? :)
        default:                            return $translation;
    }
}

function translate_publish_post_status_number($translation, $single, $plural, $number, $domain) {
    if($translation == "Published <span class=\"count\">(%s)</span>") {
        return "Saved <span class=\"count\">(%s)</span>";
    }

    return $translation;
}

要删除“草稿”按钮,@ toscho给出的答案是一个很好的解决方案。


注意:未定义的变量:s
Amjad'1

@Amjad-尝试将所有实例更改%1$s%1\$s。或者,关闭通知/警告将隐藏这些错误。
rinogo

我确实需要保留通知和警告以进行调试。但是为此。通过添加该错误不再显示\
Amjad

2

另一种方法是取消注册元框,然后使用不同的值重新命名同一框,命名为发布文本。

看到我在这里关于移动元框的讨论,您应该能够应用类似的方法来重命名该发布文本。


0

您可以通过jQuery找到该按钮,然后将文本节点交换为其他内容。那简直是小菜一碟。


0

更清洁,更轻松的解决方案。

function change_publish_btn_txt() {
    echo "<script type='text/javascript'>jQuery(document).ready(function(){
        jQuery('#publish').attr('value', 'Your Custom Text');
    });</script>";
}
add_action('admin_footer-post-new.php', 'change_publish_btn_txt', 99);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.