Вільно перемикайтеся між вкладками Visual та HTML


21

Тож це питання піднімалося багато разів під різними прапорами, проте я хотів би представити єдину нитку для остаточного вирішення цього питання.

У WordPress за замовчуванням під час перемикання між і назад редакторами HTML і Visual у TinyMCE певні теги позбавляються вмісту, а також виникає інша дивна функціональність. Два відомих обхідних шляхи для написання більш ефективного HTML-коду - це видалити функцію wp_auto_p за допомогою фільтрів, а також встановити TinyMCE Advanced та включити опцію "зупинити видалення p & br тегів".

На жаль, це працює настільки добре, на жаль.

Візьмемо, наприклад, такий приклад:

<h2>How does it work?</h2>
<p>In order to use jQuery Easy Columns, you must install it as you would any other jQuery plugin.  First, download the zip file using the button above.  After downloading the file, extract it to a location of your choice, and move the extracted folder to your server using your favorite FTP client.  After moving the plugin to your server (and of course calling the jQuery source into your document), call it in on your site using the following snippet of code:</p>
<pre>
&lt;script type=&quot;text/javascript&quot; src=&quot;/path/to/jquery.easycolumns.js&quot;&gt;&lt;/script&gt;
</pre>

Якщо я введу цей код у редакторі HTML, і обидва перераховані вище параметри вже включені, тоді, коли я переключаюсь між двома різними редакторами, нічого не станеться, чого очікувати. На жаль, при збереженні код автоматично перетворюється на це:

<h2>How does it work?</h2>
<p>In order to use jQuery Easy Columns, you must install it as you would any other jQuery plugin.  First, download the zip file using the button above.  After downloading the file, extract it to a location of your choice, and move the extracted folder to your server using your favorite FTP client.  After moving the plugin to your server (and of course calling the jQuery source into your document), call it in on your site using the following snippet of code:</p>
<pre>
<script type="text/javascript" src="/path/to/jquery.easycolumns.js"></script>
</pre>

Як бачимо, всі об'єкти всередині попереднього тегу перетворюються назад у фактичні символи HTML. Потім, якщо я знову збережу цю саму публікацію, я отримаю щось на зразок наступного:

<h2>How does it work?</h2>
<p>In order to use jQuery Easy Columns, you must install it as you would any other jQuery plugin.  First, download the zip file using the button above.  After downloading the file, extract it to a location of your choice, and move the extracted folder to your server using your favorite FTP client.  After moving the plugin to your server (and of course calling the jQuery source into your document), call it in on your site using the following snippet of code:</p>
<pre><br />
<script type="text/javascript" src="/path/to/jquery.easycolumns.js"></script><br />
</pre>

Зауважте, що Wordpress насправді вставить br теги в пост. Потрібно сказати, що коли ця публікація оновлювалася кілька разів, під час перегляду її на фронтальному вікні, дисплей ніде не знаходиться поруч із призначеним екраном.

Єдиний спосіб, який я, здавалося, позбувся від усієї доданої "функціональності форматування", - це відключити редактор Visual через мій профіль.

Це прекрасне рішення для мене, враховуючи, що я є професійним веб-розробником. Для моїх клієнтів це рішення далеко не елегантне. Мої клієнти здебільшого будуть використовувати візуальний редактор. Багато моїх клієнтів не дуже підковані в техніці, і мені іноді потрібно виправити їх повідомлення, коли зламається макет. Це обмежує використання візуального редактора, оскільки я не можу перейти на редактор HTML, не боячись зламати макет.

В основному, (і я думаю, що існує велика спільнота, яка могла б отримати користь від цієї відповіді), які явні кроки я можу дотримуватися, щоб забезпечити наступне:

  1. Допис можна редагувати з редактора Visual або HTML.
  2. Вміст публікації жодним чином не змінюється при перемиканні між двома вкладками.
  3. Під час збереження публікації з редактора HTML не додається додатковий вміст.
  4. Під час збереження публікації з редактора HTML жодна суть не конвертується.
  5. БОНУС: Під час збереження публікації з редактора HTML будь-який код (наприклад, HTML), який загорнутий у попередній тег та ще не перетворений на об'єкти, буде автоматично перетворений на об'єкти.

