Se ti capisco correttamente vuoi avere un URL simile al seguente la cui risposta al browser sarà il contenuto che generi, cioè il tuo .CSV
file e nessun contenuto generato da WordPress?
http://example.com/download/data.csv
Penso che tu stia cercando il 'template_redirect'
gancio. Puoi trovare 'template_redirect'
in /wp-includes/template-loader.php
quale file è necessario familiarizzare con tutti gli sviluppatori di WordPress; è breve e dolce e indirizza tutti i caricamenti di pagine non amministrative, quindi assicurati di dare un'occhiata.
Basta aggiungere la seguente al tema del vostro functions.php
file o in un altro file che si include
in 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();
}
}
Nota il test per l' '/downloads/data.csv'
URL controllando $_SERVER['REQUEST_URI']
. Nota anche l'aggiunta ,true,200
alla header()
chiamata in cui hai impostato il Content-type
; questo perché WordPress avrà impostato il codice di stato 404
"Non trovato" perché non riconosce l'URL. Non è un problema anche se, come la true
racconta header()
per sostituire il 404
WordPress era tramontato e di utilizzare il HTTP 200
"Okay" codice di stato, invece.
Ed ecco come appare in FireFox ( nota che lo screenshot non ha una /downloads/
directory virtuale perché dopo aver preso e annotato lo screenshot sembrava una buona idea aggiungere una '/downloads/'
directory virtuale):
(fonte: mikeschinkel.com )
AGGIORNARE
Se vuoi che il download sia gestito da un URL con prefisso /wp-admin/
per dare all'utente l'indicazione visiva che è protetto da un login puoi farlo anche tu; segue la descrizione di un modo.
Questa volta ho incapsulato in una classe, chiamato DownloadCSV
, e per creare una "capacità" dell'utente richiesta 'download_csv'
per il 'administrator'
ruolo (leggi Ruoli e Funzionalità qui ) Potresti semplicemente abbandonare il 'export'
ruolo predefinito se ti piace e in tal caso basta cercare e sostituire 'download_csv'
con 'export'
e rimuovere la register_activation_hook()
chiamata e la activate()
funzione. A proposito, la necessità di un hook di attivazione è uno dei motivi per cui ho spostato questo in un plug-in anziché tenerlo nel functions.php
file del tema . *
Ho anche aggiunto un'opzione di menu "Scarica CSV" dal menu "Strumenti" usando add_submenu_page()
e collegato alla 'download_csv'
funzionalità.
Alla fine ho scelto l' 'plugins_loaded'
uncino perché era il primo gancio appropriato che potevo usare. Potresti usare 'admin_init'
ma quell'hook viene eseguito molto più tardi (1130a chiamata hook rispetto alla 3a chiamata hook) quindi perché lasciare che WordPress faccia più lavoro da buttare di quanto sia necessario? (Ho usato il mio plugin Instrument Hooks per capire quale hook usare.)
Nel gancio controllo per accertarmi che il mio URL inizi con l' /wp-admin/tools.php
ispezione della $pagenow
variabile, lo verifico current_user_can('download_csv')
e se ciò passa quindi test $_GET['download']
per vedere se contiene data.csv
; se sì, eseguiamo praticamente lo stesso codice di prima. Rimuovo anche il ,true,200
dalla chiamata a header()
nell'esempio precedente perché qui WordPress sa che è un buon URL, quindi non ho ancora impostato lo stato 404. Quindi ecco il tuo codice:
<?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();
}
Ed ecco uno screenshot del plugin attivato:
(fonte: mikeschinkel.com )
E finalmente ecco uno screenshot per innescare il download:
(fonte: mikeschinkel.com )