게시 버튼의 텍스트를 변경합니다


21

맞춤 게시물 유형에서 게시 버튼의 텍스트를 다르게 변경하는 방법이 있습니까? 예를 들어 게시 대신 저장하십시오. 또한 드래프트 버튼을 제거 하시겠습니까?

답변:


16

를 살펴보면 /wp-admin/edit-form-advanced.php메타 상자를 찾을 수 있습니다.

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

참고 __('Publish')- 함수 __()에 리드 translate()필터를 얻을 곳을 'gettext'.

문제를 처리하는 방법은 두 가지가 있습니다. 1. 단일 특수 함수로 문자열을 지정하거나 (올바른 텍스트 도메인과 일치해야합니다!) 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과 더 비슷합니다 :) 멋진 코드!
Rarst

나도 좋아. 여전히 다른 버튼을 숨길 수 없습니다.
hakre

저장 버튼을 제거하는 post_submit_meta_box()것은 내용을 덤프 하기 때문에 실제로 어렵 습니다. 전혀 필터가 없습니다. 자바 스크립트 또는 ob_start()해결할 수 있습니다. 둘 다 매우 우아하지 않습니다.
fuxia

흠, 원래 저장 버튼을 제거하는 코드를 추가했습니다. 그렇게 힘들지 않았습니다. :)
fuxia

나는이 :)을 설명하는 단어를 그리워 - & 전에 말했다 : 배열을 포맷 할 수있는 쉼표의 사용은 가치가 PHP 포매터 상 +1+
brasofilo

11

번역 필터를 사용하는 hakre의 제안 코드는 다음과 같습니다.

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

function change_publish_button( $translation, $text ) {

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

return $translation;
}

"version 1"(@ toscho가 작성한 현재 답변)이이 방법보다 우수하거나 열등한 이유가 있습니까? 이것은 나에게 더 나은 것 같습니다-더 간단하고 "저장"버튼을 제거하기 위해 해킹을 필요로하지 않으며 더 미래 지향적입니다.
rinogo 2016 년

당신의 대답은 저에게 영감을주었습니다. 더 많은 줄을 다루기 위해 당신의 접근 방식을 발전 시켰습니다. wordpress.stackexchange.com/a/230513/10388
rinogo 2016 년

2
단점은 그 번역 필터 화재 것이다 많은 그것으로 접선하는 것은 상당한 성능 오버 헤드, 배. 런타임에서 필요한 지점 가까이에 필터를 추가 / 제거하면 제한된 시간 동안 만 필터링하여 줄일 수 있습니다.
Rarst

4

이것은 정답은 아니지만 몇 가지 지침입니다. 표시되는 모든 텍스트가 변환 필터를 초과하므로 콜백 함수 (후크)에서 변경할 수 있습니다. 따라서 후크를 변경하려는 페이지에만 후크가 등록되어 있으면 작업이 완료된 것입니다.

초안 버튼은 CSS를 통해 숨겨서 "제거"할 수 있습니다. CSS는 <head>다른 콜백과 함께 관리자 의 -tag에 삽입 될 수 있습니다 . 필터가 필요하다고 생각합니다 admin_head. 예를 들어 사용자가 CSS를 끄는 경우 버튼이 여전히있어 더럽습니다.


3

일관성을 유지하기 위해 버튼 텍스트 대신 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
Amjad

@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);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.