1

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

你能帮忙吗?

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

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)。

4

1 回答 1

0

终于自己弄清楚了如何实现这一目标。

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

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

    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 );
    }
于 2019-08-09T12:31:10.017 回答