Если я вас правильно понимаю, вы хотите иметь 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 установит код состояния 404 «Не найдено», потому что он не распознает URL. Это не проблема, поскольку, как trueговорится, header()заменить установленный 404WordPress и использовать вместо этого HTTP- код состояния 200 «Хорошо» .
А вот как это выглядит в FireFox ( обратите внимание, что на скриншоте нет /downloads/виртуального каталога, потому что после создания и добавления аннотации на скриншот это просто хорошая идея добавить '/downloads/'виртуальный каталог):

(источник: mikeschinkel.com )
ОБНОВИТЬ
Если вы хотите, чтобы загрузка осуществлялась с 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, чтобы выяснить, какой хук использовать.)
В хуке, который я проверяю, чтобы убедиться, что мой URL начинается с /wp-admin/tools.phpпроверки $pagenowпеременной, я проверяю это, 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 )