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 )
'template_redirect'
läuft definitiv auf dem Server. Wenn nicht, würde ich total verwirrt sein; Können Sie die Besorgnis klären? Danke im Voraus./downloads/data.csv
, was eine nicht vorhandene Datei ist, so dass das WordPress- "Front-End" diese Anfrage bearbeitet und schließlich erreichttemplate-redirect
. Sie erstellen einfach einen Link im Admin-Bereich, der auf diese Frontside-URL verweist. (Es muss gesagt werden, dass Sie auf diese Weise den Anmeldeschutz für Administratoren nicht kostenlos erhalten - jeder, der die URL kennt, kann die Datei herunterladen, aber vielleicht gibt es einen einfachen Weg, dies zu beheben?)current_user_can()
mit dem obigen Code verwenden oder einen anderen Ansatz wählen. Nach diesem Kommentar werde ich meiner Antwort ein Update hinzufügen.ein weiteres nützliches Plugin für den Export in CSV. kann für jemanden nützlich sein
quelle
admin_init Hook oder load- (page) Hook scheint zu funktionieren, WordPress wurde in diesem Status nicht als Header gesetzt. Ich verwende load- (page) Hook, weil es ausgeführt wird, wenn eine Administrationsmenüseite geladen wird. Sie können Ihr Skript für eine bestimmte Seite laden.
Sie können den Lade- (Seiten-) Haken in WordPress Codex überprüfen
Wenn Sie mit admin_init Haken stellen Sie sicher, nonce überprüfen mit check_admin_referer oder andere Skript vielleicht die Bedingung passieren Ausgabe der Download - Datei.
quelle