Modificare text buton Publicare

3 nov. 2010, 00:29:07
Vizualizări: 19.8K
Voturi: 24

Există o modalitate de a schimba textul butonului de publicare pentru un tip de postare personalizat, astfel încât să afișeze un text diferit? De exemplu, să afișeze "Salvează" în loc de "Publică". Și, de asemenea, să eliminați butonul de ciornă?

0
Toate răspunsurile la întrebare 7
7
18

Dacă te uiți în /wp-admin/edit-form-advanced.php, vei găsi meta box-ul:

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

Observă __('Publish') – funcția __() duce la translate() unde ai acces la filtrul 'gettext'.

Există două modalități de a rezolva problema ta: 1. Abordează șirul într-o singură funcție specializată (asigură-te că utilizezi textdomain-ul corect!) sau 2. folosește o abordare mai generică.

@Rarst tocmai a postat varianta 1, așa că voi adăuga varianta 2. :)

<?php
/*
Plugin Name: Retranslate
Description: Adaugă traduceri.
Version:     0.1
Author:      Thomas Scholz
Author URI:  http://toscho.de
License:     GPL v2
*/

class Toscho_Retrans {
    // stochează opțiunile
    protected $params;

    /**
     * Configurează informațiile de bază
     * 
     * @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 );

        // Când să adaugi filtrul
        $hook = 'backend' == $this->params['context'] 
            ? 'admin_head' : 'template_redirect';

        add_action( $hook, array ( $this, 'register_filter' ) );
    }

    /**
     * Container pentru add_filter()
     * @return void
     */
    public function register_filter()
    {
        add_filter( 'gettext', array ( $this, 'translate' ), 10, 3 );
    }

    /**
     * Codul care face treaba.
     * 
     * @param  string $translated
     * @param  string $original
     * @param  string $domain
     * @return string
     */
    public function translate( $translated, $original, $domain )
    {
        // ieși rapid
        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;
        }

        // Înlocuiește în final
        return strtr( $original, $this->params['replacements'] );
    }
}

// Cod exemplu
// Înlocuiește 'Publish' cu 'Salvează' și 'Preview' cu 'Previzualizează' pe pagini și articole
$Toscho_Retrans = new Toscho_Retrans(
    array (
        'replacements' => array ( 
            'Publish' => 'Salvează'
        ,   'Preview' => 'Previzualizează' 
        )
    ,   'post_type'    => array ( 'page', 'post' )
    )
);

Nu este necesar să folosești codul ca plugin. Includerea lui în functions.php al temei tale va fi suficient.

Actualizare

Pentru a elimina butonul original de Salvare (nu sunt sigur ce este butonul 'draft'), adaugă următorul cod în functions.php/un plugin:

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

Da, este urât.

5 nov. 2010 10:08:11
Comentarii

Asta seamănă mai mult cu versiunea 20 :) Cod minunat!

Rarst Rarst
5 nov. 2010 10:22:00

Și mie îmi place. Încă mai lipsește ascunderea celuilalt buton.

hakre hakre
6 nov. 2010 20:49:17

Eliminarea butonului de salvare este foarte dificilă, deoarece post_submit_meta_box() doar afișează conținutul său. Nu există niciun filtru. Javascript sau ob_start() ar putea rezolva asta. Ambele soluții nu sunt foarte elegante.

fuxia fuxia
6 nov. 2010 23:21:28

Hm, bine, am adăugat niște cod pentru a elimina butonul original Salvează. Nu a fost atât de greu. :)

fuxia fuxia
6 nov. 2010 23:55:26

Îmi lipsesc cuvintele pentru a descrie asta :) - și am mai spus-o: folosirea virgulei pentru a formata array-ul merită un Premiu PHP pentru Formatoare +1+

brasofilo brasofilo
17 mai 2012 17:45:07

Mulțumesc pentru acest cod! Întrebare sinceră - care sunt avantajele acestei abordări ("versiunea 1") în comparație cu codul lui @Rarst ("versiunea 2")? Folosirea gettext pare abordarea mai curată aici, deoarece nu vrem să schimbăm nicio funcționalitate, doar textul - exact pentru ce a fost conceput gettext. De asemenea, Versiunea 2 este probabil mai rezistentă la viitor.

rinogo rinogo
23 iun. 2016 03:51:23

@rinogo Ambele versiuni folosesc filtrul gettext. A mea este pur și simplu reutilizabilă pentru orice text.

fuxia fuxia
23 iun. 2016 04:19:41
Arată celelalte 2 comentarii
3
15

Codul pentru sugestia lui hakre de a utiliza filtrul de traducere ar arăta cam așa:

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

