С помощью шорткодов в Вордпресс очень удобно выводить внутри контента различные динамические объекты: слайдеры, галереи, карусели, табы. С их помощью обычно выводятся результаты работы плагинов, каких-то сторонних скриптов, а также типографика, стилистически сложные и повторяющиеся элементы. Шорткодами проще всего реализовать и использовать многоколоночный вывод контента, используемый в адаптивной верстке. Даже мощнейший контент-конструктор «Visual Composer», если присмотреться, построен на шорткодах.
Шорткоды — это набор простейших функций, создающих микро-коды, которые можно использовать в стандартном редакторе Вордпресс , в виджетах и также в файлах шаблона, для различных целей.
Лично мне сложно представить современный сайт на Вордпресс без использования дополнительных шорткодов.
Проблема лишних абзацев в шорткодах
При использовании шорткодов иногда всплывает один неприятный артефакт в виде лишних абзацев в начале и в конце шорткода. Выглядит это примерно так:
<p> [shortcode] </p> hello world <p> [/shortcode] </p>
В принципе, это нормальное явление. Вордпресс автоматически преобразует двойные переводы строк в абзацы. На такая самодеятельность иногда может сильно покоробить вёрстку. К счастью, в Вордпресс есть функция wpautop(), с помощью которой можно отключить автоматическую простановку абзацев. Делается это следующим образом:
remove_filter( 'the_content', 'wpautop' ); // для контента remove_filter( 'the_excerpt', 'wpautop' ); // для анонсов
Но это решение очень радикальное, затрагивающее все публикации сайта. Я бы не советовал его использовать. Можно применить фильтр лишь для некоторых публикаций, но и такой вариант имеет ряд недостатков. Поэтому, не будем на нем останавливаться.
Предлагаю пойти немного другим путём и удалить все лишние абзацы в шорткодах с помощью той же фильтрации контента, но с применением регулярных выражений. А именно, сформируем список шорткодов, в которых нам мешают абзацы (one-half и one-third, например) и тупо заменим вокруг них теги <P> на <BR />.
Для этого воспользоваться кодом ниже, вставив его в functions.php активной темы сайта.
add_filter("the_content", "the_content_filter"); function the_content_filter($content) { // шорткоды к которым будет применен фильтр $block = join("|",array("one-half","one-third")); // обработка открывающего шорткода $rep = preg_replace("/(<p>)?\[($block)(\s[^\]]+)?\](<\/p>|<br \/>)?/","[$2$3]",$content); // обработка закрывающего шорткода $rep = preg_replace("/(<p>)?\[\/($block)](<\/p>|<br \/>)?/","[/$2]",$rep); return $rep; }
И всё, проблема решена.
UPD 02.07.2016
В комментариях был предложен более элегантный способ решения данной задачи с помощью изменения приоритета фильтрации.
remove_filter( 'the_content', 'wpautop' ); add_filter( 'the_content', 'wpautop', 12);
Видел у wpex короткую регулярку, ну да ладно.
Можно wpautop отложить на «позже шорткодов» и всё решится:
remove_filter( ‘the_content’, ‘wpautop’ );
add_filter( ‘the_content’, ‘wpautop’, 12);
Источник: http://sww.nz/solution-to-wordpress-adding-br-and-p-tags-around-shortcodes/