Utilizarea corectă a Output Buffer
Încerc să folosesc acțiuni pentru a suprascrie apelurile de funcții pe care le am în prezent în tot șablonul (pentru a face mai ușoară actualizarea anumitor secțiuni replicate). De exemplu, în archives.php
am următoarele:
<?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(__('Arhive zilnice: %s', 'roots'), get_the_date());
} elseif (is_month()) {
printf(__('Arhive lunare: %s', 'roots'), get_the_date('F Y'));
} elseif (is_year()) {
printf(__('Arhive anuale: %s', 'roots'), get_the_date('Y'));
} elseif (is_author()) {
global $post;
$author_id = $post->post_author;
printf(__('Arhivele autorului: %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(); ?>
Puteți vedea câteva dintre funcții, cum ar fi roots_content_before();
Într-un fișier separat, am următoarele:
function roots_content_before() { do_action('roots_content_before'); }
și o folosesc astfel:
<?php
add_action('roots_content_before', 'roots_bootstrap_content_before');
function roots_bootstrap_content_before() { ?>
acesta este un text
<?php }
?>
Din ce am citit, mai ales dacă voi avea bucăți mari de cod, ar trebui să folosesc buffer-ul de ieșire, dar când încerc să fac acest lucru, nu primesc nimic:
<?php
add_action('roots_content_before', 'roots_bootstrap_content_before');
function roots_bootstrap_content_before() { ob_start(); ?>
acesta este un text
<?php return ob_get_clean();
}
?>
Gândesc complet greșit? Încă învăț, dar am încercat de ceva timp fără niciun succes. Orice indiciu în direcția corectă ar fi foarte apreciat. Mulțumesc!

Nu, nu ai nevoie de bufferizarea ieșirii în acest caz. Ca regulă generală: Nu folosi bufferizarea ieșirii decât dacă chiar trebuie.
Imaginează-ți ce se întâmplă dacă cineva altcineva folosește și el bufferizarea ieșirii printr-un plugin și se intersectează cu a ta:
// plugin
ob_start();
// mai târziu, tu în tema ta
ob_start();
// apelezi o funcție în care autorul pluginului a adăugat un hook pentru a apela:
print ob_get_clean();
// apelezi *pe a ta*:
return ob_get_clean();
// este gol!
Acest lucru este foarte greu de depanat. Evită-l.
Nu ai nevoie de o funcție separată pentru a acoperi un simplu do_action()
. Scrie direct do_action('roots_content_before');
în tema ta.

Sunt de acord cu toscho aici. Nu folosi Output Buffering. Folosește apeluri de acțiuni și filtre acolo unde este nevoie.

Salut @toscho, apreciez mult feedback-ul. Abia începeam să citesc despre output buffering, dar din acel articol, părea că există o creștere a performanței. Indiferent dacă este sau nu adevărat, se pare că dacă controlezi întreaga aplicație atunci ar fi benefic, dar din moment ce WordPress are mii de plugin-uri, s-ar putea să cauți probleme ;) Mulțumesc din nou!

@Zach Acest articol este greșit încă de la prima linie. :) Trimite output-ul către utilizator cât mai repede posibil. În teme cu cod care rulează lent, eu chiar apelez flush()
înainte și după codul lent pentru a accelera randarea.

Randare progresivă prin multiple flush-uri este o lectură bună.

toscho, poți avea buffere de ieșire imbricate. Nu e bine să pierzi controlul asupra lor totuși :)

@offroff În WP, altcineva poate adăuga o imbricare nedorită. Prin urmare, nu utilizați acest lucru în plugin-uri sau teme.

Acest răspuns este un pic înșelător. Ignoră situațiile în care puteți folosi OB fără probleme. De exemplu, aveți o funcție care afișează un cod HTML și doriți să returnați acel HTML. Atâta timp cât nu declanșați acțiuni comune sau nu apelați funcții WP precum get_header() în ea, ar trebui să utilizați OB pentru a produce un cod mai lizibil.

@OneTrickPony În funcție de operațiile exacte pe care le executați, puteți atinge mai devreme limita de memorie cu bufferizarea output-ului pentru că... ei bine... totul este stocat în memorie până când este apelată funcția ob_end_clean()
. Dacă aveți cu adevărat nevoie - folosiți-o. Asta am spus și în răspunsul meu. :)

Răspunsul lui @toscho este complet greșit.
Buffering-ul de ieșire poate fi imbricat, nu este nevoie să vă faceți griji cu privire la alte plugin-uri.
În acest articol din 2009 există o metodă foarte elegantă de a prelua și manipula ieșirea finală a WordPress.

Acest lucru este un pic prea dur. Cred că ceea ce a încercat @toscho să spună nu este că nu poți imbrica, ci că dacă din anumite motive apelezi ob_get_clean()
înainte ca codul altui plugin, care a inițiat primul ob_start()
, să apeleze ob_get_clean()
, vei obține rezultate neașteptate. El doar avertizează că ar trebui să folosești această metodă doar dacă nu există altă alternativă, deoarece există dezavantaje care pot să nu fie imediat evidente.

Ai verificat al doilea link? Există o soluție elegantă care abordează exact problema din această întrebare. Nu există nimic neașteptat la imbricare; încearcă singur: ob_start();
echo "0";
ob_start();
echo "a";
echo ob_get_clean();
echo "1";
$a = ob_get_clean();
echo $a;

Să fiu sincer - nu am făcut-o. Din nou, tot ce spun este că există multe modalități de a da greș cu această abordare, așa că e mai bine să o folosești doar atunci când nu există altă opțiune. Ca observație secundară: Acesta este exact motivul pentru care răspunsurile care conțin doar link-uri nu sunt apreciate aici. Dacă ai fi adăugat esența link-urilor tale în răspuns, asta ar fi fost mult mai util.
