web-dev-qa-db-fra.com

Comment empêcher le texte modifié à l'aide du filtre gettext d'être écrasé (vraisemblablement) par la fonction updateText () js dans l'écran d'édition du CPT

D'abord, un petit peu d'arrière-plan ... J'ai un type de publication personnalisé dans lequel j'aimerais utiliser les statuts de publication personnalisés. Étant donné que les statuts personnalisés (stati/status/que ce soit) , n'ayant pas été complètement implémentés dans le noyau, j'ai décidé d'utiliser les filtres gettetext pour changer les noms de certaines choses. Par exemple, j'ai modifié le texte "Publier" sur le bouton de publication pour indiquer "Enregistrer". Je suis allé avec quelque chose comme l'approche de Rarst ici . Un résumé de mon code est ci-dessous. Je ne veux vraiment rien de radical ici pour changer ce que chaque statut fait/est.

Quoi qu'il en soit, la traduction fonctionne parfaitement en ce qui concerne PHP. Cependant, lors des tests, je me suis rendu compte que si je cliquais sur le lien Modifier dans la division actions de publication diverses, puis que je cliquais sur le lien annuler affiché par la suite, le bouton "Enregistrer" traduit deviendrait un bouton "Publier".

Cela semble arriver à la suite de la fonction javascript updateText() TROUVÉE DANS /wp-admin/js/post.dev.js . Je cherche un moyen d'empêcher le JS de frapper ma traduction. Je préférerais ne pas simplement jouer avec la manipulation du DOM, mais si c'est ma seule option, j'y vais. Je suis en cours d'exécution 3.1, d'ailleurs.

<?php
class MyClass {

        function __contsruct() {
            add_action( 'admin_head', array ( &$this, 'load_gettext_filters' ) );
        }

        function load_gettext_filters() {
            add_filter( 'gettext', array ( &$this, 'change_publishing_text' ), 10, 2 );
        }

        function change_publishing_text( $translation, $text ) {
            global $post;

            if ( ! isset ( $post->post_type ) ) {
                return $translation;
            }

            if ( 'mypost' === $post->post_type ) {
                if ( ( 'Publish' === $text ) ) {
                    return 'Save';
                }
            }
            return $translation;
        }

    }
4
Dave Romsey

D'abord, vous avez une mauvaise typo dans __contsruct. :)

Deuxièmement, le moment choisi pour vous accrocher est incorrect. En relation WP JavaScript est localisé via l'objet postL10n (vous pouvez le voir en écho dans le source de la page), qui est mis en place sur le crochet init plus tôt que admin_head et votre filtre n'est pas encore en place.

De test rapide cela devrait le faire:

add_action( 'init', array ( &$this, 'load_gettext_filters' ), 9 );

Mettre à jour

Ok, grattez ça. Ne fonctionnera pas si nous avons besoin de contexte. Essayons ça:

add_action('admin_footer', array ( &$this, 'localize_post_script' ) );

    function localize_post_script() {

        global $wp_scripts;

        $wp_scripts->registered['post']->extra['l10n'][1]['publish'] = __('Publish');
    }
3
Rarst

Vous avez tous les deux la bonne idée, mais vous aurez en fait besoin des deux filtres: un pour saisir le texte du bouton, un autre pour capturer le texte localisé, donc une combinaison des deux.

Cela marche..

class MyClass {
    function __construct() {
        add_action('admin_head-post.php',     array ( $this, 'load_gettext_filters' ), 1 );
        add_action('admin_head-post-new.php', array ( $this, 'load_gettext_filters' ), 1 );
    }

    function load_gettext_filters() {
        global $post_type, $wp_scripts;

        if( 'YOURTYPENAMEHERE' != $post_type )
            return;

        $wp_scripts->registered['post']->extra['l10n'][1]['publish'] = __('Save');

        add_filter( 'gettext', array ( $this, 'change_publishing_text' ), 10, 2 );
    }

    function change_publishing_text( $translation, $text ) {
        if( 'Publish' != $text )
            return $translation;

        return __( 'Save' );
    }
}
$MyClass = new MyClass;
5
t31os