Existe-t-il un moyen de changer le texte du bouton de publication sur un type de message personnalisé pour en dire un autre? Par exemple, Enregistrer au lieu de Publier. Et aussi supprimer le bouton brouillon?
Si vous regardez dans /wp-admin/edit-form-advanced.php
, vous trouverez la boîte de méta:
add_meta_box('submitdiv', __('Publish'), 'post_submit_meta_box', $post_type, 'side', 'core');
Notez que __('Publish')
- la fonction __()
mène à translate()
où vous obtenez le filtre 'gettext'
.
Il existe deux manières de gérer votre problème: 1. Adressez la chaîne dans une seule fonction spécialisée (veillez à bien faire correspondre le textdomain correct!) Ou 2. Utilisez une approche plus générique.
@Rarst a tout à l'heure posté la version 1, je vais donc ajouter la version 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' )
)
);
Vous n'avez pas besoin d'utiliser le code en tant que plugin. L'inclure dans le functions.php de votre thème suffira.
Pour supprimer le bouton Enregistrer original (vous ne savez pas ce que le bouton "brouillon" est), ajoutez le code suivant à votre fichier functions.php/a:
add_action( 'admin_print_footer_scripts', 'remove_save_button' );
function remove_save_button()
{
?>
<script>
jQuery(document).ready(function($){$('#save-post').remove();});
</script><?php
}
Oui, c'est moche.
Le code pour la suggestion de hakre d'utiliser un filtre de traduction ressemblerait à ceci:
add_filter( 'gettext', 'change_publish_button', 10, 2 );
function change_publish_button( $translation, $text ) {
if ( $text == 'Publish' )
return 'Save';
return $translation;
}
Il ne s’agit pas d’une réponse complète mais de quelques indications: tout texte affiché dépasse un filtre de traduction et peut donc être modifié dans une fonction de rappel (hook). Donc, si le crochet est uniquement enregistré sur la page où vous souhaitez changer cela, le travail est fait.
Le bouton de brouillon peut être "supprimé" en le masquant via CSS. Le CSS pourrait être injecté dans la balise <head>
- de l'administrateur avec un autre rappel. Je pense que le filtre s'appelle admin_head
pour cela. C'est en quelque sorte sale car le bouton est toujours là, par exemple si un utilisateur désactive CSS.
Par souci de cohérence, je suppose que vous préféreriez utiliser "Enregistrer" au lieu de "Publier" dans Wordpress plutôt que sur le texte du bouton.
Sur la base de la solution fournie par @Rarst, j'ai développé le code afin qu'il traduise de nombreuses autres instances du mot "Publier" en une variante appropriée de "Enregistrer".
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;
}
Pour supprimer le bouton Brouillon, la réponse donnée par @toscho contient une bonne solution.
Une autre approche serait d'annuler l'enregistrement de la métabox, puis de réenregistrer cette même boîte avec des valeurs différentes, nommément le texte de publication.
Voir la discussion que j'avais ici concernant le déplacement d’une méta-boîte, vous devriez pouvoir appliquer quelque chose de similaire pour renommer ce texte.
Vous pouvez simplement trouver le bouton via jQuery et permuter le nœud de texte pour autre chose. Ce serait un morceau de gâteau à faire.
Solution beaucoup plus propre et plus facile.
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);