Вопрос или проблема
Моя цель – заставить wp_editor работать в простом виджете, который администратор может использовать для добавления текстового контента на странице опций администратора.
Вот мы идем в wp-admin/widgets.php, все выглядит так хорошо, не так ли?
Когда мы пытаемся сохранить… О нет….. Кнопки пропали, и вкладка “Визуально” больше не работает
Когда я смотрю на HTML, кажется, что после обновления TinyMCE просто решает, что ему не нужно загружать кнопки… Есть идеи?
Редактировать: вот источник плагина, который выдает эту ошибку
add_action('widgets_init', 'string_example_name_init');
function string_example_name_init()
{
register_widget('string_example_name');
}
class string_example_name extends WP_Widget
{
public function __construct()
{
$widget_details = array(
'classname' => 'string_example_name',
'description' => 'String Example Name'
);
parent::__construct('string_example_name', 'String Example Name', $widget_details);
}
public function form($instance)
{
$textcontent="";
if( !empty( $instance['textcontent'] ) ) {
$textcontent = $instance['textcontent'];
}
?>
<div class="string-arena-gods" id="texxxt">
<?php
$rand = rand( 0, 999 );
$ed_id = $this->get_field_id( 'wp_editor_' . $rand );
$ed_name = $this->get_field_name( 'wp_editor_' . $rand );
printf(
'<input type="hidden" id="%s" name="%s" value="%d" />',
$this->get_field_id( 'the_random_number' ),
$this->get_field_name( 'the_random_number' ),
$rand
);
$content="Привет, мир!";
$editor_id = $ed_id;
$settings = array(
'media_buttons' => false,
'textarea_rows' => 3,
'textarea_name' => $ed_name,
'teeny' => true,
);
wp_editor( $content, $editor_id, $settings );
?>
</div>
<div class="mfc-text">
</div>
<?php
echo $args['after_widget'];
}
public function update( $new_instance, $old_instance ) {
$rand = (int) $new_instance['the_random_number'];
$editor_content = $new_instance[ 'wp_editor_' . $rand ];
$new_instance['wp_editor_' . $rand] = $editor_content;
return $new_instance;
}
public function widget( $args, $instance ) {
extract( $args );
$textcontent = apply_filters( 'textcontent', $instance['textcontent'] );
?>
<div class="string widget flex">
<?php
?>
</div>
<?php
}
}
Когда вы нажимаете сохранить, откройте консоль и запишите любые ошибки. Также отметьте ‘Сохранить журнал’, чтобы вы могли видеть любые ошибки, когда изменяете страницу. Возможно, ваша тема конфликтует с плагином или с WordPress.
Я много искал и решил такую проблему;
стандартный класс виджета;
class tinyMCE_add_than_affter extends WP_Widget {
public function __construct() {
/*добавить скрипт*/
add_action('admin_enqueue_scripts', array($this => 'add_tinymce_script_css_plugin'));
$widget_options = array(
'classname' => 'tinymce_widget',
'description' => 'TinyMCE Editor',
);
parent::__construct('', 'Tiny MCE Editor', $widget_options);
}
/*****Важно******/
function add_tinymce_script_css_plugin($hook) {
if ('widgets.php' == $hook):
$baseurl = includes_url('js/tinymce');
$cssurl = includes_url('css/');
$pluginurl = includes_url('js/tinymce/plugins/');
$widgettinymcejsurl = plugins_url();
$pluginnames = [
'compat3x',
'wordpress',
'textcolor',
'colorpicker'
];
global $tinymce_version;
$version = 'ver=" . $tinymce_version;
$css = $cssurl . "editor.css';
wp_register_script('tinymce_script_add', "{$baseurl}/tinymce.min.js?$version", array('jquery'), false, TRUE);
wp_enqueue_script('tinymce_script_add');
foreach ($pluginnames as $name) {
wp_register_script("tinymce_script_plugin_add_{$name}", "{$pluginurl}/{$name}/plugin.min.js?$version", array('jquery'), false, TRUE);
wp_enqueue_script("tinymce_script_plugin_add_{$name}");
}
wp_register_style('tinymce_css', $css);
wp_enqueue_style('tinymce_css');
/*мой скрипт для активации tinyMCE*/
wp_register_script('tinymce_widget_script_add', "{$widgettinymcejsurl}/widget_form_tinymce.js", array('jquery'), false, TRUE);
wp_enqueue_script('tinymce_widget_script_add');
endif;
}
public function widget($args, $instance) {
//некоторый код
}
public function form($instance) {
$rand = rand(0, 999);
$ed_id = $this->get_field_id('tinymce_textarea' . $rand);
$ed_name = $this->get_field_name('tinymce_textarea' . $rand);
$rand_id=$this->get_field_id('rand');
$rand_name=$this->get_field_name('rand');
extract($instance,EXTR_SKIP);
?>
<label for="<?php esc_attr_e($ed_id); ?>">
<?php _e("Редактор TinyMCE"); ?>
</label>
<textarea name="<?php esc_attr_e($ed_name); ?>" id="<?php esc_attr_e($ed_id); ?>" cols="30" rows="10">
<?php _e($tinymce_textarea); ?>
</textarea>
<input type="hidden" id="<?php esc_attr_e($rand_id); ?>" name="<?php esc_attr_e($rand_name); ?>" />
<?php
}
public function update($newInstance, $oldInstance) {
$rand=$newInstance['rand'];
$instance['tinymce_textarea']=$newInstance['tinymce_textarea'.$rand];
return $instance;
}
}
мы организуем widget_form_tinymce.js
jQuery(function ($) {
var options={
selector: 'textarea[id*=tinymce_textarea]',
height: 200,
theme: 'modern',
plugins: ["textcolor colorpicker"],
toolbar1: 'bold,italic,underline,bullist,numlist,link,unlink,forecolor,undo,redo,alignleft,aligncenter,alignright,alignjustify,styleselect,formatselect,fontselect,fontsizeselect,fullscreen,forecolor,backcolor,textcolorselect'
};
tinyMCE.init(options);
$(document).find('input[id*=savewidget]').hover(function () {
tinyMCE.triggerSave();
});
$(document).on('widget-updated', function (event, $widget) {
tinyMCE.remove();
tinyMCE.init(options);
});
}
Удачи.
Ответ или решение
Если у вас возникла проблема с использованием функции wp_editor
в виджете WordPress, когда после сохранения виджета исчезают кнопки и не работает вкладка «Визуально», важно учесть несколько аспектов. Давайте разберем ваш код и существующую проблему, чтобы предложить возможные решения.
1. Понимание проблемы
Вы правильно заметили, что после сохранения виджета виджеты имеют только текстовый редактор, но отсутствуют визуальные элементы и кнопки, которые обычно предоставляет TinyMCE. Это может происходить из-за того, что JavaScript для инициализации TinyMCE не полностью обрабатывается или не вызывается при повторной загрузке страницы после сохранения.
2. Ваш код в Widget
В вашем примере кода вы связываете функцию wp_editor
с определенным идентификатором, используя случайный номер, что может привести к путанице при сохранении. Когда вы сохраняете данные, вы используете этот случайный идентификатор для извлечения содержимого. Это также может вызвать проблемы с JavaScript, который ожидает определенные значения по умолчанию, которые могут не попадать в сохраненные данные.
3. Решение проблемы
Обновление метода form
и включение необходимые скрипты
Чтобы убедиться, что TinyMCE загружается и инициализируется должным образом, следует выполнить следующие шаги:
a. Обеспечение правильной инициализации виджета
Убедитесь, что у вас есть соответствующий вызов для обработки инициализации TinyMCE
. Вы можете добавить его к вашему классу виджета, вызвав скрипт во время нужного хука:
function enqueue_tinymce_script($hook) {
if ('widgets.php' !== $hook) {
return;
}
// Загружать только на странице виджетов
wp_enqueue_script('tinymce');
// Добавьте свой собственный скрипт для обработки TinyMCE
wp_enqueue_script('your_custom_script', plugin_dir_url(__FILE__) . 'js/tinymce-widget.js', array('jquery', 'tinymce'), null, true);
}
add_action('admin_enqueue_scripts', 'enqueue_tinymce_script');
b. Ваш JavaScript для настройки TinyMCE
Ваш файл tinymce-widget.js
должен содержать аналогичный код, чтобы инициализировать редактор в зависимости от идентификатора текстового поля:
jQuery(document).ready(function($) {
// Убедитесь, что все экземпляры TinyMCE инициализированы
$('textarea').each(function() {
var $this = $(this);
if (!$this.hasClass('tinymce-initialized')) {
tinyMCE.init({
selector: '#' + $this.attr('id'),
plugins: 'textcolor colorpicker',
toolbar: 'bold italic | link | bullist numlist | forecolor',
height: 200,
setup: function(editor) {
editor.on('change', function() {
editor.save();
});
}
});
$this.addClass('tinymce-initialized');
}
});
// Обновляем TinyMCE при обновлении виджета
$(document).on('widget-updated', function(event, widget) {
tinyMCE.triggerSave();
tinyMCE.remove(); // Удаляем все экземпляры
$('textarea').each(function() {
tinyMCE.execCommand('mceAddEditor', false, $(this).attr('id'));
});
});
});
c. Обновление метода update
Убедитесь, что в update
вы обрабатываете получение значения textarea
правильно, в частности, используя editor_content
:
public function update($new_instance, $old_instance) {
$rand = (int) $new_instance['the_random_number'];
$editor_content = $new_instance['wp_editor_' . $rand]; // Обязательно использовать правильное имя
$new_instance['textcontent'] = $editor_content; // сохранить текст
return $new_instance;
}
4. Важность тестирования
После этих изменений обязательно проведите тестирование, чтобы убедиться, что TinyMCE работает правильно как для сохранения, так и для отображения. Откройте инструменты разработчика в браузере и просмотрите возможные ошибки, которые могут возникнуть при загрузке скриптов.
Не забывайте очищать кэш браузера и код кэша вашего сайта, чтобы увидеть изменения после внесения исправлений.
Заключение
С помощью вышеперечисленных шагов и рекомендаций вы сможете решить проблему с wp_editor
в вашем виджете. Убедитесь, что все зависимости загружаются корректно и функционируют после обновления виджета. Если проблема не исчезнет, рассмотрите возможность конфликта с другими зарегистрированными виджетами или плагинами, особенно если они также работают с TinyMCE.