Поддержка Проблемы и решения тот же шорткод в шорткоде

  • пишу плагин, необходимо в тексте шорткода обрабатывать другие шорткоды. с посторонними шорткодами помогает:
    $output .= do_shortcode($content);
    но начинаются глюки, если внутри родительского шорткода вложен дочерний шорткод с тем же именем.
    беглый поиск проблемы дал неутешительные выводы:

    This is a limitation of the context-free regexp parser used by do_shortcode() — it is very fast but does not count levels of nesting, so it can’t match each opening tag with its correct closing tag in these cases.

    есть хоть какой-то способ обойти данное ограничение? (естественно, без правки движка). хотя бы чтобы работал второй уровень вложенности.

Просмотр 5 ответов — с 1 по 5 (всего 5)
  • пока что есть только идея отпарсить $content, заменив в нем [shortcode] на [shortcode2], а потом прописать отдельный код для shortcode2. таким образом второй уровень вложенности можно получить.

    но как мне кажется — это уж больно кривоватый способ.

    Модератор Yuri

    (@yube)

    [offtop]
    Рекурсия — см. рекурсия.
    [/offtop]
    Делайте свой парсер, находящий свои шорткоды и делающий замены, начиная с самого глубокого вложения. Кажется, нечто похожее входит в программу академического образования программистов 🙂

    да вот как раз этого и не хотелось бы делать 🙁
    я слабо себе представляю, что потом дальше делать с полученным результатом от парсера (его то и писать не надо, их навалом разных).

    было бы это просто — давно бы уже появились решения и туториалы. а я все еще гуглю и везде только вопросы, а ответов нет 🙁

    люди вон как изгаляются при создании плагинов с nested шорткодами. видимо, простого решения не будет 🙁

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

Просмотр 5 ответов — с 1 по 5 (всего 5)
  • Тема «тот же шорткод в шорткоде» закрыта для новых ответов.