Usando ob_start() en un plugin
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?

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.

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

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