Cambia il testo sul pulsante Pubblica


21

C'è un modo per cambiare il testo del pulsante di pubblicazione su un tipo di post personalizzato per dire qualcosa di diverso? Ad esempio, Salva anziché Pubblica. E anche rimuovere il pulsante bozza?

Risposte:


16

Se guardi dentro /wp-admin/edit-form-advanced.php, troverai la meta box:

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

Nota __('Publish'): la funzione __()porta a translate()dove ottieni il filtro 'gettext'.

Esistono due modi per gestire il problema: 1. Indirizzare la stringa in una singola funzione specializzata (assicurarsi che corrisponda al dominio di testo corretto!) Oppure 2. utilizzare un approccio più generico.

@Rarst ha appena pubblicato la versione 1, quindi aggiungerò la versione 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' )
    )
);

Non è necessario utilizzare il codice come plugin. Includerlo nelle funzioni.php del tuo tema sarà sufficiente.

Aggiornare

Per rimuovere il pulsante Salva originale (non sei sicuro di quale sia il pulsante "bozza"), aggiungi il seguente codice al tuo plugin.php / a settings:

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

Sì, è brutto.


1
È più simile alla versione 20 :) Codice fantastico!
Rarst

Anche a me piace. Manca ancora per nascondere l'altro pulsante.
Hakre,

Rimuovere il pulsante di salvataggio è davvero difficile, perché ne post_submit_meta_box()scarica semplicemente il contenuto. Nessun filtro. Javascript o ob_start()potrebbe risolverlo. Entrambi non molto eleganti.
fuxia

Ok, ho aggiunto del codice per rimuovere il pulsante Salva originale. Non è stato così difficile. :)
fuxia

Mi mancano le parole per descriverlo :) - e l'ho detto prima: l'uso della virgola per formattare l'array merita un PHP Formatters Award +1+
brasofilo,

11

Il codice per il suggerimento di hakre di usare il filtro di traduzione sarebbe qualcosa del genere:

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

function change_publish_button( $translation, $text ) {

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

return $translation;
}

Ci sono ragioni per cui la "versione 1" (l'attuale risposta accettata, scritta da @toscho) è superiore / inferiore a questo approccio? Questo sembra essere il migliore dei due per me - più semplice, non richiede hack per rimuovere il pulsante "Salva" ed è più a prova di futuro.
Rinogo,

La tua risposta mi ha ispirato: ho evoluto il tuo approccio per coprire molte più stringhe. wordpress.stackexchange.com/a/230513/10388
rinogo,

2
Il rovescio della medaglia sarebbe che il filtro di traduzione si attiva molte volte, l'aggancio in esso è un notevole sovraccarico di prestazioni. Questo può essere ridotto solo filtrando per un tempo limitato aggiungendo / rimuovendo il filtro vicino al punto necessario in fase di esecuzione.
Rarst

4

Questa non è una risposta completa ma alcune indicazioni: qualsiasi testo visualizzato supera un filtro di traduzione e può quindi essere modificato in una funzione di richiamata (hook). Quindi, se l'hook è registrato solo nella pagina in cui desideri cambiarlo, lavoro fatto.

Il pulsante bozza potrebbe essere "rimosso" nascondendolo tramite CSS. Il CSS potrebbe essere iniettato nel <head>tag dell'amministratore con un altro callback. Penso che il filtro sia chiamato admin_headper questo. È in qualche modo sporco perché il pulsante è ancora lì, ad esempio se un utente disattiva CSS.


3

Per coerenza, suppongo che preferiresti usare "Salva" invece di "Pubblica" in Wordpress anziché semplicemente sul testo del pulsante.

Meta box

Elenco dei post

Sulla base della soluzione fornita da @Rarst, ho ampliato il codice in modo che traduca molte (tutte?) Altre istanze della parola "Pubblica" nella variante appropriata di "Salva".

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

Per rimuovere il pulsante Bozza, la risposta data da @toscho contiene una buona soluzione.


Avviso: variabile non definita: s
Amjad,

@Amjad: prova a cambiare tutte le istanze di %1$sin %1\$s. In alternativa, la disattivazione di avvisi / avvisi nasconderà questi errori.
Rinogo,

Devo tenere avvisi e avvisi per il debug. Ma grazie per questo. Gli errori non vengono più visualizzati aggiungendo che \
Amjad

2

Un altro approccio sarebbe annullare la registrazione di metabox, quindi registrare nuovamente quella stessa casella con valori diversi, nominando il testo di pubblicazione.

Vedi la discussione che ho avuto qui riguardo lo spostamento di una meta-box, dovresti essere in grado di applicare qualcosa di simile per rinominare quel testo.


0

Puoi semplicemente trovare il pulsante tramite jQuery e scambiare il nodo di testo con qualcos'altro. Sarebbe un gioco da ragazzi.


0

Soluzione molto più pulita e semplice.

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);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.