Вопрос: TInyMCE в настройщике

Я использую TinyMce на своем настройщике (по понятным причинам). Но я столкнулся с проблемой, на которую, похоже, нет ответа. Сначала я поделюсь с вами своим ключевым кодом:

Functions.php

//text editorif ( ! class_exists( 'WP_Customize_Control' ) )    return NULL;/** * Class to create a custom tags control */class Text_Editor_Custom_Control extends WP_Customize_Control{    /**     * Render the content on the theme customizer page     */   public function render_content()    {        ?>        <label>            <span class="customize-text_editor"><?php echo esc_html( $this->label ); ?></span>            <input class="wp-editor-area" type="hidden" <?php $this->link(); ?> value="<?php echo esc_textarea( $this->value() ); ?>">            <?php            $settings = array(                'textarea_name' => $this->id,                'media_buttons' => false,                'drag_drop_upload' => false,                'teeny' => true,                'quicktags' => false,                'textarea_rows' => 5,            );            $this->filter_editor_setting_link();            wp_editor($this->value(), $this->id, $settings );            ?>        </label>        <?php        do_action('admin_footer');        do_action('admin_print_footer_scripts');    }    private function filter_editor_setting_link() {        add_filter( 'the_editor', function( $output ) { return preg_replace( '/<textarea/', '<textarea ' . $this->get_link(), $output, 1 ); } );    }}function editor_customizer_script() {    wp_enqueue_script( 'wp-editor-customizer', get_template_directory_uri() . '/inc/customizer.js', array( 'jquery' ), rand(), true );}add_action( 'customize_controls_enqueue_scripts', 'editor_customizer_script' );
Customizer.php
    //content 1 text$wp_customize->add_setting('home_content1_text', array(    'default' => 'Here goes an awesome title!',    'transport' => 'postMessage',));$wp_customize->add_control(new Text_Editor_Custom_Control( $wp_customize, 'home_content1_text', array(    'label' => __('Text content 1', 'DesignitMultistore'),    'section' => 'home_content_1',    'description' => __('Here you can add a title for your content', 'DesignitMultistore'),    'priority' => 5,)));    //slider text 1 control$wp_customize->add_setting('slider_text_1', array(    'default' => _x('Welcome to the Designit Multistore theme for Wordpress', 'DesignitMultistore'),    'transport' => 'postMessage',));$wp_customize->add_control(new Text_Editor_Custom_Control( $wp_customize, 'slider_text_1', array(    'description' => __('The text for first image for the slider', 'DesignitMultistore'),    'label' => __('Slider Text 1', 'DesignitMultistore'),    'section' => 'Designit_slider_slide1',    'priority' => 3,)));

Customizer.JS

    ( function( $ ) {    wp.customizerCtrlEditor = {        init: function() {            $(window).load(function(){                var adjustArea = $('textarea.wp-editor-area');                adjustArea.each(function(){                    var tArea = $(this),                        id = tArea.attr('id'),                        input = $('input[data-customize-setting-link="'+ id +'"]'),                        editor = tinyMCE.get(id),                        setChange,                        content;                    if(editor){                        editor.onChange.add(function (ed, e) {                            ed.save();                            content = editor.getContent();                            clearTimeout(setChange);                            setChange = setTimeout(function(){                                input.val(content).trigger('change');                            },500);                        });                    }                    if(editor){                        editor.onChange.add(function (ed, e) {                            ed.save();                            content = editor.getContent();                            clearTimeout(setChange);                            setChange = setTimeout(function(){                                input.val(content).trigger('change');                            },500);                        });                    }                    tArea.css({                        visibility: 'visible'                    }).on('keyup', function(){                        content = tArea.val();                        clearTimeout(setChange);                        setChange = setTimeout(function(){                            input.val(content).trigger('change');                        },500);                    });                });            });        }    };    wp.customizerCtrlEditor.init();} )( jQuery );

Теперь проблема

Кажется, все работает нормально. У меня есть редактор TinyMce. Он не регистрирует, что что-то было изменено. И когда я изменяю что-то еще и сохраняю его вместе с изменениями, он тоже не сохраняется.

Есть ли у кого-нибудь рабочий пример редактора RTE или TinyMce, который заменяет текстовые области в настройщике?

Обновление

Работает только последний экземпляр, который я определил в своем customizer.php. К настоящему времени у меня 14 текстовых. Текстовая область работает нормально 14-го, но не 1-го

