Utilizarea ob_start() într-un plugin

11 mai 2016, 01:28:35
Vizualizări: 21.2K
Voturi: 3

Învăț cum să construiesc un plugin WordPress. În codul exemplu al plugin-ului, am următorul PHP/HTML:

ob_start();

// alte secțiuni de cod pentru plugin

<?php function plugin_rvce_options_page() { ?>

    <div>

        <form action="options.php" method="post">

            <?php settings_fields('plugin_options'); ?>
            <?php do_settings_sections('plugin'); ?>

            <input name="Submit" type="submit" value="<?php esc_attr_e('Save Changes'); ?>" />

        </form>

    </div>

<?php } ?>

Inițial, acest cod genera avertismentul "Headers already sent" înainte să descopăr ob_start. După implementarea ob_start nu mai primesc avertismentele... dar folosesc corect această funcție doar adăugând ob_start la începutul fișierului plugin-ului meu?

5
Comentarii

de ce ai nevoie să folosești bufferizarea ieșirii?

Milo Milo
11 mai 2016 01:38:37

Am citit că previne afișarea HTML-ului.. Încerc să ocolesc avertismentul "headers already sent" ca să pot scrie HTML direct în fișierul pluginului

cpcdev cpcdev
11 mai 2016 01:40:02

E mai bine să rezolvi eroarea de headere decât să apelezi la bufferizarea ieșirii, dar în orice caz, nu pare că o folosești corect - dacă vrei să bufferizezi ieșirea în acea funcție, ar trebui să începi bufferizarea în interiorul funcției. De asemenea, presupun că termini bufferizarea undeva și faci ceva cu ieșirea.

Tim Malone Tim Malone
11 mai 2016 01:48:24

NICODATĂ nu ascunde erorile, repară-le. Dacă nu o faci, ele se vor întoarce să te muste. Cel care te-a învățat metoda de output buffering pentru a ascunde erorile nu știe nimic despre programare. Este o idee oribilă să faci asta

Pieter Goosen Pieter Goosen
11 mai 2016 13:55:59

Apelul ob_start nu este în interiorul PHP și este trimis direct către browser în codul tău de mai sus

Tom J Nowell Tom J Nowell
11 mai 2016 19:35:50
Toate răspunsurile la întrebare 3
0

Nu, aceasta nu este o utilizare corectă a ob_start(). Primești avertismentul pentru că scriptul tău afișează cod înainte ca antetele paginii să fie trimise - adică afișezi conținut înainte de începutul paginii HTML.

Fără a ști ce se întâmplă în // alt cod al plugin-ului este dificil să spun exact care este problema. Presupun că apelezi plugin_rvce_options_page() undeva în rădăcina fișierului functions.php în loc să o folosești într-o funcție care afișează pe o pagină de administrare. În orice caz, încearcă să rezolvi problema și nu folosi ob_start() ca soluție de rezervă.

11 mai 2016 02:01:09
0

Cu siguranță nu ar trebui să folosești ob_start() pentru a preveni afișarea prematură a codului HTML. Mai degrabă ar trebui să folosești add_action() la începutul plugin-ului pentru a începe afișarea codului în locul potrivit.

Pentru backend hook-ul obișnuit este add_action ('admin_init','your_main_function');

Pentru frontend hook-ul obișnuit este add_action ('wp_head','your_main_function');

Iată o listă cu toate hook-urile disponibile: https://codex.wordpress.org/Plugin_API/Action_Reference

11 mai 2016 19:19:17
0

Ieșirea apare atunci când apelezi funcția plugin_rvce_options_page, nu atunci când o declari. Încearcă asta:

// restul codului pluginului

<?php function plugin_rvce_options_page() {     
ob_start();
?>

<div>

    <form action="options.php" method="post">

        <?php settings_fields('plugin_options'); ?>
        <?php do_settings_sections('plugin'); ?>

        <input name="Submit" type="submit" value="<?php esc_attr_e('Salvează modificările'); ?>" />

    </form>

</div>

<?php  
return ob_get_clean();
 }
 ?>
3 oct. 2019 21:41:29