Удаляем лишние абзацы из шорткодов WordPress

21 марта 2016 178 2

Шорткоды невероятно полезный инструмент WordPress, сильно упрощающий работу с контентом. Спектр их применения очень широк, перечислить все варианты использования шорткодов в WordPress просто нереально.

Reg.ru: Хостинг от 79 рублей
Reg.ru: Хостинг от 79 рублей

С помощью шорткодов в WordPress очень удобно выводить внутри контента различные динамические объекты: слайдеры, галереи, карусели, табы. С их помощью обычно выводятся результаты работы плагинов, каких-то сторонних скриптов, а также типографика, стилистически сложные и повторяющиеся элементы. Шорткодами проще всего реализовать и использовать многоколоночный вывод контента, используемый в адаптивной верстке. Даже мощнейший контент-конструктор Visual Composer, если присмотреться, построен на шорткодах.

Шорткоды — это набор простейших функций, создающих микро-коды, которые можно использовать в стандартном редакторе WordPress, в виджетах и также в файлах шаблона, для различных целей.

Лично мне сложно представить современный сайт на WordPress без использования дополнительных шорткодов.

Проблема лишних абзацев в шорткодах

При использовании шорткодов иногда всплывает один неприятный артефакт в виде лишних абзацев в начале и в конце шорткода. Выглядит это примерно так:

<p>
[shortcode]
</p>
hello world
<p>
[/shortcode]
</p>

В принципе, это нормальное явление. WordPress автоматически преобразует двойные переводы строк в абзацы. На такая самодеятельность иногда может сильно покоробить вёрстку. К счастью, в WordPress есть функция 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);

Автор: Иван Данилин

Практикующий веб-разработчик, специализируюсь на платформе WordPress.

Комментарии
  • llgruff

    Привет, способ хреновый.
    Видел у 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/

    • Отличный способ, спасибо за подсказку!

Разгоните свой WordPress

Хостинг-провайдер номер один в России — REG.RU

Подробнее