我正在插件中执行导出功能,但我无法强制直接下载。我得到错误:
Cannot modify header information - headers already sent
显然,在我的函数启动之前的某个时刻,WordPress已经开始在响应的主体中打印,所以当我的函数到达时,我无法更改标题。有没有什么方法可以绕过这个问题,添加我的标题,这样我就可以强制直接下载?
我已尝试在上注销所有脚本admin_init
当在URL中找到“直接下载”字样时,显然WordPress打印到响应正文中的不仅仅是脚本。
在管理部分是否有实现直接下载的标准方法?
我正在开发的插件具有MVC格式。我的导出按钮只是一个简单的链接(<a>
) 这就引出了我的行动方法:
public function exportRecordsToExcelAction()
{
// Get parameters
// Get columns
// Get records
// Excel stuff
header(\'Content-type: application/vnd.ms-excel\');
header(\'Content-Disposition: attachment; filename="Records.xlsx"\');
$objWriter->save(\'php://output\');
}
The
headers already sent
错误请参阅第958行
wp-includes/script-loader.php
. 这就是WordPress开始打印到响应正文并结束我更改标题的能力的地方。这并不是唯一一个这样做的地方,显然,试图绕过这个功能一点帮助都没有。
我正在使用的令人烦恼的抽象架构如下所示。
文件夹结构:
pluginFolder
setup
admin_actions.php
add_submenu_page() hooks
app
module
Admin
controllers
AccountController.php
我们如何在
AccountController.php
:
当我在插件页面中执行任何URL时pluginFolder
首先执行一个解析请求URL的函数,并从中确定控制器名称和操作方法。一旦它们被解析,我们就在一个变量中有了方法名$method
以及名为$controller
. 然后使用工厂方法实例化控制器对象,如下所示:$controller = self::getController($controller);
. 因为现在它有了正确的控制器对象,并且知道了动作方法的名称,所以它只执行以下操作:$controller->$method();
然后执行action方法(我在第一个代码中的函数)。
目前,我看不出更改这些内容对我有多大帮助,因为所有这些都是在发送邮件头之后执行的。也许强制下载的唯一方法就是这次跳过这个MVC操作方法的东西,只创建一个在单击导出按钮时执行的常规函数?