wp_editor в виджете ломается после сохранения (нет кнопок и визуальная вкладка сломана)

Вопрос или проблема

Моя цель – заставить 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.

Оцените материал
Добавить комментарий

Капча загружается...