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?
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:
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.
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.
post_submit_meta_box()
scarica semplicemente il contenuto. Nessun filtro. Javascript o ob_start()
potrebbe risolverlo. Entrambi non molto eleganti.
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;
}
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_head
per questo. È in qualche modo sporco perché il pulsante è ancora lì, ad esempio se un utente disattiva CSS.
Per coerenza, suppongo che preferiresti usare "Salva" invece di "Pubblica" in Wordpress anziché semplicemente sul testo del pulsante.
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.
%1$s
in %1\$s
. In alternativa, la disattivazione di avvisi / avvisi nasconderà questi errori.
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.
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);