如何处理不同标签的多个嵌套短码?

时间:2016-04-17 作者:DivineCake

您好,我对短代码编程相当陌生,想知道是否可以使用不同的短代码标记处理以下嵌套的短代码:

[review]

    [title]Sample Review[/title]
    [image]http://localhost/wordpress/wp-content/uploads/2016/04/picture.jpg[/image]
    [criteria title="Criteria 1" score="100"]
    [criteria title="Criteria 2" score="90"]
    [criteria title="Criteria 3" score="80"]

[/review]
要生成此预期html块,请执行以下操作:

<section id="review">
    <div class="review-top">
        <h2>Sample Review</h2> <!--Content of [title][/title]-->
    </div>
    <div class="review-left">
        <img src="http://localhost/wordpress/wp-content/uploads/2016/04/picture.jpg"> <!--Content of [image][/image]-->
    </div>
    <div class="review-criteria">
        <h3>Criteria 1 - 100</h3> <!--Attribute of [criteria]-->
    </div>
    <div class="review-criteria">
        <h3>Criteria 2 - 90</h3> <!--Attribute of [criteria]-->
    </div>
    <div class="review-criteria">
        <h3>Criteria 3 - 80</h3> <!--Attribute of [criteria]-->
    </div>
    <div class="review-summary">
        <h2>90</h2> <!--Average of Criteria 1-3\'s score-->
    </div>
</section> 
我知道我必须递归地使用do\\u短代码($content),但这样做将调用$contents中的所有短代码,并将产生以下结果:

<section id="review">
    <div class="review-top">
        <h2>Sample Review</h2> <!--Content of [title][/title]-->
        <img src="http://localhost/wordpress/wp-content/uploads/2016/04/picture.jpg"> <!--Content of [image][/image]-->
        <div class="review-criteria">
            <h3>Criteria 1 - 100</h3> <!--Attribute of [criteria]-->
        </div>
        <div class="review-criteria">
            <h3>Criteria 2 - 90</h3> <!--Attribute of [criteria]-->
        </div>
        <div class="review-criteria">
            <h3>Criteria 3 - 80</h3> <!--Attribute of [criteria]-->
        </div>
    </div>
    ...
</section> 
短代码如下:

function makeTitle( $atts, $content = null ) {
    return \'<h2>\'.$content. \'</h2> <!--Content of [title][/title]-->\';
} 
add_shortcode(\'title\', \'makeTitle\'); 

function makeImage( $atts, $content = null ) {
    return \'<img src="\'.$content.\'"> <!--Content of [image][/image]-->\';
} 
add_shortcode(\'image\', \'makeImage\');

function makeCriteria( $atts, $content = null ) {
    extract(shortcode_atts(
    array(
        \'title\' => \'Criteria\',
        \'score\' => \'0\',
    ), $atts ));
    return \'<div class="review-criteria">
    <h3>\'.$title. \' - \' .$score. \'</h3> <!--Attribute of [criteria]-->
</div>\';
} 
add_shortcode(\'criteria\', \'makeCriteria\');  

function makeReview( $atts , $content = null ) {
    return \'<section id="review"><div class="review-top">\'.do_shortcode($content).\'</div></section>\';
    ...
}
add_shortcode(\'review\', \'makeReview\');
我想做的是在第一个do\\u shortcode($content)上,它应该只对[title][/title]执行do\\u shortcode。非常感谢!

2 个回复
最合适的回答,由SO网友:Mark Kaplun 整理而成

我认为您使用短代码嵌套是一个坏主意,因此您真正需要的是重新思考您的策略。

嵌套短代码本身并不坏,但短代码应该是独立的实体,在您的结构中,内部代码显然取决于是否是“内部的”,它们本身没有任何用处。一个错误的复制和粘贴,一个字符添加到错误的位置,整个结构将在用户没有任何工具进行调试的情况下失败。

如果你的核心内容是评论,那么只需添加一个元框,其中可以填充所有相关数据,只需使用[review] 显示它的快捷码。

SO网友:Tung Du

对于嵌套的短代码,必须do_shortcode 为您的$content.

function makeTitle( $atts, $content ) {
    ob_start(); ?>
    <h2>
        <?php echo do_shortcode( $content ); ?>
    </h2>
    <?php
    return ob_get_clean();
}

相关推荐

SHORTCODE_ATTS()中的$ATTS参数是什么?

这个WordPress developers reference page for shortcode_atts() 国家:$atts(array)(必选)用户在shortcode标记中定义的属性。但我不理解这个定义。例如,在WP Frontend Profile 插件:$atts = shortcode_atts( [ \'role\' => \'\', ], $atts ); 据我所知,shortcode\