Как лучше всего включить вложенные шорткоды?

8 нояб. 2011 г., 18:22:46
Просмотры: 14.6K
Голосов: 6

Это лучший способ включить вложенные шорткоды?:

add_filter( 'the_content', 'do_shortcode' );

Я нахожу противоречивую информацию и хочу убедиться, что ничего не сломаю!

0
Все ответы на вопрос 3
6

http://codex.wordpress.org/Shortcode_API#Nested_Shortcodes

Всё, что нужно знать о вложенных шорткодах в WordPress

8 нояб. 2011 г. 18:28:28
Комментарии

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

hhins hhins
8 нояб. 2011 г. 18:31:52

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

hhins hhins
8 нояб. 2011 г. 18:44:35

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

Scott Scott
8 нояб. 2011 г. 19:22:42

Какой шорткод вы вкладываете?

Scott Scott
8 нояб. 2011 г. 19:24:48

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

hhins hhins
8 нояб. 2011 г. 19:37:53

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

Scott Scott
8 нояб. 2011 г. 19:39:12
Показать остальные 1 комментариев
0

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

Как я уже сказал: либо избегайте повторения одного и того же шорткода, либо убедитесь, что у всех есть и открывающие, и закрывающие теги!

14 июн. 2022 г. 01:05:42
0

Мой ответ не совсем решение, но поскольку я потратил много времени на этот вопрос, хочу подчеркнуть аспект, отмеченный в ответе jerclarke: если вложенный шорткод и тот, который он содержит, одинаковы, код не будет работать.

Как указано в документации:

Парсер шорткодов корректно обрабатывает вложенные шорткоды, при условии что их функции-обработчики поддерживают это, рекурсивно вызывая do_shortcode():

[tag-a]
   [tag-b]
      [tag-c]
   [/tag-b]
[/tag-a]

Однако парсер не справится, если один и тот же шорткод используется для оборачивания другого шорткода с тем же именем:

[tag-a]
   [tag-a]
   [/tag-a]
[/tag-a]
10 мар. 2024 г. 11:02:58