Si je vous comprends bien, vous voulez avoir une URL quelque chose comme la suivante dont la réponse au navigateur sera le contenu que vous générez, c'est-à-dire votre .CSV
fichier et aucun contenu généré à partir de WordPress?
http://example.com/download/data.csv
Je pense que vous cherchez le 'template_redirect'
crochet. Vous pouvez trouver 'template_redirect'
dans /wp-includes/template-loader.php
quel fichier tous les développeurs WordPress devraient se familiariser; il est court et doux et achemine chaque chargement de page non administrateur, alors assurez-vous d'y jeter un œil.
Il suffit d' ajouter ce qui suit à votre thème functions.php
de fichier ou dans un autre fichier que vous include
en 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();
}
}
Notez le test de l' '/downloads/data.csv'
URL en inspectant $_SERVER['REQUEST_URI']
. Notez également l'ajout ,true,200
à votre header()
appel où vous définissez le Content-type
; cela est dû au fait que WordPress aura défini le code d'état 404
"Introuvable" car il ne reconnaît pas l'URL. Ce n'est pas un problème cependant car le true
dit header()
de remplacer 404
WordPress avait été défini et d'utiliser le code d'état HTTP 200
"Okay" à la place.
Et voici à quoi cela ressemble dans FireFox ( Notez que la capture d'écran n'a pas /downloads/
de répertoire virtuel car après avoir pris et annoté la capture d'écran, il semblait juste une bonne idée d'ajouter un '/downloads/'
répertoire virtuel):

(source: mikeschinkel.com )
MISE À JOUR
Si vous souhaitez que le téléchargement soit géré à partir d'une URL préfixée /wp-admin/
pour donner à l'utilisateur l'indication visuelle qu'il est protégé par une connexion, vous pouvez également le faire; la description d'une façon suit.
J'encapsulées dans une classe cette fois -ci , appelé DownloadCSV
, et créé un utilisateur « capacité » appelé 'download_csv'
pour le 'administrator'
rôle (lu sur les rôles et capacités ici ) Vous pouvez tout simplement ferroutage hors du prédéfini 'export'
rôle si vous aimez et si oui vous suffit de rechercher et remplacer 'download_csv'
par 'export'
et supprimez l' register_activation_hook()
appel et la activate()
fonction. Soit dit en passant, la nécessité d'un crochet d'activation est l'une des raisons pour lesquelles je l'ai déplacé vers un plugin au lieu de le conserver dans le functions.php
fichier du thème . *
J'ai également ajouté une option de menu "Télécharger CSV" dans le menu "Outils" en l' utilisant add_submenu_page()
et je l'ai liée à la 'download_csv'
capacité.
Enfin, j'ai choisi le 'plugins_loaded'
crochet parce que c'était le premier crochet approprié que je pouvais utiliser. Vous pouvez l'utiliser, 'admin_init'
mais ce hook est exécuté beaucoup plus tard (1130e appel hook contre le 3e appel hook), alors pourquoi laisser WordPress faire plus de travail de mise au rebut qu'il n'en a besoin? (J'ai utilisé mon plugin Instrument Hooks pour savoir quel crochet utiliser.)
Dans le crochet, je vérifie que mon URL commence /wp-admin/tools.php
par inspecter la $pagenow
variable, je vérifie cela current_user_can('download_csv')
et si cela passe, je teste $_GET['download']
pour voir si elle contient data.csv
; si oui, nous exécutons pratiquement le même code qu'avant. J'ai également supprimé le ,true,200
de l'appel à header()
dans l'exemple précédent, car ici WordPress sait que c'est une bonne URL, donc n'a pas encore défini le statut 404. Voici donc votre code:
<?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();
}
Et voici une capture d'écran du plugin activé:
(source: mikeschinkel.com )
Et enfin, voici une capture d'écran du déclenchement du téléchargement:
(source: mikeschinkel.com )