Ubah teks pada tombol Terbitkan

21

Apakah ada cara untuk mengubah teks tombol publikasikan pada jenis posting kustom untuk mengatakan beberapa berbeda? Misalnya, Simpan alih-alih Terbitkan. Dan juga hapus tombol draft?

Paul Sheldrake
sumber

Jawaban:

16

Jika Anda melihat ke dalam /wp-admin/edit-form-advanced.php, Anda akan menemukan kotak meta:

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

Perhatikan __('Publish')- fungsi __()mengarah ke translate()tempat Anda mendapatkan filter'gettext' .

Ada dua cara untuk menangani masalah Anda: 1. Alamat string dalam satu fungsi khusus (pastikan untuk mencocokkan domain teks yang benar!) Atau 2. gunakan pendekatan yang lebih umum.

@Rarst baru saja memposting versi 1, jadi saya akan menambahkan versi 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' )
    )
);

Anda tidak perlu menggunakan kode sebagai plugin. Menyertakannya di functions.php tema Anda akan cukup.

Memperbarui

Untuk menghapus tombol Simpan asli (tidak yakin apa tombol 'draft' itu), tambahkan kode berikut ke plugin functions.php / a Anda:

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

Ya, itu jelek.

fuxia
sumber
1
Itu lebih seperti versi 20 :) Kode yang luar biasa!
Rarst
Saya juga menyukainya. Masih hilang untuk menyembunyikan tombol lainnya.
hakre
Menghapus tombol simpan sangat sulit, karena post_submit_meta_box()hanya membuang isinya. Tidak ada filter sama sekali. Javascript atau ob_start()bisa menyelesaikannya. Keduanya tidak terlalu elegan.
fuxia
Hm, oke, saya sudah menambahkan beberapa kode untuk menghapus tombol Simpan yang asli. Tidak terlalu sulit. :)
fuxia
Saya kehilangan kata-kata untuk menggambarkan ini :) - & mengatakannya sebelumnya: penggunaan koma untuk memformat array layak menerima PHP Formatters Award +1+
brasofilo
11

Kode untuk saran hakre untuk menggunakan filter terjemahan adalah seperti ini:

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

function change_publish_button( $translation, $text ) {

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

return $translation;
}
Jarang
sumber
Apakah ada alasan mengapa "versi 1" (jawaban yang diterima saat ini, ditulis oleh @toscho) lebih unggul / lebih rendah daripada pendekatan ini? Ini tampaknya menjadi yang terbaik bagi saya - lebih sederhana, tidak memerlukan peretasan untuk menghapus tombol "Simpan", dan lebih tahan masa depan.
rinogo
Jawaban Anda menginspirasi saya - Saya telah mengembangkan pendekatan Anda untuk mencakup lebih banyak string. wordpress.stackexchange.com/a/230513/10388
rinogo
2
Kelemahan akan bahwa terjemahan penyaring kebakaran banyak kali, mengaitkan ke itu adalah overhead kinerja yang signifikan. Ini dapat dikurangi dengan hanya memfilter untuk waktu yang terbatas dengan menambahkan / menghapus filter dekat dengan titik yang diperlukan dalam runtime.
Jarang
4

Ini bukan jawaban lengkap tetapi beberapa petunjuk: Teks apa pun yang ditampilkan melampaui filter terjemahan dan karenanya dapat diubah dalam fungsi panggilan balik (pengait). Jadi, jika kait hanya terdaftar pada halaman di mana Anda ingin mengubahnya, pekerjaan sudah selesai.

Tombol konsep dapat "dihapus" dengan menyembunyikannya melalui CSS. CSS dapat disuntikkan ke <head>-tag admin dengan panggilan balik lain. Saya pikir filter dipanggil admin_headuntuk itu. Entah bagaimana kotor karena tombol masih ada di sana, misalnya jika pengguna mematikan CSS.

hakre
sumber
3

Untuk konsistensi, saya berasumsi Anda lebih suka menggunakan "Simpan" daripada "Terbitkan" di seluruh Wordpress daripada hanya pada teks tombol.

Kotak meta

Daftar posting

Berdasarkan solusi yang disediakan oleh @Rarst, saya memperluas kode sehingga menerjemahkan banyak (semua?) Contoh lain dari kata "Terbitkan" ke variasi yang sesuai dari "Simpan".

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

Untuk menghapus tombol Draft, jawaban yang diberikan oleh @toscho berisi solusi yang baik.

rinogo
sumber
Pemberitahuan: Variabel tidak terdefinisi: s
Amjad
@Amjad - Coba ubah semua instance %1$smenjadi %1\$s. Atau, mematikan pemberitahuan / peringatan akan menyembunyikan kesalahan ini.
rinogo
Saya perlu terus pemberitahuan dan peringatan untuk debugging. Tapi terima kasih untuk ini. Kesalahan tidak muncul lagi dengan menambahkan bahwa \
Amjad
2

Pendekatan lain akan membatalkan registrasi metabox, kemudian mendaftar ulang kotak yang sama dengan nilai yang berbeda, yaitu teks yang dipublikasi ..

Lihat diskusi yang saya lakukan di sini mengenai pemindahan kotak meta, Anda seharusnya dapat menerapkan sesuatu yang mirip dengan mengganti nama teks yang Diterbitkan itu.

t31os
sumber
0

Anda bisa menemukan tombolnya melalui jQuery dan menukar simpul teks dengan yang lain. Itu akan menjadi sepotong kue untuk dilakukan.

Dan Gayle
sumber
0

Solusi yang jauh lebih bersih & mudah.

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