web-dev-qa-db-fra.com

Utilisation correcte du tampon de sortie

J'essaie d'utiliser des actions pour remplacer les appels de fonction que j'ai actuellement dans un modèle (pour faciliter la mise à jour de certaines sections répliquées). Par exemple, dans archives.php j'ai les éléments suivants:

<?php get_header(); ?>

    <?php roots_content_before(); ?>
    <?php $page_for_posts = get_option( 'page_for_posts' ); if ($page_for_posts) { echo '<h1>' . get_the_title($page_for_posts) . '</h1>'; } ?>
    <h3>
        <?php
            $term = get_term_by('slug', get_query_var('term'), get_query_var('taxonomy'));
            if ($term) {
                echo $term->name;
            } elseif (is_day()) {
                printf(__('Daily Archives: %s', 'roots'), get_the_date());
            } elseif (is_month()) {
                printf(__('Monthly Archives: %s', 'roots'), get_the_date('F Y'));
            } elseif (is_year()) {
                printf(__('Yearly Archives: %s', 'roots'), get_the_date('Y'));
            } elseif (is_author()) {
                global $post;
                $author_id = $post->post_author;
                printf(__('Author Archives: %s', 'roots'), get_the_author_meta('user_nicename', $author_id));
            } else {
                single_cat_title();
            }
        ?>
    </h3>
    <?php echo category_description(); ?>
    <?php roots_loop_before(); ?>
    <?php get_template_part('loop', 'category'); ?>
    <?php roots_loop_after(); ?>
    <?php roots_content_after(); ?>

<?php get_footer(); ?>

Vous pouvez voir quelques-unes des fonctions, comme roots_content_before(); Dans un fichier séparé, j’ai les informations suivantes:

function roots_content_before() { do_action('roots_content_before'); }

et l'utiliser comme suit:

<?php

    add_action('roots_content_before', 'roots_bootstrap_content_before');

    function roots_bootstrap_content_before() { ?>

        this is some text

    <?php }

?>

D'après ce que j'ai lu, en particulier si je vais avoir de gros morceaux de code, je devrais utiliser le tampon de sortie, mais lorsque j'essaie de faire cela, je me fais mal à l'aise:

<?php

    add_action('roots_content_before', 'roots_bootstrap_content_before');

    function roots_bootstrap_content_before() { ob_start(); ?> 

        this is some text

       <?php return ob_get_clean();

    }

?>

Est-ce que je pense à cela complètement faux? J'apprends encore, mais j'essaie depuis un moment sans succès. Tous les indicateurs dans la bonne direction seraient vraiment appréciés. Merci!

5
Zach

Non, vous n’avez pas besoin de mise en mémoire tampon de sortie dans ce cas. En règle générale: n'utilisez pas la mise en mémoire tampon de sortie à moins que vous n'y soyez obligé.

Imaginez ce qui se passe si quelqu'un d'autre utilise également la mise en tampon de sortie d'un plugin et que celle-ci se croise avec le vôtre:

// plugin
ob_start();

// later, you in your theme
ob_start();

// you call a function where the plugin author hooked in to call:
print ob_get_clean();

// you call *your*:
return ob_get_clean();

// is is empty!

C'est vraiment difficile à déboguer. L'éviter.


Vous n'avez pas besoin d'une fonction distincte pour couvrir une do_action() simple. Écrivez simplement do_action('roots_content_before'); dans votre thème.

13
fuxia

La réponse de @ toscho est totalement fausse.

4
Robert