Utilizzo di ob_start() nel plugin

11 mag 2016, 01:28:35
Visualizzazioni: 21.2K
Voti: 3

Sto imparando a creare un plugin WordPress. Nel codice di esempio del plugin, ho questo PHP/HTML:

ob_start();

// altro codice del 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('Salva Modifiche'); ?>" />

        </form>

    </div>

<?php } ?>

Inizialmente, questo causava l'avviso "Headers already sent" prima che scoprissi ob_start(). Dopo aver implementato ob_start() non ricevo più gli avvisi... ma lo sto usando correttamente semplicemente aggiungendo ob_start() all'inizio del mio file plugin?

5
Commenti

perché hai bisogno di usare l'output buffering?

Milo Milo
11 mag 2016 01:38:37

ho letto che previene l'output dell'HTML.. sto cercando di bypassare il warning "headers already sent" per poter scrivere HTML direttamente nel file del plugin

cpcdev cpcdev
11 mag 2016 01:40:02

È meglio risolvere l'errore degli header piuttosto che ricorrere all'output buffering, ma in ogni caso, non sembra che tu lo stia usando correttamente - se vuoi bufferare l'output in quella funzione, dovresti avviare il buffering all'interno della funzione. Inoltre, presumo che tu stia terminando il buffering da qualche parte e facendo qualcosa con l'output.

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

MAI E POI MAI nascondere gli errori, correggili. Se non lo fai, torneranno a perseguitarti. Chi ti ha insegnato il metodo del buffering dell'output per nascondere gli errori non sa nulla di programmazione. È un'idea terribile fare così

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

La chiamata ob_start non è all'interno del PHP e viene inviata direttamente al browser nel tuo codice sopra

Tom J Nowell Tom J Nowell
11 mag 2016 19:35:50
Tutte le risposte alla domanda 3
0

No, questo non è un utilizzo corretto di ob_start(). Stai ricevendo l'avviso perché il tuo script sta inviando output prima degli header della pagina - significa che stai stampando output prima della pagina HTML.

Senza sapere cosa succede nel tuo // other plugin code è difficile dire esattamente cosa stia accadendo. Immagino che tu stia chiamando plugin_rvce_options_page() da qualche parte nella radice del file functions.php invece che all'interno di una funzione che invia output a una pagina di amministrazione. In ogni caso, cerca di risolvere il problema e non usare ob_start() come soluzione temporanea.

11 mag 2016 02:01:09
0

Non dovresti assolutamente usare ob_start() per prevenire l'output prematuro dell'html. Piuttosto dovresti usare add_action() all'inizio del plugin per iniziare a generare il tuo codice nel punto giusto.

Per il backend il solito hook è add_action ('admin_init','your_main_function');

Per il frontend il solito hook è add_action ('wp_head','your_main_function');

Ecco una lista di tutti gli hook disponibili: https://codex.wordpress.org/Plugin_API/Action_Reference

11 mag 2016 19:19:17
0

L'output viene generato quando chiami la funzione plugin_rvce_options_page, non quando la dichiari. Prova questo:

// altro codice del plugin

<?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('Salva modifiche'); ?>" />

    </form>

</div>

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