如果我对您的理解正确,那么您想要一个类似于以下内容的URL,其对浏览器的响应将是您生成的内容,即您的.CSV
文件,而不是WordPress生成的内容?
http://example.com/download/data.csv
我认为您正在寻找机会'template_redirect'
。你可以找到'template_redirect'
在/wp-includes/template-loader.php
这一个文件中的所有WordPress开发应该熟悉; 它简短而有趣,可以路由每个非管理员页面的加载,因此请务必仔细阅读。
只需将以下内容添加到主题functions.php
文件或您所在的另一个文件include
中functions.php
:
add_action('template_redirect','yoursite_template_redirect');
function yoursite_template_redirect() {
if ($_SERVER['REQUEST_URI']=='/downloads/data.csv') {
header("Content-type: application/x-msdownload",true,200);
header("Content-Disposition: attachment; filename=data.csv");
header("Pragma: no-cache");
header("Expires: 0");
echo 'data';
exit();
}
}
注意:为测试'/downloads/data.csv'
通过检查URL $_SERVER['REQUEST_URI']
。还要注意添加,true,200
到您的header()
呼叫中的设置位置Content-type
;这是因为WordPress 无法识别URL,因此将设置404
“未找到”状态代码。这虽然为没有问题的true
通知header()
更换404
的WordPress已经建立并使用HTTP 200
“好”的状态代码,而不是。
这就是FireFox的样子(请注意,屏幕截图没有/downloads/
虚拟目录,因为在获取并注释了屏幕截图之后,添加'/downloads/'
虚拟目录似乎是个好主意):
(来源:mikeschinkel.com)
更新
如果希望从前缀为URL的URL处理下载,/wp-admin/
以使用户直观地知道该文件受登录名的保护,则也可以这样做。一种方法的描述如下。
我封装成一类这个时候,叫DownloadCSV
,并创建了一个用户“能力”叫'download_csv'
的'administrator'
角色(阅读关于角色和功能在这里) 你可以只搭载预定义的关闭'export'
,如果你的角色一样,如果是只搜索和替换'download_csv'
与'export'
并删除该register_activation_hook()
调用和该activate()
函数。顺便说一句,需要激活钩子是我将其移至插件而不是保留主题functions.php
文件的原因之一。*
我还使用了“工具”菜单,并添加了“下载CSV”菜单选项并将其链接到该功能。add_submenu_page()
'download_csv'
最后,我选择了'plugins_loaded'
挂钩,因为它是我可以使用的最早的合适挂钩。您可以使用,'admin_init'
但是该钩子要晚得多运行(第1130个钩子调用与第3个钩子调用),那么为什么要让WordPress做更多的一次性工作呢?(我使用了Instrument Hooks插件来确定使用哪个钩子。)
在钩子中,我/wp-admin/tools.php
通过检查$pagenow
变量来确保URL以开头,current_user_can('download_csv')
然后验证是否通过,然后测试$_GET['download']
是否包含data.csv
;如果是,我们实际上运行与以前相同的代码。我还,true,200
从header()
上一个示例的调用中删除了,因为WordPress知道这是一个很好的URL,因此尚未设置404状态。所以这是您的代码:
<?php
/*
Plugin Name: Download CSV
Author: Mike Schinkel
Author URI: http://mikeschinkel.com
*/
if (!class_exists('DownloadCSV')) {
class DownloadCSV {
static function on_load() {
add_action('plugins_loaded',array(__CLASS__,'plugins_loaded'));
add_action('admin_menu',array(__CLASS__,'admin_menu'));
register_activation_hook(__FILE__,array(__CLASS__,'activate'));
}
static function activate() {
$role = get_role('administrator');
$role->add_cap('download_csv');
}
static function admin_menu() {
add_submenu_page('tools.php', // Parent Menu
'Download CSV', // Page Title
'Download CSV', // Menu Option Label
'download_csv', // Capability
'tools.php?download=data.csv');// Option URL relative to /wp-admin/
}
static function plugins_loaded() {
global $pagenow;
if ($pagenow=='tools.php' &&
current_user_can('download_csv') &&
isset($_GET['download']) &&
$_GET['download']=='data.csv') {
header("Content-type: application/x-msdownload");
header("Content-Disposition: attachment; filename=data.csv");
header("Pragma: no-cache");
header("Expires: 0");
echo 'data';
exit();
}
}
}
DownloadCSV::on_load();
}
这是激活的插件的屏幕截图:(
来源:mikeschinkel.com)
最后是触发下载的屏幕截图:(
来源:mikeschinkel.com)