1

所以另一个嵌套的短代码问题。我有两个简码:[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,以及wordpress codex,但答案对我不起作用。也许只是因为我没有在我的 function.php 文件中以正确的方式实现短代码?

如果有人可以帮助我吗?我真的很想了解是什么让它不起作用。提前非常感谢。对不起我的英语不好,我希望我可以理解。

编辑 我在完成之前愚蠢地验证了我的评论,所以它是:

嗨@maiorano,非常感谢您的帮助,它工作得很好。但是,即使您的代码非常好,我也不能按原样使用它,因为我需要直接从媒体库中获取图片,并且尽可能少地在 MCE 编辑器中进行人为干预。但它让我学会了一条神路。

我还测试了在顶级简码中使用 do_shortcode,但它产生了一个奇怪的结果:我的 < p > 被驱逐出 < div > 所以我很困惑。

因此,阻止我的似乎是顶级 do_shortcode-ish 的组合,也许是我的 add_shortcode() 在短代码之后声明的事实。

4

1 回答 1

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>
于 2012-09-18T13:25:07.930 回答