Если я вас правильно понимаю, вы хотите иметь 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()
заменить установленный 404
WordPress и использовать вместо этого 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 )