UPDATE 2

Кажется, что для каждой оставшейся области он создает это число Tinymce в этой области. Таким образом, первая область имеет перекрывающие друг друга 14-ти минутные. Вторая 13; тринадцатый 14 и т. д. и т. д., пока последний не имеет только 1 и, следовательно, работает

Ответы и комментарии:

Кстати, я все еще нахожу это очень глупо, что я не получаю свою награду. Мне не помогли продать мою репутацию, и я часами разбираюсь в этом сам. В прошлый раз я буду использовать систему вознаграждений. Я поставил этот ответ, чтобы помочь другим людям в будущем.
Создан 24-04-2017 04:04 SwAt.Be

Просто добавьте это - плагин / библиотека Kirki поддерживает несколько редакторов в настройщике, так что вы можете проверить его код на предмет идей, которые можно использовать с вашей реализацией.
Создан 24-04-2017 06:26 Dave Romsey

Спасибо, я обязательно посмотрю их код, когда у меня будет время изучить их библиотеку!
Создан 26-04-2017 12:28 SwAt.Be

Это интересный подход, который точно. Я сам опробую его, поскольку использую этот крошечный редактор mce в каждой создаваемой мной теме и на каждом веб-сайте, который я разрабатываю. Спасибо, что поделился!
Создан 24-07-2017 03:41 SwAt.Be

я проверю это, спасибо
Создан 30-04-2017 06:38 SwAt.Be

Нет времени, чтобы проверить это, но я дам вам награду, так как вы нашли время, чтобы ответить. Позже прокомментирую, сработало или нет.
Создан 01-05-2017 10:54 SwAt.Be

Моя проблема была «решена» следующим образом:
Проблема в том, что do_action вызывается каждый раз, когда у меня появляется новый класс. Но это нужно называть только в последнем. В противном случае это создает кучу admin_print_footer_scripts.
Так как я сам пишу код и не собираюсь продавать его сейчас, я могу просто посчитать количество созданных экземпляров класса. Который 14 на данный момент.
Так что я изменил это так:
functions.php
Класс Text_Editor_Custom_Control extends WP_Customize_Control
{

    / **
     * Рендеринг контента на странице настройки темы
     * /
    публичная функция render_content ()
    {
        статическое $ i = 1;
        ?>
        <Метка>
             <? php echo esc_html ($ this-> label); ?> SPAN>
             link (); ?> value = "<? php echo esc_textarea ($ this-> value ());?>">
            <? PHP
            $ content = $ this-> value ();
            $ editor_id = $ this-> id;
            $ settings = array (
                'textarea_name' => $ this-> id,
                'media_buttons' => false,
                'drag_drop_upload' => false,
                'teeny' => правда,
                'quicktags' => false,
                'textarea_rows' => 5,
            );
            wp_editor ($ content, $ editor_id, $ settings);


            if ($ i == 14) {
                do_action ( 'admin_print_footer_scripts');
            }
            $ Я ++;

            ?>
         Метка>
        <? PHP
    }
};

function editor_customizer_script () {
    wp_enqueue_script ('wp-editor-customizer', get_template_directory_uri (). '/inc/customizer.js', array ('jquery'), false, true);
}
add_action ('customize_controls_enqueue_scripts', 'editor_customizer_script');

Если кто-то знает, как я могу посчитать, сколько раз я вызываю этот новый класс в своем настройщике и использую его в моем functions.php, чтобы узнать, когда в последний раз он вызывается, я могу вызвать do_action ... Это очень помогло бы.
Создан 24-04-2017 04:10 SwAt.Be255212

