Значение textarea в wp_editor не обновляется
Я использую действие *_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 на странице создания термина... Я обновил тестовый код, чтобы показать это.

tinyMCE <textarea>
элемент изначально не виден используемой функции serialize:
$.post(
ajaxurl,
$('#addtag').serialize(), function(r) {
// Содержимое здесь.
}
});
Вам нужно вызвать tinyMCE.triggerSave()
, чтобы сделать его видимым.
Ниже приведен простой фрагмент кода, который должен решить задачу:
jQuery('#submit').mousedown( function() {
tinyMCE.triggerSave();
});
Это находится во внешнем файле, подключенном с помощью wp_enqueue_script()
; это сработало в проведенном мной тесте.

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

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

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

В вашей функции 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

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

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