私は特別なデータ属性で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>
どこが悪いの?ありがとうございます。
ショートコードの内容(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>';
}