如何在wordpress中递归解码简码

Posted

技术标签:

【中文标题】如何在wordpress中递归解码简码【英文标题】:How to decode shortcodes recursively in wordpress 【发布时间】:2019-12-16 21:49:08 【问题描述】:

我正在尝试递归调用简码。 这个想法是在短代码中使用短代码,我尝试爆炸字符串尝试了其他一些逻辑,但都没有奏效。

你能帮忙吗?

我将在下面分享一个示例。

add_shortcode( 'first', function ( $attr ) 
    return 'First ' . $attr['key1'] . ' ' . $attr['key2'];
 );
add_shortcode( 'second', function ( $attr ) 
    return 'Second ' . $attr['key1'] . ' ' . $attr['key2'];
 );
add_shortcode( 'third', function ( $attr ) 
    return 'Third ' . $attr['key1'];
 );

现在假设字符串是$string = '[first key1="[second key1="abcd" key2="shortcode"]" key2="[third key1="shortcode"]"]';

$string = '[first key1="[second key1="abcd" key2="[third key1="shortcode"]"]" key2="[third key1="shortcode"]"]';

现在第一个字符串的输出很可能应该是这样的:'First Second abcd shortcode Third shortcode'

第二个应该是这样的:'First Second abcd Third shortcode Third shortcode'

但我没有得到结果。 有人可以帮我创建一个函数,它接受一个字符串并递归检查短代码,然后执行它们(do_shortcode)。

【问题讨论】:

【参考方案1】:

终于自己想出了如何实现这一点。

休息了一会儿,然后我想到了解决方案。

我正在为将来可能面临同样问题的人添加下面的代码。

    public function maybe_parse_nested_merge_tags( $string ) 
        $position_end = strpos( $string, ']' );
        if ( false === $position_end ) 
            return $string;
        

        $split          = str_split( $string, $position_end );
        $position_start = strrpos( $split[0], '[', - 1 );

        if ( false === $position_start ) 
            return $string;
        

        $shortcode_array = explode( '[', $split[0] );
        $shortcode       = end( $shortcode_array );
        $result          = do_shortcode( '[' . $shortcode . ']' );

        $string = str_replace( '[' . $shortcode . ']', $result, $string );

        return $this->maybe_parse_nested_merge_tags( $string );
    

【讨论】:

以上是关于如何在wordpress中递归解码简码的主要内容,如果未能解决你的问题,请参考以下文章

如何在 wordpress 选项中保存简码的内容?

如何在 WordPress 简码中使用 AJAX?

如何在 wordpress 中按简码列出类别?

如何从 Wordpress 页面/帖子中获取所有标签作为简码列表?

如何将简码插入现有的 html 元素(wordpress)?

Wordpress 如何使用简码从 localStorage 获取值