El valor del textarea en wp_editor no se actualiza al crear términos

20 ene 2012, 20:45:57
Vistas: 14.4K
Votos: 17

Estoy usando la acción *_add_form_fields para agregar campos a una taxonomía personalizada. Uno de esos campos es un wp_editor().

El problema que enfrento es que cuando muestro el editor de WordPress en la página así:

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

y luego si hago clic en el editor en la página y cambio el valor por defecto de test a algo más la variable $_POST['my_description'] sigue establecida en test

¿Debería agregar una configuración adicional a mi editor? ¿Hay alguna razón por la que no pueda cambiar el valor del textarea?

EDITADO

A continuación un caso de prueba muy simple que muestra esto ocurriendo. Coloca esto en tu archivo functions.php y luego crea una nueva etiqueta. El valor enviado para 'my_description' no cambiará.

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();

EDITADO

Esto SOLO ocurre cuando se adjunta a la acción "created_term". Si lo adjuntas a "edited_terms" funciona como se espera y creo que esto es resultado del uso de ajax en la página de creación de términos... He actualizado el código de prueba para mostrar esto.

2
Comentarios

Cambió para mí: 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 ), ¿quizás hay otro problema en tu código?

Rob Vermeer Rob Vermeer
24 ene 2012 00:50:50

ver segunda edición. Parece que esto solo ocurre cuando "añades" un término.

Mike Mike
24 ene 2012 18:58:47
Todas las respuestas a la pregunta 3
4
25

El elemento <textarea> de tinyMCE inicialmente no es detectado por la función de serialización utilizada:

$.post(
    ajaxurl,
    $('#addtag').serialize(), function(r) {
        // Contenido aquí.
    }
});

Necesitarás llamar a tinyMCE.triggerSave() para hacerlo visible.

A continuación, un fragmento simple que debería solucionarlo:

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

Esto en un archivo externo, encolado con wp_enqueue_script(); funcionó en las pruebas que he realizado.

26 ene 2012 17:51:41
Comentarios

Esto no funciona para mí. Parece que los datos se publican, LUEGO se activa tu código de función de clic.

Mike Mike
26 ene 2012 21:47:43

¿Encolaste el script en el head? Si lo encolas en el footer, se cargará después de wp-scripts y sería demasiado tarde.

ungestaltbar ungestaltbar
26 ene 2012 22:15:53

en lugar de 'click' podrías vincularlo a $('#submit').mousedown( ... ) :)

en ese caso no debería importar dónde ni cuándo se cargue el script.

ungestaltbar ungestaltbar
26 ene 2012 22:29:48

¡Funcionó perfectamente, gracias!

nitigyan nitigyan
22 mar 2019 21:49:09
3

En tu función edited_terms necesitas guardar el valor y en tu add_tag_form_fields debes reemplazar tu test con los datos guardados.

Algo como:

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();

Ahora bien, si quieres una forma mucho más fácil de añadir campos adicionales de todo tipo a tus etiquetas/categorías o formularios de edición de taxonomías personalizadas sin reinventar la rueda, echa un vistazo a TAX Meta Class

24 ene 2012 01:36:23
Comentarios

Mira mi segundo comentario, parece que esto solo ocurre al agregar un término. Y creo que es resultado de que usa ajax.

Mike Mike
24 ene 2012 18:59:18

@Mike ¿qué Ajax? ¿dónde estás usando Ajax?

Bainternet Bainternet
24 ene 2012 19:47:26

Cuando agregas una nueva categoría/término, WordPress usa ajax para enviar los datos y crear el nuevo término. Por alguna razón esto no permite que el elemento wp_editor tenga el valor correcto. Prueba el código de prueba de la pregunta original.

Mike Mike
24 ene 2012 21:01:50
1

Según el codex para wp_editor, el primer argumento debe ser el contenido. Así que en lugar de 'test' deberías poner $_POST['mi_descripcion'] si eso es lo que te gustaría que fuera el contenido inicial.

20 ene 2012 21:25:44
Comentarios

el problema no es que el contenido se muestre correctamente. Es que la variable enviada sigue siendo la misma que el contenido original incluso si cambias el contenido del textarea a otra cosa.

Mike Mike
20 ene 2012 21:38:12