Вложение шорткодов в WordPress, которые не принадлежат мне и не предназначены для вложения

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

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


person Chris Rae    schedule 23.10.2013    source источник


Ответы (1)


Следующий PHP создает новый шорткод («гнездо»), которому вы можете передать параметр «шорткод», чтобы указать шорткод, который вы изначально собирались вызывать, и затем он вызовет этот шорткод после разбора всех аргументов самих шорткодов. Чтобы поместить шорткод в аргументы, используйте фигурные скобки { } вместо угловых скобок [ ].

Например:

[nest shortcode="twitter" float="left" url="{geturl}"]

станет:

[twitter float='left' url='[geturl]']

и вызов шорткода [geturl] будет разрешен до того, как шорткод будет возвращен, что даст что-то вроде:

[twitter float='left' url='http://stackoverflow.com']

Это также работает для шорткодов [start] [/end], но вы должны передать параметр «content», указывающий HTML, который будет идти посередине. Например:

[nest shortcode="button" content="{state}" size="large"]

Может закончиться как:

[button size='large']South Carolina[/button]

Надеюсь, это поможет кому-то!

Ниже приведен код для functions.php.

add_shortcode('nest', 'shortcode_nest');

function shortcode_nest($atts) {
    // Call using [nest shortcode=originalshortcode param="in {getcountryshortcode}"]
    //    to generate [originalshortcode param="in United Kingdom"]
    // or [nest shortcode=originalshortcode content="hello!" param="in {getcountryshortcode}"]
    //    to generate [originalshortcode param="in United Kingdom"]hello![/originalshortcode]
    $shortcode = $atts["shortcode"];
    unset($atts["shortcode"]);
    foreach ($atts as $key => $value) {
        $value = str_replace('{', '[', str_replace('}', ']', $value));
        $value = do_shortcode($value);
        if ($key == "content")
            $content = $value;
        else
            $stratts .= "$key='$value' ";
    }
    if ($content == "")
        $fullcode = "[$shortcode $stratts]";
    else
        $fullcode = "[$shortcode $stratts]$content" . '[/' . $shortcode . ']';
    return do_shortcode($fullcode);
}
person Chris Rae    schedule 23.10.2013