Значение textarea в wp_editor не обновляется

20 янв. 2012 г., 20:45:57
Просмотры: 14.4K
Голосов: 17

Я использую действие *_add_form_fields для добавления полей к пользовательской таксономии. Одно из этих полей - это wp_editor().

Проблема, с которой я столкнулся: когда я вывожу редактор WordPress на странице вот так:

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

и затем, если я кликаю в редакторе на странице и изменяю значение по умолчанию с test на что-то другое, переменная $_POST['my_description'] всё равно остаётся равной test.

Должен ли я добавлять дополнительные настройки для редактора? Есть ли причина, по которой я не могу изменить значение textarea?

РЕДАКТИРОВАНИЕ

Ниже приведён очень простой тестовый пример, демонстрирующий эту проблему. Поместите это в файл functions.php, затем создайте новый тег. Отправленное значение для 'my_description' не изменится.

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

РЕДАКТИРОВАНИЕ

Это происходит ТОЛЬКО при подключении к действию "created_term". Если подключиться к "edited_terms", всё работает как ожидалось, и я думаю, это связано с использованием ajax на странице создания термина... Я обновил тестовый код, чтобы показать это.

2
Комментарии

У меня это изменилось: 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 ), возможно, проблема в чем-то другом в вашем коде?

Rob Vermeer Rob Vermeer
24 янв. 2012 г. 00:50:50

см. второе редактирование. Похоже, это происходит только при "добавлении" термина.

Mike Mike
24 янв. 2012 г. 18:58:47
Все ответы на вопрос 3
4
25

tinyMCE <textarea> элемент изначально не виден используемой функции serialize:

$.post(
    ajaxurl,
    $('#addtag').serialize(), function(r) {
        // Содержимое здесь.
    }
});

Вам нужно вызвать tinyMCE.triggerSave(), чтобы сделать его видимым.

Ниже приведен простой фрагмент кода, который должен решить задачу:

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

Это находится во внешнем файле, подключенном с помощью wp_enqueue_script(); это сработало в проведенном мной тесте.

26 янв. 2012 г. 17:51:41
Комментарии

У меня это не работает. Похоже, данные отправляются, а затем уже срабатывает ваш код с функцией click.

Mike Mike
26 янв. 2012 г. 21:47:43

Вы добавили скрипт в head? Если вы подключаете его в footer, он загрузится после wp-scripts, и это будет уже слишком поздно.

ungestaltbar ungestaltbar
26 янв. 2012 г. 22:15:53

Вместо 'click' вы можете привязать это к $('#submit').mousedown( ... ) :)

В этом случае не должно иметь значения, где и когда загружается скрипт.

ungestaltbar ungestaltbar
26 янв. 2012 г. 22:29:48

Сработало на ура, спасибо!

nitigyan nitigyan
22 мар. 2019 г. 21:49:09
3

В вашей функции edited_terms необходимо сохранять значение, а в функции add_tag_form_fields вам нужно заменить test на сохраненные данные.

Примерно так:

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

Если вы хотите более простой способ добавления дополнительных полей любого типа к формам редактирования меток/категорий или пользовательской таксономии без изобретения велосипеда, посмотрите на TAX Meta Class

24 янв. 2012 г. 01:36:23
Комментарии

Смотрите мой второй комментарий, похоже, это происходит только при добавлении термина. И я думаю, это связано с использованием ajax.

Mike Mike
24 янв. 2012 г. 18:59:18

@Mike какой Ajax, где именно ты используешь Ajax?

Bainternet Bainternet
24 янв. 2012 г. 19:47:26

Когда вы добавляете новую категорию/термин, WordPress использует ajax для отправки данных и создания нового термина. По какой-то причине это не позволяет элементу wp_editor иметь корректное значение. Попробуйте тестовый код из оригинального вопроса.

Mike Mike
24 янв. 2012 г. 21:01:50
1

Согласно кодексу для wp_editor, первым аргументом должен быть контент. Поэтому вместо 'test' следует использовать $_POST['my_description'], если вы хотите, чтобы это было начальным содержимым.

20 янв. 2012 г. 21:25:44
Комментарии

проблема не в том, что контент отображается корректно. Проблема в том, что отправляемая переменная остается такой же, как оригинальное содержимое, даже если вы изменяете содержимое textarea на что-то другое.

Mike Mike
20 янв. 2012 г. 21:38:12