it-swarm.com.ru

Правильное использование выходного буфера

Я пытаюсь использовать действия для переопределения вызовов функций, которые у меня есть в данный момент во всем шаблоне (чтобы упростить обновление определенных реплицированных разделов). Например, в 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