所以另一个嵌套的短代码问题。 我有两个短代码:[slide]和[prg]。它们都包含短码。 [prg]嵌套在[slide]中。但是[prg]没有被解释。 这两个短代码分别很好用。 我知道do_shortcode()函数,但它似乎不起作用,我不知道为什么。
这是我写的代码:
add_action( 'init', 'register_shortcodes');
function make_slide($atts, $content = null) {
extract(shortcode_atts(array(
'num' => 1,
), $atts));
$post_title = get_the_title($post->ID);
$wrap = '<div class="slide slide-'.$num.'"><h1 class="h2-like projet_title">'.$post_title.'</h1>'.$content.'</div>';
return $wrap;
}
function wrap_paragraph($atts, $content = null)
{
$content = do_shortcode($content); //I've tried several solutions but none've worked.
return '<p>'.$content.'</p>';
}
function register_shortcodes(){
add_shortcode('slide', 'make_slide');
add_shortcode('prg', 'wrap_paragraph');
}
以下是html编辑器中我的帖子(自定义帖子类型)的内容:
[slide num="1"]<img title="4a6c2a605946a_1080x733" src="http://localhost:8888/labs/noway/wordpress_1/wp-content/uploads/2012/09/4a6c2a605946a_1080x733-460x312.jpg" alt="4a6c2a605946a_1080x733" width="460" height="312" />
[prg]Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nam cursus. Morbi ut mi. Nullam enim leo, egestas id, condimentum at, laoreet mattis, massa.[/prg][/slide]
我已阅读本网站和其他网站上的几篇帖子,例如sitepoint.com和speckyboy.com,以及the wordpress codex,但答案对我不起作用。 也许这只是因为我没有在我的function.php文件中以正确的方式实现短代码?
如果有人可以帮助我?我真的想了解是什么让它无法运作。非常感谢提前。 抱歉我的英语不好,我希望我能理解。
修改 在完成之前我已经愚蠢地验证了我的评论,所以它是:
嗨@maiorano非常感谢你的帮助,它完美无缺。 然而,即使您的代码非常好,我也无法使用它,因为我需要直接从媒体库中获取图片,尽可能减少MCE编辑器中的人为干预。但这让我学会了一条蠢货。
此外,我已经测试过将do_shortcode用于顶级短代码,但它产生了一个奇怪的结果:我的&lt; p>被驱逐出境外&lt; div>所以我很困惑。
所以似乎阻止我的是那个顶级do_shortcode-ish的组合,也许是我的add_shortcode()在短代码之后被声明的事实。
答案 0 :(得分:1)
问题是您的顶级短片“[幻灯片]”没有在其内容上执行do_shortcode()
。一些指示:
我建议将您的图像属性包括为短代码属性,因为它可以减少标记量并使您能够定义默认值。
您也无需在'init'回调中定义短代码。它可以在全球范围内完成:
add_shortcode('slide', 'make_slide');
add_shortcode('prg', 'wrap_paragraph');
function make_slide($atts, $content = null)
{
extract(shortcode_atts(array(
'num' => 1,
'title' => false,
'src' => get_bloginfo('stylesheet_directory').'/images/notfound.jpg', //Default image if none provided
'alt' => false,
'width' => false,
'height' => false,
), $atts));
$title = $title ? " title=\"$title\"" : '';
$alt = $alt ? " alt=\"$alt\"" : '';
$width = $width ? " width=\"$width\"" : '';
$height = $height ? " height=\"$height\"" : '';
$img = "<img src=\"$src\"".$title.$alt.$width.$height." />";
$post_title = get_the_title($post->ID);
$wrap = '<div class="slide slide-'.$num.'"><h1 class="h2-like projet_title">'.$post_title.'</h1>'.$img.do_shortcode($content).'</div>';
return $wrap;
}
function wrap_paragraph($atts, $content = null)
{
$content = do_shortcode($content); //This is fine if you plan on nesting shortcode within this callback
return '<p>'.$content.'</p>';
}
使用此功能,我可以添加内容:
[slide num="1" title="4a6c2a605946a_1080x733" src="http://localhost:8888/labs/noway/wordpress_1/wp-content/uploads/2012/09/4a6c2a605946a_1080x733-460x312.jpg" alt="4a6c2a605946a_1080x733" width="460" height="312"][prg]Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nam cursus. Morbi ut mi. Nullam enim leo, egestas id, condimentum at, laoreet mattis, massa.[/prg][/slide]
得到:
<div class="slide slide-1"><h1 class="h2-like projet_title">Hello world!</h1><img width="460" height="312" alt="4a6c2a605946a_1080x733" title="4a6c2a605946a_1080x733" src="http://localhost:8888/labs/noway/wordpress_1/wp-content/uploads/2012/09/4a6c2a605946a_1080x733-460x312.jpg"><p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nam cursus. Morbi ut mi. Nullam enim leo, egestas id, condimentum at, laoreet mattis, massa.</p></div>