CKEDITOR для wordpress Не могу удалить ‹p›‹/p›

У меня есть такой html:

<main class='someClass'>
  <!-- somecontent -->
</main>

После обновления поста вижу:

<p>&nbsp</p>
<main class='someClass'>
<p>&nbsp</p>

  <!-- somecontent -->

<p>&nbsp</p>
</main>
<p>&nbsp</p>

Что я могу сделать? Что это? Прочитал много постов об этой проблеме, но, думаю, не понял только одного: КУДА надо вставлять все правила? Такие как

config.allowedContent = true;
config.extraAllowedContent = 'main';

или еще? Потому что потом я вставил в ckeditor.config.js изменений не вижу. Он продолжает вставлять в мой html

<p>&nbsp</p>

Кто-нибудь может мне помочь? буду очень благодарен.


person Nikita_kharkov_ua    schedule 10.05.2016    source источник
comment
Какие версии (CKEditor для WordPress и сам WordPress) вы используете? Я только что проверил ваш код с помощью WordPress 4.5.2 и CKEditor для WordPress 4.5.3.3, и нет никаких дополнительных <p>&nbsp</p> после переключения на/с Visual/HTML, а также не отображается источник внутри CKEditor.   -  person Vokiel    schedule 11.05.2016
comment
У меня те же версии, что и вы написали. Я думаю, вы не заметили, что я сказал о теге main. Все остальные теги пишет нормально. Вы можете проверить это на своем примере. Если ничего нет - дайте мне доступ. Конечно, если сможешь.   -  person Nikita_kharkov_ua    schedule 14.05.2016
comment
У вас установлены дополнительные плагины? Или какие-то другие изменения конфигурации? Я только что проверил содержимое внутри, вместо <!-- somecontnet --> комментария, например: <main class="someClass"> <p> Maybe there is a problem with the some content </p> <div> <p> Another paragraph </p> </div> </main> И это сработало нормально - <p>&nbsp;</p> не вставлено.   -  person Vokiel    schedule 20.05.2016
comment
Код был в порядке при переключении между режимами исходного кода/WYSIWYG в CKEditor или между HTML/Visual в WordPress, но был неправильным после сохранения во время редактирования.   -  person Vokiel    schedule 21.05.2016


Ответы (1)


После более длительного исследования я думаю, что нашел его.

Предпринятые шаги:

Во-первых, я проверил, поддерживает ли CKEditor теги HTML5 вообще, и это так. Таким образом, он не должен снимать их или изменять вообще. Как вы написали, <main class="someClass"> был окружен <p>&nbsp;</p> - это могло произойти, если main был распознан как встроенный элемент, а не блочный. Я копался в CKEDITOR.dtd и оказалось, что main существует и это блочный элемент. Все должно быть в порядке.

Чтобы проверить, является ли это проблемой CKEditor или WordPress, я проверил, что было записано в базу данных и что из нее получил CKEditor. Содержимое поста/страницы было таким же, как в примере ниже (единственное отличие заключалось в новых символах строк - так как CKEditor форматирует код):

<main class="someClass">
    <p>There should be only 2 paragraphs inside the</p>
    <pre>&lt;main class=&quot;someClass&quot;&gt;&lt;/main&gt;</pre>
    <p>element.</p>
</main>

Но код, возвращенный для редактирования, был другим

<p><main class="someClass"></p>
<p>There should be only 3 paragraphs inside the</p>
<pre>&lt;main class=&quot;someClass&quot;&gt;&lt;/main&gt;</pre>
<p>element.</p>
<p></main></p>

<main class="someClass"> был обернут <p></p>, затем CKEditor исправлял эти абзацы вокруг блочного элемента, и результат был таким, как вы написали:

<p>&nbsp</p>
<main class='someClass'>
<p>&nbsp</p>

После непродолжительной отладки ядра WordPress я нашел место, где были добавлены эти абзацы - функция wpautop внутри formatting.php https://developer.wordpress.org/reference/functions/wpautop/

Точнее, строка 469, который описывает все элементы блока:

$allblocks = '(?:table|thead|tfoot|caption|col|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|form|map|area|blockquote|address|math|style|p|h[1-6]|hr|fieldset|legend|section|article|aside|hgroup|header|footer|nav|figure|figcaption|details|menu|summary)';

и нет элемента main.

Итак, у вас есть несколько вариантов:

  1. Отключить wpautop вообще (не рекомендуется)
  2. Отредактируйте исходники WordPress и добавьте этот элемент в список. Тогда помните об этом после каждого обновления WordPress.

Или сообщите об этом, создайте запрос на исправление/вытягивание и дождитесь исправления, затем обновите без какого-либо риска;)

person Vokiel    schedule 21.05.2016