如何在管理区域强制下载?

时间:2016-01-15 作者:Alternatex

我正在插件中执行导出功能,但我无法强制直接下载。我得到错误:

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\');
}
Theheaders 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操作方法的东西,只创建一个在单击导出按钮时执行的常规函数?

1 个回复
SO网友:TheDeadMedic

这正是我所想的-您正试图从显示回调发送文件,此时为时已晚。查找add_*_page() 在管理侧栏中注册菜单项的调用-此函数调用的返回值是可用于附加下载函数的挂钩的名称:

$hook = add_submenu_page( $parent, $title, $menu_title, $cap, $menu_slug, $callback );

if ( $hook ) // Will be false if current user does not neccessary permissions
    add_action( "load-$hook", $download_callback );

相关推荐

在将代码添加到函数后无法登录WordPress wp-admin。php

我在函数末尾添加以下代码。php文件,用于根据自定义帖子的帖子标题填充分类法。问题是,当我添加代码时,尝试登录wp admin时会出现以下错误。非常感谢您能帮助我们弄清楚为什么会发生这种情况。Error:错误:由于意外输出,Cookie被阻止。有关帮助,请参阅此文档或尝试支持论坛。Code: <?php function update_custom_terms($post_id) { // only update terms if