Использование ob_start() в плагине
Я изучаю как создавать плагин WordPress. В примере кода плагина у меня есть следующий PHP/HTML:
ob_start();
// другой код плагина
<?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 } ?>
Изначально это вызывало предупреждение "Headers already sent" до того, как я нашел ob_start. После применения ob_start предупреждения исчезли... но правильно ли я использую его, просто добавив ob_start в начало файла плагина?

Нет, это неправильное использование ob_start()
. Вы получаете предупреждение потому, что ваш скрипт выводит код до отправки заголовков страницы - то есть выводит содержимое до HTML-страницы.
Не зная, что происходит в вашем // other plugin code
, сложно сказать точно, в чем проблема. Скорее всего, вы вызываете plugin_rvce_options_page()
где-то в корне файла functions.php, а не внутри функции, которая выводит данные на страницу админки. В любом случае, попробуйте исправить проблему и не используйте ob_start()
как обходное решение.

Определенно не стоит использовать ob_start()
для предотвращения преждевременного вывода HTML. Вместо этого следует использовать add_action()
в начале плагина, чтобы начать вывод кода в правильном месте.
Для бэкенда обычно используют хук: add_action ('admin_init','your_main_function');
Для фронтенда обычно используют хук: add_action ('wp_head','your_main_function');
Вот список всех доступных хуков: https://codex.wordpress.org/Plugin_API/Action_Reference

Вывод происходит при вызове функции plugin_rvce_options_page, а не при её объявлении. Попробуйте так:
// другой код плагина
<?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('Сохранить изменения'); ?>" />
</form>
</div>
<?php
return ob_get_clean();
}
?>
