Wenn ich Sie richtig verstehe, möchten Sie eine URL wie die folgende haben, deren Antwort auf den Browser der Inhalt ist, den Sie generieren, dh Ihre .CSV
Datei und kein generierter Inhalt von WordPress?
http://example.com/download/data.csv
Ich glaube du suchst den 'template_redirect'
Haken. Sie können finden 'template_redirect'
in /wp-includes/template-loader.php
dem eine Datei alle Wordpress - Entwickler mit vertraut werden sollte; Es ist kurz und bündig und leitet alle Seiten, die nicht von Administratoren geladen werden, weiter.
Fügen Sie einfach die folgende zu Ihrem Thema der functions.php
Datei oder in einer anderen Datei , die Sie 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();
}
}
Notieren Sie den Test für die '/downloads/data.csv'
URL, indem Sie ihn überprüfen $_SERVER['REQUEST_URI']
. Beachten Sie auch das ,true,200
zu Ihrem header()
Anruf hinzugefügte, in dem Sie das Content-type
; Dies liegt daran, dass WordPress den Statuscode 404
"Nicht gefunden" festgelegt hat, da es die URL nicht erkennt. Es ist kein Problem , obwohl , wie das true
sagt header()
die ersetzen 404
Wordpress gesetzt hatte und die Verwendung von HTTP 200
„Okay“ statt Statuscode.
Und so sieht es in FireFox aus ( Beachten Sie, dass der Screenshot kein /downloads/
virtuelles Verzeichnis enthält, da es nach dem Aufnehmen und Kommentieren des Screenshots nur eine gute Idee war, ein '/downloads/'
virtuelles Verzeichnis hinzuzufügen ):
(Quelle: mikeschinkel.com )
AKTUALISIEREN
Wenn Sie möchten, dass der Download über eine URL abgewickelt wird, der ein Präfix vorangestellt ist /wp-admin/
, um dem Benutzer den visuellen Hinweis zu geben, dass er durch eine Anmeldung geschützt ist, können Sie dies auch tun. Es folgt die Beschreibung eines Weges.
Ich habe diesmal eine Klasse eingekapselt, die aufgerufen wird DownloadCSV
, und um eine Benutzer- "Fähigkeit" zu erstellen, die 'download_csv'
für die 'administrator'
Rolle aufgerufen wird (siehe Rollen und Fähigkeiten hier ). Sie können die vordefinierte 'export'
Rolle einfach huckepack nehmen, wenn Sie möchten, und wenn ja, nur suchen und ersetzen 'download_csv'
mit 'export'
und entfernen Sie den register_activation_hook()
Anruf und die activate()
Funktion. Die Notwendigkeit eines Aktivierungs-Hooks ist übrigens ein Grund, warum ich diesen in ein Plugin verschoben habe, anstatt ihn in der functions.php
Datei des Themas zu behalten . *
Ich habe auch eine hinzugefügt „Download CSV“ Menüoption aus dem „Extras“ Menü add_submenu_page()
und verknüpft es auf die 'download_csv'
Fähigkeit.
Schließlich entschied ich mich für den 'plugins_loaded'
Haken, weil er der früheste geeignete Haken war, den ich verwenden konnte. Sie könnten verwenden, 'admin_init'
aber dieser Hook wird viel später ausgeführt (1130. Hook-Aufruf im Vergleich zum 3. Hook-Aufruf). Warum sollte WordPress dann mehr wegwerfen als nötig? (Ich habe mein Instrument Hooks-Plugin verwendet, um herauszufinden, welcher Hook verwendet werden soll.)
In dem Haken, den ich überprüfe, um sicherzustellen, dass meine URL beginnt, /wp-admin/tools.php
indem $pagenow
ich die Variable überprüfe, überprüfe ich das current_user_can('download_csv')
und wenn das bestanden wird, teste ich $_GET['download']
, ob es enthält data.csv
; Wenn ja, führen wir praktisch den gleichen Code wie zuvor aus. Ich entferne auch das ,true,200
aus dem Aufruf von header()
im vorherigen Beispiel, weil hier WordPress weiß, dass es eine gute URL ist, also den 404-Status noch nicht gesetzt hat. Also hier ist dein 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();
}
Und hier ist ein Screenshot des aktivierten Plugins:
(Quelle: mikeschinkel.com )
Und zum Schluss hier noch ein Screenshot zum Auslösen des Downloads:
(Quelle: mikeschinkel.com )