Jika saya memahami Anda dengan benar, Anda ingin memiliki URL, seperti berikut ini yang tanggapannya terhadap browser adalah konten yang Anda hasilkan, yaitu .CSV
file Anda dan tidak ada konten yang dihasilkan dari WordPress?
http://example.com/download/data.csv
Saya pikir Anda sedang mencari 'template_redirect'
kail. Anda dapat menemukan 'template_redirect'
di /wp-includes/template-loader.php
mana merupakan file yang harus akrab dengan semua pengembang WordPress; itu pendek dan manis dan merutekan setiap memuat halaman non-admin jadi pastikan untuk melihatnya.
Cukup tambahkan berikut ini ke functions.php
file tema Anda atau file lain yang Anda include
masuki 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();
}
}
Catat tes untuk '/downloads/data.csv'
URL dengan memeriksa $_SERVER['REQUEST_URI']
. Perhatikan juga ditambahkan ,true,200
ke header()
panggilan Anda di mana Anda mengatur Content-type
; ini karena WordPress akan menetapkan kode status 404
"Tidak Ditemukan" karena tidak mengenali URL. Ini tidak masalah karena true
memberitahu header()
untuk mengganti 404
WordPress telah ditetapkan dan menggunakan kode status HTTP 200
"Oke" sebagai gantinya.
Dan inilah tampilannya di FireFox ( Perhatikan tangkapan layar tidak memiliki /downloads/
direktori virtual karena setelah mengambil dan mencatat tangkapan layar itu sepertinya merupakan ide bagus untuk menambahkan '/downloads/'
direktori virtual):
(sumber: mikeschinkel.com )
MEMPERBARUI
Jika Anda ingin unduhan ditangani dari URL yang diawali dengan /wp-admin/
memberikan indikasi visual kepada pengguna bahwa itu dilindungi oleh login Anda dapat melakukannya juga; uraian satu cara berikut.
Aku dikemas ke dalam kelas saat ini, yang disebut DownloadCSV
, dan untuk membuat pengguna "kemampuan" yang disebut 'download_csv'
untuk 'administrator'
peran (membaca tentang Peran dan Kemampuan di sini ) Anda hanya bisa dukung-dukungan off dari yang telah ditetapkan 'export'
peran jika Anda suka dan jika demikian hanya mencari & mengganti 'download_csv'
dengan 'export'
dan hapus register_activation_hook()
panggilan dan activate()
fungsinya. Ngomong-ngomong, kebutuhan akan kait aktivasi adalah salah satu alasan mengapa saya memindahkan ini ke sebuah plugin daripada menyimpannya di file tema functions.php
. *
Saya juga menambahkan opsi menu "Unduh CSV" dari menu "Alat" menggunakan add_submenu_page()
dan menautkannya ke 'download_csv'
kemampuan.
Terakhir saya memilih 'plugins_loaded'
kail karena itu adalah kail paling awal yang bisa saya gunakan. Anda bisa menggunakan 'admin_init'
tetapi kait itu dijalankan lebih lambat (panggilan hook ke-1130 vs panggilan ke-3) jadi mengapa membiarkan WordPress melakukan lebih banyak pekerjaan membuang-buang daripada yang seharusnya? (Saya menggunakan plugin Instrument Hooks saya untuk mencari tahu hook mana yang akan digunakan.)
Dalam kait saya memeriksa untuk memastikan URL saya mulai dengan /wp-admin/tools.php
memeriksa $pagenow
variabel, saya memverifikasi itu current_user_can('download_csv')
dan jika itu lewat maka saya menguji $_GET['download']
untuk melihat apakah itu berisi data.csv
; jika ya kita menjalankan kode yang sama seperti sebelumnya. Saya juga menghapus ,true,200
dari panggilan ke header()
dalam contoh sebelumnya karena di sini WordPress tahu itu adalah URL yang baik sehingga belum menetapkan status 404. Jadi, inilah kode Anda:
<?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();
}
Dan inilah screenshot dari plugin yang diaktifkan:
(sumber: mikeschinkel.com )
Dan akhirnya inilah tangkapan layar memicu unduhan:
(sumber: mikeschinkel.com )