WordPress 5 в редакторе блоков выполняет шорткоды. Проверьте свои шорткоды
Неприятной неожиданностью вывалилось обновление вордпресс 5-й версии.
Все было хорошо, пока я не зашел на редактирование страницы на которой был вписан шорткод.
Я получил фатальную ошибку (фаталити - моя версия):
Fatal error: Uncaught error: Call to undefined function rcl_user_action()
Подробности:
"Какого черта творится" подумал я - ведь зайдя на страницу с прошлой записью, где не было шорткода, проблемы там не было.
Ошибка в логах подсказала мне - что функция не определена. И я вижу шорткод, единственный шорткод, что выводит список пользователей (больше в этой записи ничего нет).
Значит дело в нём.
Но ВП же не долбанулись совсем - не могут же они шорткод начать рендерить? Подумал я и оказался прав - шорткод в гутенберг редакторе рендерится и отрабатывает почти весь! Дело было к полуночи - я быстренько составил баг-репорт Андрею, разработчику WP-Recall, в оффлайн скайп. Будет с утра над чем подумать:
В WordPress 4.9 шорткод даже не пытался завестись в админке - это просто был текст для редактора. В новом редакторе все шорткоды (но не полностью) отрабатывают - но не визуализируются. И такое происходит только после обновления записи в редакторе. Если вы только начали писать запись и вставили шорткод - всё спокойно. Но стоит вам сохранить запись и обновить её - вы можете получить неприятность.
Я решил проверить остальные шорткоды плагина и еще интересней баг, который поломал визуальное представление на странице редактирования с этим шорткодом:
- и это не режим дебага. Это пропали иконки Dashicons в редактировании записи. Но реколл шорткод их там вообще не вызывает нигде. Тут я встал в ступор и только Андрей дал мне внятный ответ с утра: это пытается отработать визуальный редактор ВП (шорткод выводит форму публикации в фронтенде). Гутенберг (редактор блоков), его отрабатывает в бекенде. И каким-то образом дерегистрирует dashicons. В этом месте тоже нужна проверка и блокирование срабатывания в блочном редакторе.
Как повторить самостоятельно?
Вот вам пример:
function otfm_simple_shortcode(){
if( is_admin() ) {
wp_die('work!');
}
return 'hello world';
}
add_shortcode('otfm_smpl', 'otfm_simple_shortcode');
Впишите этот сниппет в файл функций вашей активной темы (так вы зарегистрируете шорткод otfm_smpl) и вставьте шорткод в редактор блоков. Сохраните запись и обновите.
Увидите результат:
А теперь попробуйте провернуть это в ВП ниже 5.0. Например на 4.9, где нет блочного редактора - это будет просто текст для старого редактора, а не полноценный шорткод.
Варианты выхода из ситуации:
Если вы пользователь - то просто написать о проблеме разработчику.
Если вы разработчик - то вариантов несколько:
Проверка через is_admin()
и запрет на работу через эту функцию будет фатально для шорткодов что используют ajax. Т.е. это полумера и не всем подойдет.
Второй вариант - проверять что мы сейчас в редакторе блоков находимся. Вот на гитхабе функция проверки что мы в редакторе блоков - ссылка
Теперь вам нужно ее использовать в своем проекте и проверять в самом начале инициализации шорткода - что вы не в редакторе блоков находитесь.
Если вы пишете дополнение для WP-Recall - то проверяйте так в начале шорткода:
if( rcl_is_gutenberg() ) return false;
- доступно с версии 16.17.1
Андрей быстро разобрался с проблемой и оперативно выпустил обновление WP-Recall - и похоже что не один пользователь не успел наступить на эти грабли, которые подсунул ВП 5.0 в этот плагин.
И вы проверьте свои шорткоды - зайдя на страницу редактирования записи где они вписаны. Баг конечно не затрагивает фронтенд часть сайта, но неприятно когда в админке вы заходите в запись и...
Зачем ВП начали обрабатывать шорткоды в редакторе? Наверно им это нужно для работы. Может быть вставленные шорткоды в блок шорткода будут полноценными визуальными блоками отображаться? Значит это функционал "на вырост"?
В общем - нам теперь с этим жить.
Сталкивались с подобным?
Помогла вам эта информация?
Если у вас другие варианты решения этой проблемы - поделитесь через комментарии