По суті, якщо ми можемо створити вищезгадану поведінку в TinyMCE за допомогою стороннього плагіна, ми можемо вгамувати всі інші питання щодо помилкового форматування за допомогою використання TinyMCE. Я відчуваю, що багато людей могли б отримати від цього користь.

Просто здається логічним, що існує певна функціональність, яку можна було б очікувати від редактора WYSIWIG, і це суперечить цьому. Згідно з усією логікою та причинами, вбудовані у формат формат Wordpress функції даремно при їх нинішньому налаштуванні. Мені здається, що якщо вони хочуть використовувати ці параметри форматування, їх найкращим варіантом буде включення одного редактора чи іншого, а не обох.

І ЗАБУДУЙМО: Не відповідайте на цю тему шляхом обходу та завантаження для інших редакторів WYSIWIG, які "вирішили" проблему. Це основна проблема (хоча не справді помилка) з ядром Wordpress, яку потрібно виправити.

EDIT : Добре, я працював над цим, і я думаю, що зворотна інженерія буде найкращим способом вирішити це питання. Тож наразі я відключив wpautop (що лише для наочності - це функція, яка зачепить у фільтр "the_content", щоб додати теги p та br до того, як текст буде показаний , а не тоді, коли текст буде збережено. Я думаю, що існує деяка плутанина щодо функціонування цієї функції. wpautop не несе відповідальності за зміни, що відбуваються при переключенні між вкладками редактора. Це щось зовсім інше.

У будь-якому випадку я відключив wpautop, як це добре застосовується при використанні редактора HTML. З цього моменту я відключив візуальний редактор для початку спочатку з помилками html-сутності, які є при збереженні публікації. Завдяки допомозі одного з C. Bavota, я знайшов фрагмент для перетворення будь-яких тегів у редакторі HTML у їх еквівалентні об'єкти, перш ніж відображати їх на передньому кінці сайту (кредит: http://bavotasan.com/2012/convert -pre-tag-content-to-html-elements-in-wordpress / ).

#add_filter( 'the_content', 'pre_content_filter', 0 );
/**
 * Converts pre tag contents to HTML entities 
 *
 * This function is attached to the 'the_content' filter hook.
 *
 * @author c.bavota
 */

function pre_content_filter( $content ) {
        return preg_replace_callback( '|<pre.*>(.*)</pre|isU' , 'convert_pre_entities', $content );
}


function convert_pre_entities( $matches ) {
        return str_replace( $matches[1], htmlentities($matches[1] ), $matches[0] );
}

add_filter( 'the_content', 'pre_content_filter', 10, 2 ); 

Це ефективно усуває проблеми з Wordpress, перетворюючи всі об'єкти в теги при збереженні шляхом їх обходу. Тепер ви можете використовувати редактор HTML і писати стандартний код між тегами "pre", не здійснюючи перетворення сутності самостійно. Це допомагає вирішити всі проблеми з перетворенням сутності в Wordpress і гарантує, що все відображається правильно на передній частині. Тепер нам потрібно розібратися в тому, що потрібно підключити, щоб змінити поведінку при натисканні назад і назад між вкладками. Зараз здається, що при переході від HTML до візуальної вкладки вміст вкладки HTML інтерпретується javascript або щось, щоб спробувати забезпечити актуальне оновлення того, як повинен виглядати контент. Це призводить до того, що теги (які відображаються у формі без сутності на вкладці HTML) обробляються замість відображення. Потім, при переході назад на вкладку HTML, виявиться, що TinyMCE передає поточні дані. Це означає, що при переключенні назад ви втрачаєте свою HTML-структуру. Нам потрібно знайти спосіб сказати TinyMCE конвертувати все в попередні теги в його еквівалентні об'єкти, перш ніж завантажувати його у вікно (по суті, це бекенд-версія того, що ми робили на фронталі, але з tinymce та javascript замість php та гаків), щоб він відображався замість обробки. Пропозиції? s еквівалентні об'єкти, перш ніж завантажувати його у вікно (по суті, бекенд-версія того, що ми робили на фронті, але з tinymce та javascript замість php та гаків), щоб воно відображалось замість обробки. Пропозиції? s еквівалентні об'єкти, перш ніж завантажувати його у вікно (по суті, бекенд-версія того, що ми робили на фронті, але з tinymce та javascript замість php та гаків), щоб воно відображалось замість обробки. Пропозиції?

EDIT 2 :

Після ще кількох досліджень перетворення об'єктів у попередній тег, коли вони відображаються, добре працює на вміст у попередньому тезі, але скажіть, що у мене є повідомлення в блозі з таким рядком:

"Далі нам потрібно додати цей рядок до нашого HTML-файлу: <p> Привіт, світ! </p>"

Переглядаючи цей рядок, ви можете сказати, що код повинен відображатися на сайті, а не розбиратися, однак, коли публікація збережена, ці об’єкти декодуються при наступному завантаженні редагування публікації, і при кожному наступному збереженні вони зберігаються як сирі HTML-теги, через що вони розбираються на передньому кінці. Єдиним рішенням, про яке я зараз думаю, було б написати аналогічний код для тегу "code", який я використовую попередньо, а потім просто загорнути невеликі вкладиші в тег "code", а великі шматки в тег "до" У когось є якісь інші ідеї?


2
Гарний пост. Цей TinyMCE не викликав у мене нічого, крім головних болів. Нещодавно я вимкнув це для CKEditor, хоча ще рано говорити, як він тримається. Однією з проблем, про яку ви не згадували у своєму дописі, є зайвий cr ** під час вставки з Word.
Twifty

Я використовував CKeditor на нашому власному сайті деякий час, думаючи, що це рішення, яке я вимагав, але, на жаль, проблема тут полягає в обробці та форматуванні Wordpress даних, які він отримує від TinyMCE, а не самого TinyMCE. Має бути спосіб підключити Wordpress в потрібний час, щоб створити потрібний ефект. Але незалежно від CKeditor, безумовно, хороший плагін, просто не те, що я шукаю.
Космічні проекти дизайну

1
Крім того, вам відомо про правильність функції "вставити з слова" у "кухонній раковині" TinyMCE? Це повинно піклуватися про вашу проблему з "зайвим лаєм" під час вставки з Word.
Космічні проекти дизайну

7
Відмінне запитання. Щоб приправити це: Я нагороджую це рішення щедрою 200 . Я зачекаю, поки дійсно з’явиться відповідь, так що щедрість не закінчується занадто рано.
fuxia

Відповіді:


5

Добре, тому я вже оновив це питання тонною, і воно починає перевантажуватися, тому я зрозумів, що напишу це як відповідь, хоча це не повне.

Екстраполюючи відповідь @ bueltge, я фактично повернувся назад і знайшов його попередню посаду під питанням. У цій публікації був список плагінів, яких я ніколи не бачив: "Збережена розмітка HTML-редактора". Цей плагін деякий час не оновлювався, але я лише перевірив його на WP 3.6.1 і він повністю функціональний. Цей плагін автоматично бере участь у wpautop, надає єдиний формат для вставки тегів br та p у візуальний редактор і зберігає вашу розмітку при перемиканні між вкладками.

Для своїх власних цілей я розширив цей плагін із власною функціональністю: автоматичне перетворення будь-яких тегів HTML у теги "<code>" до їх відповідних об'єктів. Це означає, що ви можете записати стандартний HTML-код у теги коду на текстовій вкладці, а потім зберегти його, а всі речі у попередніх тегах перетворяться на об'єкти для належного відображення на передньому кінці сайту та візуальному редакторі. Це не найелегантніше рішення, яке я знайшов ще, але, здається, працює. Після активації плагіна додайте цей рядок у свою функцію.php:

function code_content_conversion_filter( $content ) {
        return preg_replace_callback( '|<code.*>(.*)</code|isU' , 'convert_entities', $content );
}

function convert_entities( $matches ) {
        return str_replace( $matches[1], htmlspecialchars($matches[1], ENT_QUOTES | ENT_HTML5, 'UTF-8', FALSE ), $matches[0] );
}

add_filter( 'content_save_pre', 'code_content_conversion_filter', 0);

Тепер просто введіть будь-який дійсний HTML між тегами коду, і коли ви зберігаєте, коли редактор вискакує резервну копію, всі вони будуть перетворені на сутності. Це дозволяє швидше писати код. Тепер єдине, що все ще викликає проблему - це те, що якщо у вас є поле "до" з вкладеним тегом коду та HTML, і ви переходите на візуальну вкладку і намагаєтеся вставити в код новий рядок, тег br потрапляє в ваш тег коду в HTML. Має бути можливість вимкнути це в TinyMCE. Незважаючи на це, доки ви редагуєте попередні поля з текстової вкладки, ви можете вільно перемикатися між вкладками, додавати будь-який вміст під будь-яку вкладку, зберігати з будь-якої вкладки, і не потрібно турбуватися про заплутане форматування!

Це фактично вирішує всі 5 пунктів мого початкового питання. Пункт 2 все ще є делікатним, але я вважаю, що для більшості народів це вирішує питання. Я планую прошивати цей плагін в якийсь момент і витягувати необхідні частини, поєднуючи його з моїми знахідками та перепаковуючи його для загального завантаження. Моя мета тут - створити простий плагін встановлення одним кліком, який працює як очікувалося.

Сподіваюся, що це допомагає всім!


3

Спочатку я думаю, що ця проблема була вирішена з WP версії 3.5; дивись квиток 19666 у трас . Але у tinyMCE є гачок, який дає нам можливість змінити вміст у редакторі, і ви не повинні аналізувати вихід на фронтенді.

Невеликий сценарій джерела. У мене немає тесту на це з поточною версією WP, було старішим рішенням для клієнта.

Додайте це джерело за допомогою плагіна та покращуйте розмітку. Перевірка функції html-тегу, <preі якщо вона існує, то вона буде замінена розміткою.

add_filter( 'tiny_mce_before_init', 'fb_correction_content_tiny_mce' );

function fb_correction_content_tiny_mce( $init ) {

    $init['setup'] = "function(ed) {
        ed.onBeforeSetContent.add( function(ed, o) {

            if ( o.content.indexOf('<pre') != -1 ) {
                o.content = o.content.replace(
                    /<pre[^>]*>[\\s\\S]+?<\\/pre>/g,
                    function(a) {
                        return a.replace(/(\\r\\n|\\n)/g, '<br />');
                    }
                );
            }
        } );
    }";

    return $init;
}

