web-dev-qa-db-fra.com

Changer le texte sur le bouton Publier

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?

21
Paul Sheldrake

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.

Mettre à jour

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.

16
fuxia

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

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.

4
hakre

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.

 Meta box 

 Post list 

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.

3
rinogo

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.

2
t31os

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.

0
Dan Gayle

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);
0
The J