问题
我有一个名为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多个帖子,短代码可以为我做自动。
答案 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);
}