Proper use of Output Buffer

时间:2012-02-02 作者:Zach

我正在尝试使用操作覆盖当前在整个模板中进行的函数调用(以便更轻松地更新某些复制的节)。例如,在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();

    }

?>
我是不是完全错了?我仍在学习,但已经尝试了一段时间,但没有任何成功。任何指向正确方向的指针都会非常感激。谢谢

2 个回复
最合适的回答,由SO网友:fuxia 整理而成

不,在这种情况下不需要输出缓冲。经验法则是:除非确实需要,否则不要使用输出缓冲。

试想一下,如果其他人也使用插件的输出缓冲,而它与您的插件交叉,会发生什么情况:

// 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\'); 在您的主题中。

SO网友:Robert

@托肖的回答是完全错误的。

结束