it-swarm.com.de

Ordnungsgemäße Verwendung des Ausgabepuffers

Ich versuche, Aktionen zu verwenden, um die derzeit in einer Vorlage vorhandenen Funktionsaufrufe zu überschreiben (um das Aktualisieren bestimmter replizierter Abschnitte zu vereinfachen). Zum Beispiel habe ich in archives.php Folgendes:

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

Sie können einige der Funktionen wie roots_content_before(); sehen. In einer separaten Datei habe ich Folgendes:

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

und benutze es wie folgt:

<?php

    add_action('roots_content_before', 'roots_bootstrap_content_before');

    function roots_bootstrap_content_before() { ?>

        this is some text

    <?php }

?>

Nach dem, was ich gelesen habe, sollte ich, besonders wenn ich große Codestücke haben möchte, den Ausgabepuffer verwenden, aber wenn ich das versuche, bekomme ich dummes Gedränge:

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

    }

?>

Denke ich darüber völlig falsch? Ich lerne noch, habe es aber ein bisschen erfolglos versucht. Alle Hinweise in die richtige Richtung wäre wirklich dankbar. Vielen Dank!

5
Zach

Nein, in diesem Fall benötigen Sie keine Ausgabepufferung. Als Faustregel gilt: Verwenden Sie die Ausgabepufferung nur, wenn Sie es wirklich müssen.

Stellen Sie sich vor, was passiert, wenn jemand anderes die Ausgabepufferung eines Plugins verwendet und diese mit Ihrer übereinstimmt:

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

Das ist wirklich schwer zu debuggen. Vermeide es.


Sie benötigen keine separate Funktion, um eine einfache do_action() abzudecken. Schreiben Sie einfach do_action('roots_content_before'); in Ihr Thema.

13
fuxia

@ toschos Antwort ist völlig falsch.

4
Robert