it-swarm.com.de

Wickeln Sie jeden Shortcode im Array in div

ich versuche, jeden Shortcode in Div mit speziellen Datenattributen zu verpacken, aber wenn ich verschachtelten Shortcode verwende, werden sie nicht verpackt, wo irre ich mich? Vielen Dank

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

dieser Code funktioniert gut mit Shortcodes wie folgt:

[shortcode][/shortcode]

und zurück:

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

aber als ich verschachtelten Shortcode benutzte, wurde mein Code nur beim ersten Shortcode umgebrochen, der innere Shortcode wurde nicht umgebrochen:

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

aber muss dies zurückgeben:

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

wo irre ich mich Vielen Dank!

2
20yco

Sie müssen in den Shortcode-Inhalt ($m[5], wie von get_shortcode_regex() zurückgegeben) zurückkehren, wobei preg_replace_callback() standardmäßig verwendet wird:

    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