it-swarm.com.de

Benutzerdefiniertes HTML nach dem Shortcode einfügen

Das Szenario ist, dass ich ein HTML-Banner unter einer Diashow hinzufügen muss, die ein Shortcode im Homepage-Inhalt ist. Ich persönlich hasse es, dem TinyMCE-Editor ein paar div-Tags hinzuzufügen, also versuche ich, the_content zu filtern und meinen HTML-Code nach dem spezifischen Shortcode hinzuzufügen. Unten ist eine Lösung, aber ich war mir nicht sicher, ob es einen besseren Weg dafür gibt.

Was ist der beste Weg, um Inhalte nach bestimmten Shortcodes hinzuzufügen?

6
Howdy_McGee

Ich frage mich, ob Sie den [rev_slider] mit dieser Art von Wrapper überschreiben könnten:

add_shortcode( 'rev_slider', function( $atts = array(), $content = '' )
{
    $html = '';

    // Your custom banner HTML
    $banner = '<div id="bannerHTML"><!-- banner HTML goes here --></div>';

    // Append your banner HTML to the revslider's output
    if( function_exists( 'rev_slider_shortcode' ) )
        $html = rev_slider_shortcode( $atts, $content ) . $banner;

    return $html;

} );

Wobei wir annehmen, dass der Rückruf des ursprünglichen Shortcodes rev_slider_shortcode() ist. Wir müssen das nach dem Original laufen lassen.

Aktualisieren

Wie von @Sumit vorgeschlagen, könnten wir versuchen, den Rückruf des Shortcodes vom Array $shortcode_tags abzurufen.

Hier ist ein Beispiel:

add_action( 'after_setup_theme', function() use ( &$shortcode_tags )
{
    // Shortcode to override. Edit to your needs
    $shortcode = 'rev_slider';

    // Nothing to do if it's not registered as shortcode
    if( ! shortcode_exists( $shortcode ) )
        return; 

    // Get the shortcode's callback
    $callback = $shortcode_tags[$shortcode];

    // Override the shortcode
    add_shortcode( $shortcode, function( $atts = array(), $content = '' ) use ( $callback )
    {
        // Your custom banner HTML
        $banner = '<div id="bannerHTML">123<!-- banner HTML goes here --></div>';

        // Append your banner HTML to the revslider's output
        return 
            is_callable( $callback ) 
            ? call_user_func( $callback, $atts, $content, $callback ) . $banner 
            : '';
    } );

}, PHP_INT_MAX );

Hier binden wir uns spät in die Aktion after_setup_theme ein und verwenden call_user_func(), um den Rückruf des vorherigen Shortcodes auszuführen, ähnlich wie es in do_shortcode_tag() gemacht wird.

4
birgire

Dies ist eine Lösung, die ich gefunden habe, nachdem ich sie ein wenig verfeinert habe. Das unten stehende sollte nur ausgeführt werden, wenn der Shortcode im Inhalt vorhanden ist. Es durchläuft alle Shortcodes, um den gewünschten zu finden, und ersetzt ihn durch den Shortcode plus den neuen HTML-Code:

function insert_after_shortcode( $content ) {
    if( ! has_shortcode( $content, 'shortcode_name' ) ) {
        return $content;
    }

    ob_start();
  ?>

    <div id="bannerHTML"><!-- banner HTML goes here --></div>

  <?php

    $additional_html = ob_get_clean();
    preg_match_all( '/'. get_shortcode_regex() .'/s', $content, $matches, PREG_SET_ORDER );

    if( ! empty( $matches ) ) {

        foreach ( $matches as $shortcode ) {

            if ( 'shortcode_name' === $shortcode[2] ) {
                $new_content = $shortcode[0] . $additional_html;
                $content     = str_replace( $shortcode[0], $new_content, $content );
            }
        }
    }

    return $content;
}
add_filter( 'the_content', 'insert_after_shortcode' );
2
Howdy_McGee