I'm learning how to build a WordPress plugin. In the sample plugin code, I have this PHP/HTML:
ob_start();
// other plugin code
<?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 } ?>
Initially, this was causing the warning "Headers already sent" before I found ob_start. After implementing ob_start I don't get the warnings.. but am I using it correctly by just adding ob_start at the top of my plugin file?
I'm learning how to build a WordPress plugin. In the sample plugin code, I have this PHP/HTML:
ob_start();
// other plugin code
<?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 } ?>
Initially, this was causing the warning "Headers already sent" before I found ob_start. After implementing ob_start I don't get the warnings.. but am I using it correctly by just adding ob_start at the top of my plugin file?
Share Improve this question asked May 10, 2016 at 22:28 cpcdevcpcdev 3972 gold badges4 silver badges19 bronze badges 5 |3 Answers
Reset to default 2No, this is not a correct use for ob_start()
. You're getting the warning because your script is outputting code before the page headers are sent - meaning you're printing output before the html page.
Without knowing what's going on in your // other plugin code
it's difficult to say what's happening exactly. I would guess you're calling plugin_rvce_options_page()
somewhere in the root of the functions.php file instead of in a function that outputs to an admin page. In any case, try and fix the issue and don't use ob_start()
as a work-around.
You definitely shouldn't be using ob_start()
to prevent premature outputting of html. Rather you should use add_action()
at the top of the plugin to start outputting your code in the right place.
For backend the usual hook is add_action ('admin_init','your_main_function');
For frontend the usual hook is add_action ('wp_head','your_main_function');
Here's a list of all available hooks: https://codex.wordpress/Plugin_API/Action_Reference
The output is happening when you call the function plugin_rvce_options_page, not when you declare it. Try this:
// other plugin code
<?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('Save Changes'); ?>" />
</form>
</div>
<?php
return ob_get_clean();
}
?>
发布者:admin,转转请注明出处:http://www.yc00.com/questions/1745109074a4611737.html
ob_start
call isn't inside PHP and it's being sent directly to the browser in your above code – Tom J Nowell ♦ Commented May 11, 2016 at 16:35