SwAt.Be, ваш собственный ответ мне очень помог, и я прибил проблему печати сценариев администратора после последней передачи wp_editor. Также посмотрите, как я передаю функцию установки JS в качестве опции tinymce, чтобы синхронизировать изменения редактора с настройщиком WP, чтобы он работал правильно.
if (class_exists ('WP_Customize_Control')) {
  Класс WP_Customize_Teeny_Control extends WP_Customize_Control {
    функция __construct ($ manager, $ id, $ options) {
      конструкция parent :: __ ($ manager, $ id, $ options);

      global $ num_customizer_teenies_initiated;
      $ num_customizer_teenies_initiated = пусто ($ num_customizer_teenies_initiated)
        ? 1
        : $ num_customizer_teenies_initiated + 1;
    }
    function render_content () {
      global $ num_customizer_teenies_initiated, $ num_customizer_teenies_rendered;
      $ num_customizer_teenies_rendered = empty ($ num_customizer_teenies_rendered)
        ? 1
        : $ num_customizer_teenies_rendered + 1;

      $ value = $ this-> value ();
      ?>
        <Метка>
           <? php echo esc_html ($ this-> label); ?> SPAN>
           link (); ?> value = "<? php echo esc_textarea ($ value);?>">
          <? PHP
            wp_editor ($ value, $ this-> id, [
              'textarea_name' => $ this-> id,
              'media_buttons' => false,
              'drag_drop_upload' => false,
              'teeny' => правда,
              'quicktags' => false,
              'textarea_rows' => 5,
              // УБЕДИТЕСЬ, ЧТО TINYMCE ИЗМЕНЕНИЯ СВЯЗАНЫ С ЗАКАЗЧИКОМ
              'tinymce' => [
                'setup' => "function (editor) {
                  var cb = function () {
                    var linkInput = document.getElementById ('$ this-> id-link')
                    linkInput.value = editor.getContent ()
                    linkInput.dispatchEvent (new Event ('change'))
                  }
                  editor.on («Изменить», cb)
                  editor.on («Отменить», cb)
                  editor.on («Повторить», cb)
                  editor.on ('KeyUp', cb) // Удалить это, если это кажется излишним
                }»
              ]
            ]);
          ?>
         Метка>
      <? PHP
      // ПЕЧАТЬ ИХ АДМИН СЦЕНАРИИ ПОСЛЕДНЕГО РЕДАКТОРА
      если ($ num_customizer_teenies_rendered == $ num_customizer_teenies_initiated)
        do_action ( 'admin_print_footer_scripts');
    }
  }
}

// ПОПЫТАЙСЯ
add_action ('customize_register', function ($ wp_customize) {
  $ wp_customize-> add_section ('footer_section', [
    'title' => __ ('Footer', 'musiccase'),
    'priority' => 100
  ]);

  // 1-й РЕДАКТОР
  $ wp_customize-> add_setting ('footer_contact', [
    'type' => 'option'
  ]);
  $ wp_customize-> add_control (новый WP_Customize_Teeny_Control ($ wp_customize, 'footer_contact', [
    'label' => __ ('Контактная информация', 'musiccase'),
    'section' => 'footer_section'
  ]));

  // 2-ой РЕДАКТОР
  $ wp_customize-> add_setting ('footer_contact_2', [
    'type' => 'option'
  ]);
  $ wp_customize-> add_control (новый WP_Customize_Teeny_Control ($ wp_customize, 'footer_contact_2', [
    'label' => __ ('Контактная информация 2', 'musiccase'),
    'section' => 'footer_section'
  ]));
}, 20);
Создан 23-07-2017 11:46 ips111

Похоже, я немного опоздал с ответом, но насколько вы можете использовать это количество: (добавьте счетчик и __construct () в верхнюю часть вашего класса для фактического использования) НЕ проверено, но оно должно быть хорошим ,
<? PHP
class Text_Editor_Custom_Control {
    общедоступная статическая $ counter = 0;

    function __construct () {
        самостоятельно :: $ счетчика ++;
        self :: $ lastcall = date ('Y-m-d H: i: s');
    }
}

new Text_Editor_Custom_Control ();
new Text_Editor_Custom_Control ();
new Text_Editor_Custom_Control ();

echo Text_Editor_Custom_Control :: $ counter; // будет 3

echo Text_Editor_Custom_Control :: $ counter; // показывает дату и время последнего звонка
?>
Создан 29-04-2017 09:08 rudtek3,31721132

Проблема заключается в файле customizer.js, где вы пытаетесь выбрать область .wp-editor-area. Однако вход [data-customize-setting-link = "'+ id +'"] не выбирает этот вход, потому что id возвращает элемент управления вместо настройки.
Чтобы исправить это
дать ввод .wp-editor-area id id = "tinymce-input"
и используйте его для выбора этого ввода в вашем customizer.js, изменив input = $ ('input [data-customize-setting-link = "' + id + '"]') на input = $ ('# tinymce-input' )
Создан 02-05-2017 03:23 Tom Groot1367