Использование ob_start() в плагине

11 мая 2016 г., 01:28:35
Просмотры: 21.2K
Голосов: 3

Я изучаю как создавать плагин 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 в начало файла плагина?

5
Комментарии

зачем нужно использовать буферизацию вывода?

Milo Milo
11 мая 2016 г. 01:38:37

Я читал, что это предотвращает вывод HTML.. Я пытаюсь обойти предупреждение "headers already sent", чтобы иметь возможность писать HTML прямо внутри файла плагина

cpcdev cpcdev
11 мая 2016 г. 01:40:02

Лучше решить проблему с заголовками, чем прибегать к буферизации вывода, но в любом случае, похоже, вы используете её неправильно - если вы хотите буферизовать вывод в этой функции, вам следует начать буферизацию внутри функции. Также я предполагаю, что вы где-то завершаете буферизацию и делаете что-то с полученным выводом.

Tim Malone Tim Malone
11 мая 2016 г. 01:48:24

НИКОГДА не скрывайте ошибки, исправляйте их. Если вы этого не сделаете, они вернутся, чтобы укусить вас. Тот, кто научил вас использовать буферизацию вывода для скрытия ошибок, ничего не понимает в программировании. Это ужасная идея — поступать таким образом.

Pieter Goosen Pieter Goosen
11 мая 2016 г. 13:55:59

Вызов ob_start не находится внутри PHP и отправляется напрямую в браузер в вашем коде выше

Tom J Nowell Tom J Nowell
11 мая 2016 г. 19:35:50
Все ответы на вопрос 3
0

Нет, это неправильное использование ob_start(). Вы получаете предупреждение потому, что ваш скрипт выводит код до отправки заголовков страницы - то есть выводит содержимое до HTML-страницы.

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

11 мая 2016 г. 02:01:09
0

Определенно не стоит использовать 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

11 мая 2016 г. 19:19:17
0

Вывод происходит при вызове функции 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();
 }
 ?>
3 окт. 2019 г. 21:41:29