Thay đổi văn bản trên nút Xuất bản


21

Có cách nào để thay đổi văn bản của nút xuất bản trên một loại bài đăng tùy chỉnh để nói một số khác nhau không? Ví dụ: Lưu thay vì Xuất bản. Và cũng loại bỏ nút dự thảo?

Câu trả lời:


16

Nếu bạn nhìn vào /wp-admin/edit-form-advanced.php, bạn sẽ tìm thấy hộp meta:

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

Lưu ý __('Publish')- chức năng __()dẫn đến translate()nơi bạn nhận bộ lọc 'gettext'.

Có hai cách để xử lý vấn đề của bạn: 1. Địa chỉ chuỗi trong một hàm chuyên biệt duy nhất (đảm bảo khớp với tên miền văn bản chính xác!) Hoặc 2. sử dụng cách tiếp cận chung hơn.

@Rarst vừa mới đăng phiên bản 1, vì vậy tôi sẽ thêm phiên bản 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' )
    )
);

Bạn không cần sử dụng mã làm plugin. Bao gồm nó trong hàm.php của chủ đề của bạn sẽ là đủ.

Cập nhật

Để xóa nút Lưu ban đầu (không chắc nút 'nháp' là gì), hãy thêm đoạn mã sau vào hàm.php / một plugin:

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

Vâng, nó xấu.


1
Đó là giống như phiên bản 20 :) Mã tuyệt vời!
Rarst

Tôi cũng thích nó. Vẫn còn thiếu để ẩn nút khác.
hakre

Loại bỏ nút lưu thực sự khó khăn, bởi vì post_submit_meta_box()chỉ cần bỏ nội dung của nó ra. Không có bộ lọc nào cả. Javascript hoặc ob_start()có thể giải quyết điều đó. Cả hai không thanh lịch lắm.
fuxia

Hừm, được rồi, tôi đã thêm một số mã để loại bỏ nút Lưu ban đầu. Không quá khó. :)
fuxia

Tôi nhớ các từ để mô tả điều này :) - & đã nói trước đây: việc sử dụng dấu phẩy để định dạng mảng xứng đáng với Giải thưởng Trình định dạng PHP +1+
brasofilo

11

Mã cho đề xuất của hakre để sử dụng bộ lọc dịch sẽ giống như thế này:

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

function change_publish_button( $translation, $text ) {

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

return $translation;
}

Có lý do nào khiến "phiên bản 1" (câu trả lời được chấp nhận hiện tại, được viết bởi @toscho) là vượt trội / kém hơn so với phương pháp này không? Điều này dường như là tốt hơn đối với tôi - đơn giản hơn, không yêu cầu hack để loại bỏ nút "Lưu" và là bằng chứng trong tương lai nhiều hơn.
rinogo

Câu trả lời của bạn đã truyền cảm hứng cho tôi - Tôi đã phát triển cách tiếp cận của bạn để bao quát nhiều chuỗi hơn. wordpress.stackexchange.com/a/230513/10388
rinogo

2
Nhược điểm là bộ lọc dịch sẽ kích hoạt rất nhiều lần, kết nối với nó là chi phí hiệu năng đáng kể. Điều này có thể được giảm bằng cách chỉ lọc trong một thời gian giới hạn bằng cách thêm / xóa bộ lọc gần với điểm cần thiết trong thời gian chạy.
Hết

4

Đây không phải là một câu trả lời đầy đủ mà là một số hướng: Bất kỳ văn bản nào được hiển thị đều vượt qua bộ lọc dịch và do đó có thể được thay đổi trong chức năng gọi lại (hook). Vì vậy, nếu hook chỉ được đăng ký trên trang mà bạn muốn thay đổi điều đó, công việc đã hoàn thành.

Nút dự thảo có thể được "loại bỏ" bằng cách ẩn nó qua CSS. CSS có thể được đưa vào <head>-tag của quản trị viên bằng một cuộc gọi lại khác. Tôi nghĩ rằng bộ lọc được gọi admin_headcho điều đó. Nó bằng cách nào đó bẩn vì nút vẫn còn đó, ví dụ nếu người dùng tắt CSS.


3

Để thống nhất, tôi cho rằng bạn thích sử dụng "Lưu" thay vì "Xuất bản" trong suốt Wordpress thay vì chỉ trên văn bản của nút.

Hộp meta

Danh sách bài

Dựa trên giải pháp được cung cấp bởi @Rarst, tôi đã mở rộng mã để nó dịch nhiều (tất cả?) Các trường hợp khác của từ "Xuất bản" sang biến thể thích hợp của "Lưu".

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

Để loại bỏ nút Nháp, câu trả lời được đưa ra bởi @toscho chứa một giải pháp tốt.


Lưu ý: Biến không xác định: s
Amjad

@Amjad - Hãy thử thay đổi tất cả các trường hợp %1$sthành %1\$s. Hoặc, tắt thông báo / cảnh báo sẽ ẩn những lỗi này.
rinogo

Tôi cần phải giữ các thông báo và cảnh báo về việc gỡ lỗi. Nhưng cảm ơn vì điều này. Các lỗi không hiển thị nữa bằng cách thêm \
Amjad

2

Một cách tiếp cận khác sẽ hủy đăng ký metabox, sau đó đăng ký lại cùng một hộp với các giá trị khác nhau, đặt tên là văn bản xuất bản ..

Xem cuộc thảo luận tôi đã có ở đây về việc di chuyển một hộp meta, bạn sẽ có thể áp dụng một cái gì đó tương tự để đổi tên văn bản Xuất bản đó.


0

Bạn chỉ có thể tìm thấy nút thông qua jQuery và trao đổi nút văn bản để lấy thứ khác. Đó sẽ là một miếng bánh để làm.


0

Giải pháp sạch hơn & dễ dàng hơn.

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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.