Якщо я правильно вас зрозумів, ви хочете мати 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-й виклик гака проти третього дзвінка), то чому б дозволити 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 )