短代码中的短代码,嵌套短代码?

时间:2014-07-28 19:33:04

标签: php wordpress plugins download shortcode

问题

我有一个名为WP-Filebase的插件(请参阅also here),允许用户上传媒体。它有一个短代码,允许用户发布该媒体的下载链接。

用户插入帖子的短代码是:

[wpfilebase tag=file path='EXAMPLE.JPG' tpl=download-button /]

目标

EXAMPLE.JPG 替换为以下短代码:

 function get_title( ){
   return get_the_title(); 
   }

add_shortcode( 'page_title', 'get_title' );

使两个短代码基本上看起来像这样:

[wpfilebase tag=file path='[page_title]' tpl=download-button /]

WHY吗

因为上传媒体的名称(在我的情况下,它的图像因为它是一个壁纸网站)与帖子标题的名称相匹配。

因此,如果我可以在第一个短代码中启用第二个短代码,我就不必自己手动替换EXAMPLE.JPG以及500多个帖子,短代码可以为我做自动。

1 个答案:

答案 0 :(得分:0)

我遇到了类似的问题 - 我经常想要嵌套短代码,我无法编辑我正在嵌套的代码来调用do_shortcode()。所以我写了一个通用的嵌套短代码例程。它允许您使用{}而不是[]来嵌套短代码,并要求您在调用中使用其他几个转义字符。它位于下方,但要在您的示例中使用它,您需要执行以下操作:

[nest shortcode="wpfilebase" tag=file path='{page_title}' tpl=download-button /]

它还允许传递参数 - 在这些情况下,您使用^来表示空格和'代表"。代码注释中有几个例子。

我认为这比在代码中包装直接wpfilebase调用要好,只是因为如果你想更改wpfilebase调用(添加参数等),那么你就不必回到functions.php和搞乱代码,你可以在页面中进行。

希望这有帮助!

add_shortcode('nest', 'shortcode_nest');

function shortcode_nest($atts) {
    // Replace square brackets [] with curly braces {} to nest a shortcode call
    // Use hat ^ instead of spaces when adding parameters to nested calls
    // Use single quote ' instead of double quote " when adding parameters to nested calls
    // 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]
    // or [nest shortcode=originalshortcode content="hello!" param="in {getcountryshortcode^id='94'}"]
    //    to generate [originalshortcode param="in Ireland"]hello![/originalshortcode]
    $shortcode = $atts["shortcode"];
    unset($atts["shortcode"]);
    $stratts = "";
    foreach ($atts as $key => $value) {
        $value = str_replace('{', '[', str_replace('}', ']', $value));
        $value = str_replace('^', ' ', $value);
        $value = str_replace('\'', '"', $value);
        $value = do_shortcode($value);
        if ($key == "content")
            $content = $value;
        else
            $stratts .= "$key='$value' ";
    }
    if (!isset($content))
        $fullcode = "[$shortcode $stratts]";
    else
        $fullcode = "[$shortcode $stratts]$content" . '[/' . $shortcode . ']';
    return do_shortcode($fullcode);
}