wp_editor textarea value not update

16

J'utilise l' *_add_form_fieldsaction pour ajouter des champs à une taxonomie personnalisée. L'un de ces champs est wp_editor ().

Le problème auquel je suis confronté est que lorsque je génère l'éditeur WordPress sur la page comme suit:

wp_editor('test', 'mydescription', array('textarea_name' => 'my_description')); 

puis si je clique dans l'éditeur sur la page et changer la valeur par défaut de testà something elsela $_POST['my_description']variable de est toujours fixé àtest

Dois-je ajouter un paramètre supplémentaire à mon éditeur? Y a-t-il une raison pour laquelle je ne peux pas modifier la valeur de la zone de texte?

ÉDITER

Voici un cas de test très simple qui montre que cela se produit. Placez-le dans votre fichier functions.php, puis créez une nouvelle balise . La valeur publiée pour 'my_description "ne changera pas.

class Test{

    function __construct() {

        add_action('add_tag_form_fields', array($this, 'add_tag_form_fields'));

        add_action('created_term', array($this, 'created_term'));
    }

    function add_tag_form_fields($tag){

        if ( current_user_can( 'publish_posts' ) ): ?>

        <div class="form-field">
            <?php wp_editor('test', 'mydescription', array('textarea_name' => 'my_description')); ?>
        </div>

        <?php
    }

    function created_term($tag){
        echo '<pre>';
        print_r($_POST);
        echo '</pre>';
            die();
    }
}
new Test();

ÉDITER

Cela se produit UNIQUEMENT lors de l'attachement à l'action "created_term". Si vous attachez à "edit_terms" cela fonctionne comme prévu et je pense que c'est le résultat de l'ajax utilisé sur la page de création de termes ... J'ai mis à jour le code de test pour le montrer.

Mike
la source
Cela a changé pour moi: Array ( [action] => add-tag [screen] => edit-post_tag [taxonomy] => post_tag [post_type] => post [_wpnonce_add-tag] => 4f7d3df228 [_wp_http_referer] => /wp-admin/edit-tags.php?taxonomy=post_tag [tag-name] => Test99 [slug] => [description] => [my_description] => something else )peut-être que quelque chose d'autre dans votre code pose problème?
Rob Vermeer
voir deuxième édition. Il semble que cela ne se produise que lorsque vous "ajoutez" un terme.
Mike

Réponses:

21

L' <textarea> élément tinyMCE n'est initialement pas vu par la fonction de sérialisation utilisée:

$.post(
    ajaxurl,
    $('#addtag').serialize(), function(r) {
        // Content here.
    }
});

Vous devrez appeler tinyMCE.triggerSave()pour le rendre visible.

Voici un extrait simple qui devrait faire l'affaire:

jQuery('#submit').mousedown( function() {
    tinyMCE.triggerSave();
});

Ceci dans un fichier externe, mis en file d'attente avec wp_enqueue_script(); cela a fonctionné pour le test que j'ai effectué.

ungestaltbar
la source
1
Cela ne fonctionne pas pour moi. Il semble que les données soient publiées, PUIS votre code de fonction de clic est déclenché.
Mike
avez-vous mis le script en file d'attente dans la tête? si vous le mettez en file d'attente dans le pied de page, il sera chargé après les scripts wp et ce serait trop tard.
ungestaltbar
au lieu de «cliquer», vous pouvez en fait le lier à $ («# submit»). mousedown (...) :) dans ce cas, peu importe où et quand le script est chargé.
ungestaltbar
Fonctionné comme un charme merci!
nitigyan
4

Dans votre edited_termsfonction, vous devez enregistrer la valeur et dans votre, add_tag_form_fields vous devez remplacer votre testpar les données enregistrées.

quelque chose comme:

class Test{

    function __construct() {

        //do_action('add_tag_form_fields', $taxonomy);
        add_action('add_tag_form_fields', array($this, 'add_tag_form_fields'));

        //do_action("edited_terms", $term_id, $tt_id, $taxonomy);
        add_action('edited_terms', array($this, 'edited_terms'));
    }

    function add_tag_form_fields($term){

        if ( current_user_can( 'publish_posts' ) ): ?>

        <div class="form-field">
            <?php 
            $saved = get_option('termmeta_'.$term->term_id);
            $saved = (empty($saved))? 'test': $saved;
            wp_editor($saved, 'mydescription', array('textarea_name' => 'my_description')); ?>
        </div>

        <?php
    }

    function edited_terms($term_id){
        if (isset($_POST['mydescription'])){
            update_option('termmeta_'.$term_id,$_POST['mydescription']);
        }
    }
}
new Test();

Maintenant, si vous voulez un moyen beaucoup plus simple d'ajouter des champs supplémentaires de tous types à vos balises / catégories ou des formulaires d'édition de taxonomie personnalisés sans réinventer la roue, jetez un œil à TAX Meta Class

Bainternet
la source
Voir mon deuxième commentaire, il semble que cela ne se produit que lors de l'ajout d'un terme. Et je pense que c'est le résultat de l'utilisation de ajax.
Mike
@Mike quel Ajax où utilisez-vous Ajax?
Bainternet
Lorsque vous ajoutez une nouvelle catégorie / terme, WordPress utilise ajax pour publier les données et créer le nouveau terme. Pour une raison quelconque, cela ne permet pas à l'élément wp_editor d'avoir la valeur correcte. Essayez le code de test dans la question d'origine.
Mike
1

Selon le codex pour wp_editor, le premier argument devrait être le contenu. Donc, plutôt que de «tester», vous devriez mettre $_POST['my_description']si c'est ce que vous souhaitez que le contenu initial soit.

raton laveur
la source
2
le problème ne vient pas du fait que le contenu s'affiche correctement. C'est avec la variable publiée étant le même que le contenu d'origine même si vous changez le contenu de la zone de texte en autre chose.
Mike