更改发布按钮上的文本

时间:2010-11-02 作者:Paul Sheldrake

有没有办法更改自定义帖子类型上“发布”按钮的文本以表示不同的内容?例如,保存而不是发布。还要删除拔模按钮吗?

7 个回复
最合适的回答,由SO网友:fuxia 整理而成

如果你调查/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\' )
    )
);
您不需要将代码用作插件。将其包含在主题的功能中。php就足够了。

更新要删除原始的保存按钮(不确定“草稿”按钮是什么),请向函数中添加以下代码。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
}
是的,很难看。

SO网友:Rarst

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

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

function change_publish_button( $translation, $text ) {

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

return $translation;
}

SO网友:hakre

这不是一个完整的答案,但有一些指导:显示的任何文本都会超过翻译过滤器,因此可以在回调函数(hook)中更改。所以,如果钩子只在您想要更改的页面上注册,那么工作就完成了。

草稿按钮可以通过CSS隐藏来“删除”。CSS可以注入<head>-使用另一个回调标记admin。我认为过滤器被称为admin_head 为此。它有点脏,因为按钮仍然存在,例如,如果用户关闭CSS。

SO网友:rinogo

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

Meta box

Post list

基于@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给出的答案包含了一个很好的解决方案。

SO网友:t31os

另一种方法是注销metabox,然后用不同的值重新注册同一个框,尤其是发布文本。。

看看我的讨论here 关于移动元框,您应该能够应用类似于重命名发布文本的内容。

SO网友:Dan Gayle

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

SO网友:The J

更干净&;更简单的解决方案。

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);

结束

相关推荐

WP-ADMIN似乎正在重定向

我的w-admin登录有一个奇怪的问题。这是从我升级到3.0以后才开始的,当我转到wp admin时,登录表单显示正常,但当我输入用户名并通过时,每次都会再次显示登录表单。使用密码恢复功能会导致电子邮件未找到错误。我知道用户名密码和电子邮件是正确的,b/c我可以访问mysql数据库,我可以看到值(至少用户名和电子邮件) 有人知道会出什么问题吗