web-dev-qa-db-ja.com

配列内の各ショートコードをdivにラップする

私は特別なデータ属性でdivの各ショートコードをラップしようとしています、しかし私が入れ子にされたショートコードを使用しているとき、彼らはラップしません、どこで私は間違っていますか?ありがとう

public function wrapShortcode( $content )
{
    preg_match_all( '/' . get_shortcode_regex() . '/', trim( $content ), $found , PREG_SET_ORDER | PREG_OFFSET_CAPTURE );

    if ( ! empty( $found  ) ) {
        for ( $i = count( $found  ) - 1; $i >= 0; $i-- ) {
            $id = md5( time() . '-' . $this->tag_index ++ );
            $match = $found[ $i ];

            $scCont = substr( $content, $match[0][1], strlen( $match[0][0] ) );
            $shortcode = array(
                'tag'   => $match[2][0]
            );

            $modifiedShortcode = '<div class="shortcode" data-name="'.$shortcode['tag'].'">'.$scCont.'</div>';
            $content = substr( $content, 0, $match[0][1] ) . $modifiedShortcode . substr( $content, $match[0][1] + strlen( $match[0][0] ) );
        }
    }

    remove_action( 'the_content', array( $this, 'wrapShortcode' ), 1 );

    // Stray spaces can create lost paragraph tags.
    $content = preg_replace( '/(\/\w+>)\s+(<\/\w+)/', '$1$2', $content );
    return apply_filters( 'bq_wrapShortcode', $content );
}
add_filter( 'the_content', array( $this, 'wrapShortcode' ), -9999999 );

このコードは、次のようなショートコードで問題なく機能します。

[shortcode][/shortcode]

そして戻る:

<div class="shortcode" data-name="shortcode">[shortcode][/shortcode]</div>

しかし、私がネストされたショートコードを使ったとき、私のコードは最初のショートコードだけをラップし、内側のショートコードはラップされませんでした:

<div class="shortcode" data-name="shortcode">[shortcode][inner_shortcode][/inner_shortcode][/shortcode]</div>

しかしこれを返さなければなりません:

<div class="shortcode" data-name="shortcode">
     [shortcode]
     <div class="shortcode" data-name="inner_shortcode">
        [inner_shortcode][/inner_shortcode]                 
     </div>
     [/shortcode]
</div>

どこが悪いの?ありがとうございます。

2
20yco

ショートコードの内容(get_shortcode_regex()から返される$m[5])に再帰する必要があります。標準的な方法はpreg_replace_callback()を使用することです。

    public function wrapShortcode( $content )
    {
        $content = preg_replace_callback( '/' . get_shortcode_regex() . '/s', array( $this, 'wrapShortcodeCallback' ), $content );

        remove_filter( 'the_content', array( $this, 'wrapShortcode' ), -9999999 );

        // Stray spaces can create lost paragraph tags.
        $content = preg_replace( '/(\/\w+>)\s+(<\/\w+)/', '$1$2', $content );
        return apply_filters( 'bq_wrapShortcode', $content );
    }
    public function wrapShortcodeCallback( $m )
    {
        $id = md5( time() . '-' . $this->tag_index ++ );
        if ( $m[5] !== '' ) {
            // Recurse into content.
            $m[5] = preg_replace_callback( '/' . get_shortcode_regex() . '/s', array( $this, 'wrapShortcodeCallback' ), $m[5] );
            $scCont = '[' . $m[1] . $m[2] . $m[3] . ']' . $m[5] . '[/' . $m[2] . ']' . $m[6];
        } else {
            $scCont = '[' . $m[1] . $m[2] . $m[3] . $m[4] . ']' . $m[6];
        }
        return '<div class="shortcode" data-name="'.$m[2].'">'.$scCont.'</div>';
    }
1
bonger