La temporisation de sortie : ob_start() et ob_get_clean()

Il est possible d'insérer un « shortcode » sur une page qui affiche déjà du texte.

Ex :

texte entré dans une page WordPress

Texte avant le « shortcode ».

[christianemonshortcode]

Texte après le « shortcode ».

Dans ce cas, nous voudrons certainement que le texte généré par le « shortcode » apparaisse exactement à l'endroit où nous avons placé le « shortcode » et ce, peu importe la façon dont le tout est codé.

▼Publicité


Mise à jour

ob_start() sera nécessaire lorsque le code du « shortcode » effectue un echo. Si vous prenez bien soin de toujours placer le texte dans une chaîne qui sera utilisée dans le return, vous n'aurez pas besoin de la temporisation se sortie.

C'est néanmoins une bonne idée de toujours l'utiliser, juste au cas où...

Pour nous assurer que tout apparaisse au bon endroit, il faudra utiliser la temporisation de sortie.

Qu'est-ce que ça veut dire ? Eh bien nous allons demander à WordPress de ne rien envoyer au navigateur tant que nous n'aurons pas terminé notre travail. 

La temporisation de sortie sera débutée par un appel à la fonction ob_start(). Notez qu'il s'agit d'une fonction PHP qui peut être utilisée dans n'importe quel programme PHP et non seulement dans les sites WordPress. La temporisation de sortie sera terminée par un appel à ob_get_clean().

Ex :

WordPress (PHP)

function christiane_mon_shortcode( ) {

    // début de la temporisation

    ob_start();

 

    $code_html = "<span class='textespecial'>Voici le texte qui sera affiché à la place du shortcode</span>";

 

    // on retrouve ici tout le code qui aurait pu être envoyé au navigateur pendant notre traitement

    $output = ob_get_clean();

 

    return $code_html . $output;

}

 

add_shortcode( 'christianemonshortcode', 'christiane_mon_shortcode' );

ou, si le « shortcode » est défini dans une extension : 

WordPress (PHP)

class ... {

 

    public function __construct() {

        add_shortcode( 'christianemonshortcode', array( &$this, 'mon_shortcode' ) );

        ...

    }

 

    function mon_shortcode( ) {

        // début de la temporisation

        ob_start();

 

        $code_html = "<span class='textespecial'>Voici le texte qui sera affiché à la place du shortcode</span>";

 

        // on retrouve ici tout le code qui aurait pu être envoyé au navigateur pendant notre traitement

        $output = ob_get_clean();

 

        return $code_html . $output;

    }

}

Pour plus d'information

« Creating Shortcodes Using WordPress Part 1 ». Jeffrey Dev. http://www.jeffreydev.com/creating-shortcodes-using-wordprss-part1/

« WordPress shortcode output buffer versus appending to string ». Philaeum - Strategic Internet Solutions. http://www.philaeum.nl/blog/index.php/wordpress-shortcode-output-buffer-versus-returning-string/

Merci de partager ! Share on FacebookTweet about this on TwitterShare on Google+Share on LinkedInPin on PinterestShare on StumbleUponEmail this to someone
Catégories

2 commentaires

  1. Salut, pour pousser un peut, j’ajoute que si la sortie est avant la page, c’est très certainement que le shortcode retourne un echo », je construit actuellement un système de thème basé sur la construction d’une pile avant l’affichage parce que je déteste la syntaxe de wp, bref…
    J’ai eu aussi ce genre de soucis avec plusieurs éléments envoyer par wp et notamment la sidebar ou il n’existe pas d’alternative a l’echo, j’ai résolu mon soucis comme ca:
    function slWsu_get_dynamic_sidebar($index = 1) {
    ob_start();
    dynamic_sidebar($index);
    $sortie = ob_get_clean();
    return $sortie;
    }
    de cette façon, je garde la sidebar en mémoire et décide du moment de son affichage.

    Un ami a moi lui travail avec une fonction qui en plus prends les arguments en paramètre:

    function jemweb_get_htmloutput($wp_function, $arguments = null)
    {
    $retour = false;
    if(function_exists($wp_function))
    {
    ob_start();
    if(is_null($arguments))
    {
    $wp_function();
    }
    else
    {
    $wp_function($arguments);
    }
    $retour = ob_get_contents();
    ob_end_clean();
    }
    return ($retour);
    }

    Voila en gros, alors je sais bien que ces deux fonctions n’auront pas grand intérêt si vous travaillez avec les standards de wordpress mais bon, j’avais 5 min a perdre car j’ai gagner un bon moment grâce a l’article sur l’ajout de tables lors d’activation d’un thème, MERCi…

    • Christiane Lagacé

      Bonjour Steeve,

      Merci d’avoir partagé ce code. C’est bien agréable quand les gens qui ont 5 minutes à perdre les utilisent pour faire bénéficier les autres de leur expérience.

      Bon développement !

      Christiane