function change_publish_button( $translation, $text ) {

if ( $text == 'Publish' )
    return 'Salvează';

return $translation;
}
5 nov. 2010 08:44:51
Comentarii

Există motive pentru care "versiunea 1" (răspunsul acceptat în prezent, scris de @toscho) este superioară/inferioară acestei abordări? Aceasta mi se pare cea mai bună dintre cele două - mai simplă, nu necesită hack-uri pentru a elimina butonul "Save" și este mai viabilă pe termen lung.

rinogo rinogo
23 iun. 2016 03:53:41

Răspunsul tău m-a inspirat - am evoluat abordarea ta pentru a acoperi mult mai multe șiruri. http://wordpress.stackexchange.com/a/230513/10388

rinogo rinogo
23 iun. 2016 05:33:29

Dezavantajul ar fi că filtrul de traducere se activează de foarte multe ori, iar conectarea la el reprezintă o suprasolicitare semnificativă a performanței. Aceasta poate fi redusă prin filtrarea doar pentru o perioadă limitată de timp, adăugând/eliminând filtrul aproape de punctul necesar în timpul de execuție.

Rarst Rarst
29 iun. 2016 16:24:56
0

Acesta nu este un răspuns complet, ci doar câteva indicații: Orice text afișat trece printr-un filtru de traducere și poate fi modificat într-o funcție de callback (hook). Deci, dacă hook-ul este înregistrat doar pe pagina unde doriți să schimbați acel text, problema este rezolvată.

Butonul de "draft" poate fi "eliminat" prin ascunderea lui via CSS. CSS-ul poate fi injectat în tag-ul <head> al panoului de administrare cu un alt callback. Cred că filtrul se numește admin_head pentru asta. Este o soluție puțin murdară, deoarece butonul este încă acolo, de exemplu dacă un utilizator dezactivează CSS-ul.

4 nov. 2010 04:23:12
3

Pentru consistență, presupun că ai prefera să folosești "Salvează" în loc de "Publică" în întregul Wordpress, nu doar pe textul butonului.

Caseta Meta

Lista de postări

Bazându-mă pe soluția oferită de @Rarst, am extins codul astfel încât să traducă multe (toate?) celelalte instanțe ale cuvântului "Publică" în variația corespunzătoare a "Salvează".

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 "Salvează";
        case "Published on: <b>%1\$s</b>":  return "Salvat pe: <b>%1\$s</b>";
        case "Publish <b>immediately</b>":  return "Aprobă <b>imediat</b>";
        case "Publish on: <b>%1\$s</b>":    return "Aprobă pe: <b>%1\$s</b>";
        case "Privately Published":         return "Salvat privat";
        case "Published":                   return "Salvat";
        case "Save & Publish":              return "Salvează"; //"Dublu-salvare"? :)
        default:                            return $translation;
    }
}

function translate_publish_post_status_number($translation, $single, $plural, $number, $domain) {
    if($translation == "Published <span class=\"count\">(%s)</span>") {
        return "Salvat <span class=\"count\">(%s)</span>";
    }

    return $translation;
}

Pentru eliminarea butonului Draft, răspunsul dat de @toscho conține o soluție bună.

23 iun. 2016 05:32:13
Comentarii

Notificare: Variabilă nedefinită: s

Amjad Amjad
2 mai 2017 02:16:56

@Amjad - Încearcă să schimbi toate aparițiile %1$s în %1\$s. Sau, dezactivarea notificărilor/avertismentelor va ascunde aceste erori.

rinogo rinogo
2 mai 2017 19:11:54

Am nevoie să păstrez notificările și avertismentele activate pentru depanare. Dar mulțumesc pentru asta. Erorile nu mai apar prin adăugarea acelui \

Amjad Amjad
2 mai 2017 21:31:52
0

O altă abordare ar fi dezînregistrarea metabox-ului, apoi reînregistrarea aceluiași box cu valori diferite, în special textul de publicare..

Vezi discuția pe care am avut-o aici referitor la mutarea unui meta box, ar trebui să poți aplica ceva similar pentru a redenumi acel text de Publicare.

5 nov. 2010 12:40:06
0

Ai putea pur și simplu să găsești butonul folosind jQuery și să înlocuiești nodul de text cu altceva. Asta ar fi floare la ureche de făcut.

5 nov. 2010 04:53:44
0

Soluție mult mai curată și mai ușoară.

function change_publish_btn_txt() {
    echo "<script type='text/javascript'>jQuery(document).ready(function(){
        jQuery('#publish').attr('value', 'Textul tău personalizat');
    });</script>";
}
add_action('admin_footer-post-new.php', 'change_publish_btn_txt', 99);
24 aug. 2016 17:50:54