Питання, яке було вирішено в 3.5, не зовсім те саме. Проблема у мене полягає не в тому, що розриви рядків знімаються при переході з Visual на HTML, це те, що всі мої теги, навіть ті, що мають попередні теги, здаються інтерпретованими як вихідний HTML, а не відображаються, оскільки вони не кодуються як сутності на панелі HTML. Чи модифікує ця функція поведінку TinyMCE так, що HTML в попередніх програмах буде відображатися замість обробки?
Мислячі космічні дизайни

У невеликих тестових роботах це особи залишать перехід від html до візуального, також назад та із збереженням вмісту.
Бульдж

Я перевіряю це пізніше сьогодні, щоб переконатися, що він виконує те, що я шукаю.
Космічні дизайни космосу

Добре, почекайте вашої відповіді, і, можливо, це допоможе. Я перевірив це з джерелом з вашого прикладу з питання. Якщо я розумію це не правильно, будь ласка, підсиліть це тут.
буелге

Дивіться мою відповідь ...
Космічні конструкції

0

У мене була проблема , схожий на OP, але для мене була проблема зі збереженням <h1>в <div>. Це те, що я хотів зберегти під час переключення між вкладками Text та Visual: h1 у діві та з дівом всередині

Кожен раз, коли я перемикав вкладку, <h1>зникав. Я багато шукав, і для Wordpress 4.7.3 я дізнався, що там є багато застарілих виправлень. Було оновлено програмою мера TinyMCE з версії 3 до 4. Рішення для v.3 не вийшло для версії 4. Після більшого гуглінгу та читання оригінальної документації TinyMCE версії 4 я придумав рішення, особливо для мого випадку:

  1. Встановіть плагін Advanced TinyMCE Configuration
  2. встановіть для valid_childrenпараметра TinyMCE значення+div[h1],h1[div]
  3. Я additonnaly налаштований indent=true, forced_root_block=falseі schema=html5(коли я прочитав forced_root_blockопис я зрозумів його в якості wpautopзаміни)

В результаті я отримую це (і воно стійке до переключення вкладок) введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.