Usando ob_start() en un plugin

11 may 2016, 01:28:35
Vistas: 21.2K
Votos: 3

Estoy aprendiendo a crear un plugin para WordPress. En el código de ejemplo del plugin, tengo este PHP/HTML:

ob_start();

// otro código 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('Guardar Cambios'); ?>" />

        </form>

    </div>

<?php } ?>

Inicialmente, esto estaba causando la advertencia "Headers already sent" antes de que encontrara ob_start. Después de implementar ob_start ya no recibo las advertencias... pero ¿lo estoy usando correctamente al simplemente añadir ob_start en la parte superior de mi archivo del plugin?

5
Comentarios

¿por qué necesitas usar el almacenamiento en búfer de salida?

Milo Milo
11 may 2016 01:38:37

Leí que evita que el HTML se muestre... Estoy tratando de evitar la advertencia de "encabezados ya enviados" para poder escribir HTML dentro del archivo del plugin mismo

cpcdev cpcdev
11 may 2016 01:40:02

Es mejor solucionar el error de encabezados en lugar de recurrir al almacenamiento en búfer, pero de cualquier manera, parece que no lo estás usando correctamente. Si deseas almacenar en búfer la salida en esa función, deberías comenzar el almacenamiento dentro de la función. Además, supongo que estás terminando el almacenamiento en algún lugar y haciendo algo con la salida.

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

NUNCA JAMÁS ocultes los errores, corrígelos. Si no lo haces, volverán para morderte. Quien te enseñó la forma de buffering de salida para ocultar errores no sabe nada de programación. Es una idea horrible hacer eso.

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

La llamada ob_start no está dentro de PHP y se está enviando directamente al navegador en tu código anterior

Tom J Nowell Tom J Nowell
11 may 2016 19:35:50
Todas las respuestas a la pregunta 3
0

No, este no es un uso correcto para ob_start(). Estás recibiendo la advertencia porque tu script está enviando código antes de que se envíen los encabezados de la página, lo que significa que estás imprimiendo salida antes de la página HTML.

Sin saber qué está pasando en tu // otro código del plugin es difícil decir exactamente qué está ocurriendo. Supongo que estás llamando a plugin_rvce_options_page() en algún lugar de la raíz del archivo functions.php en lugar de dentro de una función que envía salida a una página de administración. En cualquier caso, intenta solucionar el problema y no uses ob_start() como solución temporal.

11 may 2016 02:01:09
0

Definitivamente no deberías usar ob_start() para evitar la salida prematura de HTML. En su lugar, deberías usar add_action() al principio del plugin para comenzar a mostrar tu código en el lugar correcto.

Para el backend, el hook habitual es add_action ('admin_init','tu_funcion_principal');

Para el frontend, el hook habitual es add_action ('wp_head','tu_funcion_principal');

Aquí hay una lista de todos los hooks disponibles: https://codex.wordpress.org/Plugin_API/Action_Reference

11 may 2016 19:19:17
0

La salida ocurre cuando llamas a la función plugin_rvce_options_page, no cuando la declaras. Prueba esto:

// otro código 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('Guardar Cambios'); ?>" />

    </form>

</div>

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