Решение для отображения шорткодов в админ-редакторе
Я задавал этот вопрос около года назад и надеюсь, что теперь есть простое решение, которое позволит мне достичь цели. Вот в чем суть:
Я часто использую шорткоды в админ-редакторе, но когда передаю сайт клиенту, они часто не понимают, как они работают.
Мне нужно решение, которое будет автоматически отображать результат выполнения шорткодов прямо в визуальном редакторе (WYSIWYG) админки WordPress.
С визуальной точки зрения, я хочу, чтобы это отображалось аналогично тому, как показывается линия "more" или когда изображение отображается в редакторе. То есть пользователь будет видеть результат, но сможет только удалить его, а не редактировать содержимое отрендеренного шорткода.
На самом деле, то, о чем вы спрашиваете, не так сложно реализовать. Первый раз это займет у вас около часа, а последующие — не более 10 минут.
По сути, вам нужно создать плагин для TinyMCE. Вот что вам понадобится для начала:
- Общее руководство по созданию плагина для TinyMCE
- Пример кода из ядра WordPress
- Общее руководство по добавлению плагина TinyMCE в WordPress. Я нашел этот вариант, который кажется подходящим.
Теперь у вас есть все инструменты, чтобы справиться с задачей! Из всего этого наиболее интересным для вас будет следующий блок кода из примера WordPress:
4 function replaceGalleryShortcodes( content ) {
5 return content.replace( /\[gallery([^\]]*)\]/g, function( match ) {
6 return html( 'wp-gallery', match );
7 });
8 }
9
10 function html( cls, data ) {
11 data = window.encodeURIComponent( data );
12 return '<img src="' + tinymce.Env.transparentSrc + '" class="wp-media mceItem ' + cls + '" ' +
13 'data-wp-media="' + data + '" data-mce-resize="false" data-mce-placeholder="1" alt="" />';
14 }
Здесь шорткод галереи заменяется на тег img
. Этот тег img
имеет класс wp-gallery
, который стилизуется с помощью CSS, приведенного здесь.
Обновление от 2016-04-06: Обновлено содержание и ссылки для TinyMCE 4 и WordPress 4.4

интересно! позвольте спросить... что вы думаете о том, чтобы фактическое содержимое всех шорткодов автоматически преобразовывалось в связанный контент?

Это полностью зависит от контента. Во-первых, помните, что часть HTML удаляется, возникают проблемы с отображением в TinyMCE и т.д. Во-вторых, допустим, ваш шорткод выводит блок сложного HTML — если пользователь захочет его отредактировать, он может случайно сломать его. В-третьих, если у вашего шорткода есть параметры, они станут недоступны для редактирования, пока вы не удалите весь HTML-блок и не пересоздадите шорткод. Скорее всего, если ваш код достаточно сложен и требует использования шорткода, я считаю, что плейсхолдер — это лучшее решение.

Это не полный ответ, а лишь направление для дизайна. Я считаю, что наилучший подход выглядит примерно так:
В админке при редактировании записи
Извлечь все шорткоды из сохранённого поста и отобразить их внутри метабокса, отдельно от редактора. Убедитесь, что они отображаются в том же порядке, в котором шорткоды встречаются в редакторе TinyMCE.
В JavaScript API tinyMCE
Создать jQuery-функцию, которая при клике на шорткод заменяет HTML из метабокса в редакторе. И наоборот. Порядок сам по себе может служить ассоциацией, но я не уверен насчёт вложенных шорткодов. Однако существует множество способов создать удобную систему ID-связей. Обновления шорткодов можно выполнять на лету с помощью AJAX.
Никогда не сохраняйте отрендеренное состояние шорткода
Перед переключением редакторов, сохранением черновиков, автосохранением и публикацией выполняйте API-вызов для восстановления исходного состояния, чтобы отрендеренное состояние шорткода никогда не сохранялось...
Это реализуемо, но вам нужно хорошо разбираться в API tinyMCE, чтобы понимать, где и когда получать доступ к содержимому редактора, а также подключаться к JavaScript-действиям перед 'save' и другим.
На одной странице редактирования записи может быть несколько редакторов tinyMCE.
Часть восстановления можно изучить, посмотрев на поведение шорткода [gallery]
. Но клик по [MY_SHORTCODE]
придётся реализовать с помощью некоторых jQuery-трюков.
В скрипте admin_footer доступ к содержимому, где находится курсор, можно получить так:
var $editor_content = $(tinymce.activeEditor.getBody());
Это подсказка для начала работы.

Я долго искал способ графического отображения и настройки шорткодов. И вот, наконец, нашел руководство, которое делает именно это: https://generatewp.com/take-shortcodes-ultimate-level/
Добавляю описание, чтобы поисковые системы могли его распознать:
Мы создадим простой плагин с шорткодом, затем добавим кнопку в редактор TinyMCE для вставки этого шорткода через всплывающее окно, которое соберет все пользовательские данные для атрибутов шорткода. Далее мы заменим шорткод в редакторе TinyMCE на изображение-заглушку, подобно нативной галерее WordPress (которая, кстати, тоже является шорткодом, если вы не знали). И наконец — мы позволим редактировать шорткод и его атрибуты двойным кликом по изображению-заглушке.
