web-dev-qa-db-fra.com

Insérer un code HTML personnalisé après le shortcode

Le scénario est que je dois ajouter une bannière HTML sous un diaporama qui est un shortcode dans le contenu de la page d'accueil. Personnellement, je n'aime pas ajouter de nombreuses balises div à l'éditeur TinyMCE. J'essaie donc de filtrer the_content et d'ajouter mon code HTML après le shortcode spécifique. Vous trouverez ci-dessous une solution, mais je ne savais pas s’il existait une meilleure façon de procéder.

Quelle est la meilleure façon d'ajouter du contenu après des codes courts spécifiques?

6
Howdy_McGee

Je me demande si vous pourriez remplacer le [rev_slider] par ce type de wrapper:

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;

} );

Où nous supposons que le rappel du shortcode d'origine est rev_slider_shortcode(). Nous devons courir après l'original.

Mettre à jour

Comme suggéré par @Sumit, nous pourrions essayer d'obtenir le rappel du shortcode à partir du tableau $shortcode_tags.

Voici un exemple:

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

Ici, nous accrochons tardivement à l'action after_setup_theme et utilisons call_user_func() pour exécuter le rappel du shortcode précédent, de la même manière que dans do_shortcode_tag().

4
birgire

C’est une solution que j’ai trouvée après l’avoir peaufinée un peu. Le ci-dessous ne devrait s'exécuter que si le shortcode existe dans le contenu. Il parcourt tous les codes courts pour trouver celui dont nous avons besoin, le remplace par le code court plus le nouveau code HTML:

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