Modifiez le texte du bouton Publier

21

Existe-t-il un moyen de modifier le texte du bouton de publication sur un type de publication personnalisé pour en dire différents? Par exemple, enregistrez au lieu de publier. Et aussi supprimer le bouton brouillon?

Paul Sheldrake
la source

Réponses:

16

Si vous regardez /wp-admin/edit-form-advanced.php, vous trouverez la méta-boîte:

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

Notez la __('Publish')- la fonction __()mène à l' translate()endroit où vous obtenez le filtre 'gettext'.

Il existe deux façons de gérer votre problème: 1. Adressez la chaîne dans une seule fonction spécialisée (assurez-vous de faire correspondre le bon domaine de texte!) Ou 2. utilisez une approche plus générique.

@Rarst vient de publier 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 comme plugin. L'inclure dans les fonctions de votre thème.php sera suffisant.

Mise à jour

Pour supprimer le bouton Enregistrer d'origine (vous ne savez pas quel est le bouton `` brouillon ''), ajoutez le code suivant à votre plugin 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.

fuxia
la source
1
C'est plus comme la version 20 :) Code génial!
Rarst
Je l'aime aussi. Toujours manquant pour masquer l'autre bouton.
hakre
La suppression du bouton d'enregistrement est vraiment difficile, car il post_submit_meta_box()suffit de vider son contenu. Pas de filtre du tout. Javascript ou ob_start()pourrait résoudre ce problème. Les deux ne sont pas très élégants.
fuxia
Hm, d'accord, j'ai ajouté du code pour supprimer le bouton Enregistrer d'origine. Ce n'était pas si difficile. :)
fuxia
Je manque de mots pour décrire cela :) - et je l'ai déjà dit: l'utilisation de la virgule pour formater le tableau mérite un PHP Formatters Award +1+
brasofilo
11

Le code pour la suggestion de hakre d'utiliser le filtre de traduction serait quelque chose comme ceci:

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

function change_publish_button( $translation, $text ) {

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

return $translation;
}
Rarst
la source
Y a-t-il des raisons pour lesquelles la "version 1" (la réponse actuellement acceptée, écrite par @toscho) est supérieure / inférieure à cette approche? Cela me semble être le meilleur des deux - plus simple, ne nécessite pas de piratage pour supprimer le bouton "Enregistrer" et est plus à l'épreuve du temps.
rinogo
Votre réponse m'a inspiré - j'ai évolué votre approche pour couvrir beaucoup plus de chaînes. wordpress.stackexchange.com/a/230513/10388
rinogo
2
L'inconvénient serait que le filtre de traduction se déclenche de nombreuses fois, ce qui représente une surcharge de performances importante. Cela peut être réduit en filtrant uniquement pendant un temps limité en ajoutant / supprimant le filtre près du point nécessaire lors de l'exécution.
Rarst
4

Ce n'est pas une réponse complète mais 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 n'est enregistré que sur la page où vous souhaitez changer cela, le travail est fait.

Le bouton brouillon pourrait être "supprimé" en le masquant via CSS. Le CSS pourrait être injecté dans le <head>-tag de l'administrateur avec un autre rappel. Je pense que le filtre est appelé admin_headpour cela. C'est en quelque sorte sale car le bouton est toujours là, par exemple si un utilisateur désactive CSS.

hakre
la source
3

Par souci de cohérence, je suppose que vous préférez utiliser "Enregistrer" au lieu de "Publier" dans Wordpress au lieu de simplement sur le texte du bouton.

Meta box

Liste des articles

Sur la base de la solution fournie par @Rarst, j'ai développé le code afin qu'il traduise de nombreuses (toutes?) Autres instances du mot "Publier" dans la 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.

rinogo
la source
Remarque: variable non
Amjad
@Amjad - Essayez de changer toutes les instances de %1$s en %1\$s. Ou, la désactivation des notifications / avertissements masquera ces erreurs.
rinogo
J'ai besoin de garder des avis et des avertissements pour le débogage. Mais merci pour ça. Les erreurs n'apparaissent plus en ajoutant que \
Amjad
2

Une autre approche serait de désenregistrer 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'ai eue ici concernant le déplacement d'une méta-boîte, vous devriez être en mesure d'appliquer quelque chose de similaire pour renommer ce texte de publication.

t31os
la source
0

Vous pouvez simplement trouver le bouton via jQuery et échanger le nœud de texte pour autre chose. Ce serait un morceau de gâteau à faire.

Dan Gayle
la source
0

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);
Le J
la source