Jeśli dobrze cię rozumiem, chcesz mieć adres URL podobny do następującego, którego odpowiedzią dla przeglądarki będzie treść, którą generujesz, tj. .CSV
Plik i żadna treść generowana z WordPress?
http://example.com/download/data.csv
Myślę, że szukasz 'template_redirect'
haka. Można znaleźć 'template_redirect'
w /wp-includes/template-loader.php
którym jest plik wszyscy deweloperzy WordPress powinien zapoznać się z; jest krótki i słodki i kieruje każdą ładowaniem stron innych niż administrator, więc koniecznie spójrz na to.
Po prostu dodaj następujące elementy do functions.php
pliku motywu lub w innym pliku, include
w którym się znajdujesz 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();
}
}
Zanotuj test '/downloads/data.csv'
adresu URL, sprawdzając $_SERVER['REQUEST_URI']
. Zwróć także uwagę na dodane ,true,200
do header()
połączenia, gdzie ustawiłeś Content-type
; dzieje się tak, ponieważ WordPress ustawi kod statusu 404
„Nie znaleziono”, ponieważ nie rozpoznaje adresu URL. Nie stanowi to jednak problemu, ponieważ true
nakazuje header()
zastąpienie 404
WordPressa ustawieniem i użycie zamiast tego kodu stanu HTTP 200
„OK” .
A oto, jak to wygląda w FireFox ( zwróć uwagę, że zrzut ekranu nie ma /downloads/
katalogu wirtualnego, ponieważ po zrobieniu zrzutu ekranu i opatrzeniu go adnotacją po prostu wydawało się dobrym pomysłem dodanie '/downloads/'
katalogu wirtualnego):
(źródło: mikeschinkel.com )
AKTUALIZACJA
Jeśli chcesz, aby pobieranie odbywało się na podstawie adresu URL z prefiksem, /wp-admin/
aby dać użytkownikowi wizualne wskazanie, że jest chroniony przez login, możesz to również zrobić; opis jednego ze sposobów jest następujący.
I obudowane w klasie, tym razem o nazwie DownloadCSV
, a także tworzone przez użytkownika „zdolności” o nazwie 'download_csv'
dla 'administrator'
roli (czytaj o roli i kompetencji tutaj ) Możesz po prostu na barana off predefiniowanej 'export'
roli, jeśli lubisz, a jeśli tak, wystarczy wyszukać i zamienić 'download_csv'
z 'export'
i usuń register_activation_hook()
połączenie oraz activate()
funkcję. Nawiasem mówiąc, potrzeba haka aktywacyjnego jest jednym z powodów, dla których przeniosłem go do wtyczki zamiast przechowywać w functions.php
pliku motywu . *
Dodałem także opcję menu „Pobierz CSV” z menu „Narzędzia”, używając add_submenu_page()
i powiązałem ją z 'download_csv'
funkcją.
Wreszcie wybrałem 'plugins_loaded'
hak, ponieważ był to najwcześniejszy odpowiedni hak, którego mogłem użyć. Możesz użyć, 'admin_init'
ale ten hak jest uruchamiany znacznie później (1130. połączenie hakowe vs. 3. połączenie hakowe), więc po co pozwolić WordPressowi wykonywać więcej zadań wyrzucania, niż to konieczne? (Użyłem wtyczki Instrument Hooks, aby dowiedzieć się, którego haka użyć).
W haka I sprawdzić, moje starty URL z /wp-admin/tools.php
sprawdzając $pagenow
zmiennej I zweryfikować, current_user_can('download_csv')
a jeśli to przechodzi następnie przetestować $_GET['download']
, aby sprawdzić, czy zawiera on data.csv
; jeśli tak, uruchamiamy praktycznie ten sam kod jak poprzednio. Usuwam również ,true,200
wezwanie do header()
w poprzednim przykładzie, ponieważ tutaj WordPress wie, że to dobry adres URL, więc nie ustawiłem jeszcze statusu 404. Oto twój kod:
<?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();
}
A oto zrzut ekranu aktywowanej wtyczki:
(źródło: mikeschinkel.com )
I wreszcie zrzut ekranu z pobieraniem:
(źródło: mikeschinkel.com )