web-dev-qa-db-ja.com

出力バッファの適切な使用

私はテンプレートを介して私が現在持っている関数呼び出しをオーバーライドするためにアクションを使用しようとしています(ある複製されたセクションをより簡単に更新するために)。たとえば、archives.phpでは、次のようになります。

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

roots_content_before();のようないくつかの関数を見ることができます別のファイルでは、私は以下を持っています:

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

そしてそれを次のように使います。

<?php

    add_action('roots_content_before', 'roots_bootstrap_content_before');

    function roots_bootstrap_content_before() { ?>

        this is some text

    <?php }

?>

私が読んだものから、特にコードの大きな塊があるなら、私は出力バッファを使うべきですが、これをやろうとすると、きちんとしゃがんでいます:

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

    }

?>

私はこれを完全に間違っていると思いますか?私はまだ学んでいますが、少しも成功せずに少しの間努力してきました。正しい方向へのどんなポインタでも本当に感謝されるでしょう。ありがとうございます。

5
Zach

いいえ、この場合は出力バッファリングは必要ありません。経験則として、本当に必要な場合以外は、出力バッファリングを使用しないでください。

他の誰かがプラグインからの出力バッファリングを使用していて、それがあなたのものと交差するとどうなるか想像してみてください。

// 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!

これは本当にデバッグが難しいです。避けてください。


あなたは普通のdo_action()をカバーするために別の関数を必要としません。あなたのテーマにdo_action('roots_content_before');を書くだけです。

13
fuxia

@ toschoの答えは全く間違っています。

4
Robert