Using ob_start() in plugin

时间:2016-05-10 作者:cpcdev

我正在学习如何构建WordPress插件。在示例插件代码中,我有以下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 } ?>
最初,这是在我找到ob\\u start之前导致警告“Headers ready sent”。实施ob\\U start后,我没有收到警告。。但是,仅仅在插件文件的顶部添加ob\\u start,我是否正确地使用了它?

3 个回复
SO网友:Steven

不,这不是正确的用法ob_start(). 您收到警告是因为您的脚本在发送页眉之前输出代码,这意味着您在html页面之前打印输出。

不知道你的// other plugin code 很难说到底发生了什么。我猜你在打电话plugin_rvce_options_page() 函数根的某个地方。php文件,而不是在输出到管理页面的函数中。在任何情况下,请尝试解决问题,不要使用ob_start() 作为一种变通方法。

SO网友:Eliut Islas

当您调用函数plugin\\u rvce\\u options\\u页面时,输出发生,而不是在您声明它时。尝试以下操作:

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

SO网友:cjbj

你绝对不应该使用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