有没有一种方法可以将自定义帖子类型上的“发布”按钮的文本更改为其他形式?例如,保存而不是发布。还要删除草稿按钮吗?

#1 楼

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

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
}


是的,这很丑。

评论


那更像是版本20 :)很棒的代码!

–稀有
2010-11-5 8:22

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

– hakre
2010年11月6日18:49

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

– fuxia♦
2010年11月6日在21:21



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

– fuxia♦
2010年11月6日,21:55

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

–brasofilo
2012年5月17日14:45

#2 楼

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
16年6月23日在0:53



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

– rinogo
16年6月23日在2:33

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

–稀有
16年6月29日在13:24

#3 楼

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

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

#4 楼

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





基于@Rarst提供的解决方案,我扩展了代码,以便将许多(全部?)单词“ Publish”的其他实例转换为“ Save”的相应变体。 >
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

–阿姆贾德
17年5月1日23:16

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

– rinogo
17年5月2日在16:11

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

–阿姆贾德
17年5月2日在18:31

#5 楼

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

请参阅我在此处有关移动元框的讨论,您应该能够应用类似于重命名“发布文本”的内容。

#6 楼

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

#7 楼

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

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