Как лучше всего включить вложенные шорткоды?
Это лучший способ включить вложенные шорткоды?:
add_filter( 'the_content', 'do_shortcode' );
Я нахожу противоречивую информацию и хочу убедиться, что ничего не сломаю!

http://codex.wordpress.org/Shortcode_API#Nested_Shortcodes
Всё, что нужно знать о вложенных шорткодах в WordPress

Там упоминается "при условии, что их функции-обработчики поддерживают это, рекурсивно вызывая do_shortcode()" — Значит, делать так, как указано выше, не будет правильным подходом?

Возможно, более уместный вопрос: может ли установка приоритета по умолчанию (10) вызвать проблемы, о которых я не знаю?

Представленная вами строка кода бесполезна. Вы добавляете функцию do_shortcode к фильтру the_content. WordPress уже делает это автоматически. Повторное применение не сделает процесс рекурсивным. Как сказано в кодексе: "при условии, что их функции-обработчики поддерживают это, рекурсивно вызывая do_shortcode()"

Это всего несколько разных шорткодов колонок, они не используют do_shortcode($content) внутри шорткодов. Работает при изменении приоритета фильтра на 10, но думаю, что просто перепишу их с использованием do_shortcode($content), как указано. Спасибо за быстрые ответы.

Вот конкретный ответ, чтобы не полагаться на официальную документацию WordPress (которая, как кажется, не предлагает явных инструкций в данном случае).
Применение do_shortcode() к вводу
Пример регистрации шорткода, который поддерживает вложенные шорткоды внутри себя:
function register_example_shortcode_with_nesting($atts, $text) {
$output = do_shortcode($text);
return $output;
}
add_shortcode('example_shortcode_with_nesting', 'register_example_shortcode_with_nesting');
Использовать его можно так:
[example_shortcode_with_nesting]
[nested_shortcode]
[other_nested_shortcode]
[/example_shortcode_with_nesting]
Ключевой момент — это обработка содержимого $text
(которое находится между открывающим и закрывающим тегами шорткода) с помощью функции do_shortcode()
. По умолчанию WordPress берет первый найденный шорткод и игнорирует любые шорткоды внутри него, поэтому нам нужно явно указать ему «проверить снова», и этот код решает задачу.
Конечно, приведенный выше пример сам по себе бесполезен — вам нужно будет обработать $output
с использованием $atts
и других параметров, чтобы он делал что-то полезное.
Предупреждения о вложенных шорткодах с закрывающими тегами
- Это действительно поддерживает шорткоды внутри, которые имеют закрывающие теги, то есть те, где есть содержимое
$text
. - Но могут возникнуть проблемы, если у вас есть несколько одинаковых шорткодов, вложенных на одном уровне.
- Если один и тот же шорткод встречается несколько раз, WordPress может запутаться в том, какой «открывающий» тег соответствует какому «закрывающему», и автоматически применит первый экземпляр к первому закрывающему тегу.
Поэтому мое правило такое: Если вложенный шорткод имеет закрывающий тег, он должен быть либо первым, либо единственным в своем роде, либо все соответствующие вложенные шорткоды должны иметь закрывающие теги.
Пример, который не даст ожидаемого результата:
[example_shortcode_with_nesting]
[nested_shortcode id=1]
[nested_shortcode id=2][/nested_shortcode]
[/example_shortcode_with_nesting]
Что произойдет? Первый шорткод с id=1
будет обработан с тегом [/nested_shortcode]
в качестве закрывающего, а шорткод с id=2
останется необработанным внутри содержимого! Неприятно!
Как я уже сказал: либо избегайте повторения одного и того же шорткода, либо убедитесь, что у всех есть и открывающие, и закрывающие теги!

Мой ответ не совсем решение, но поскольку я потратил много времени на этот вопрос, хочу подчеркнуть аспект, отмеченный в ответе jerclarke: если вложенный шорткод и тот, который он содержит, одинаковы, код не будет работать.
Как указано в документации:
Парсер шорткодов корректно обрабатывает вложенные шорткоды, при условии что их функции-обработчики поддерживают это, рекурсивно вызывая do_shortcode():
[tag-a]
[tag-b]
[tag-c]
[/tag-b]
[/tag-a]
Однако парсер не справится, если один и тот же шорткод используется для оборачивания другого шорткода с тем же именем:
[tag-a]
[tag-a]
[/tag-a]
[/tag-a]
