如何正确地做一个WordPress插件返回一个可下载的Excel文件

我正在尝试为我的wordpress插件做一些报告。 这个报告必须以excel的forms下载。 基本上我所做的是创build一个button,当按下button时,我将查询数据库,并从结果中获得一个excel。

现在我需要修改头文件以excel文件的forms返回结果。 这是我做到的:

header('Content-Disposition: attachment; filename='.$filename.'.xls'); header('Content-type: application/force-download'); header('Content-Transfer-Encoding: binary'); header('Pragma: public'); print "\xEF\xBB\xBF"; // UTF-8 BOM 

问题是它返回以下错误:

 Warning: Cannot modify header information - headers already sent by (output started at .....\wp-admin\menu-header.php:137) 

我可能需要ob_start(),但不是ob_start()必须放在第一个标题(这是从WordPress的核心文件)之前。 如果可能,我不想修改核心文件。

或者也许WordPress的'自己的钩'send_headers'? 但我不能得到它的工作,它仍然产生相同的错误。

那么我需要解决这个问题呢? 是否有另一种方式来刷新wordpress插件的excel文件?

任何帮助感激!

由于header()已经在menu-header.php中发送,所以你发送的报头太晚了。 从提供的代码我不能看到你在哪个点发送标题,但是一个好的地方将在plugins_loaded行动,因为当所有的插件已经被加载,并且在任何输出被发送之前,该动作挂钩被调用。

下载链接可能如下所示:

 <a href="<?php echo admin_url( '?download' ); ?>">download</a> 

而且,plugins_loaded行动:

 add_action( 'plugins_loaded', function() { if ( isset( $_GET['download'] ) ) { // here you can create .xls file header('Content-Disposition: attachment; filename='.$filename.'.xls'); header('Content-type: application/force-download'); header('Content-Transfer-Encoding: binary'); header('Pragma: public'); die(); } });