Sizi doğru anlarsam, bir URL’ye , tarayıcıya verdiğiniz içerik, yani .CSV
dosyanız ve WordPress’ten oluşturulan içerik yok mu?
http://example.com/download/data.csv
Bence sen aradığın 'template_redirect'
kancayı . Sen bulabilirsiniz 'template_redirect'
içinde /wp-includes/template-loader.php
hangi tüm WordPress geliştiricileri aşina gereken bir dosyadır; kısa ve tatlıdır ve yönetici olmayan her sayfa yükünü yönlendirir, bu yüzden bir göz attığınızdan emin olun.
Aşağıdakileri temanın functions.php
dosyasına veya içinde bulunduğun başka bir dosyaya ekle include
.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();
}
}
'/downloads/data.csv'
URL için yapılan testi inceleyerek not edin $_SERVER['REQUEST_URI']
. Ayrıca eklenen not ,true,200
sizin için header()
belirlediğiniz bir görüşme Content-type
; Bunun nedeni, WordPress’in URL’yi tanımıyor olması nedeniyle 404
“Bulunamadı” durum kodunu ayarlamış olmasıdır . WordPress'in yerini aldığını ve bunun yerine HTTP "Tamam" durum kodunu kullandığını true
söylediği header()
için sorun değil.404
200
Ve işte FireFox'ta böyle görünüyor ( Not bir yok ekran görüntüsü /downloads/
ekran görüntüsü alarak ve annotating sonra sadece bir eklemek iyi bir fikir gibi görünüyordu çünkü sanal dizin '/downloads/'
sanal dizini):
(kaynak: mikeschinkel.com )
GÜNCELLEŞTİRME
Yüklemenin, önceden eklenmiş bir URL’den ele alınmasını istiyorsanız, /wp-admin/
, kullanıcıya bir giriş tarafından korunduğuna dair görsel bir gösterge vermek için önceden istiyorsanız, bunu da yapabilirsiniz; bir yolun açıklaması takip eder.
Ben bir sınıfa bu kez kapsüllü olarak adlandırılan DownloadCSV
ve bir kullanıcının oluşturduğu için "yeteneği" denilen 'download_csv'
için 'administrator'
rolü (konumları ve kabiliyetleri hakkında okuyun burada ) Sadece önceden tanımlanmış kapalı omzunda olabilir 'export'
eğer ve bu yüzden sadece arama ve değiştirme durumunda gibi rolü 'download_csv'
ile 'export'
ve register_activation_hook()
çağrıyı ve activate()
işlevi kaldırın . Bu arada, bir etkinleştirme kancaya duyulan ihtiyaç, temanın functions.php
dosyasında saklamak yerine bunu bir eklentiye taşımamın bir nedeni . *
Ayrıca kullanarak "Araçlar" menüsünden " CSV İndir" menü seçeneğini ekledim.add_submenu_page()
ve 'download_csv'
kabiliyetle ilişkilendirdim.
Son olarak 'plugins_loaded'
kancayı seçtim çünkü kullanabileceğim en eski kancaydı. Kullanabilirsiniz, 'admin_init'
ancak bu kanca çok daha sonra çalıştırılır (3. kanca çağrısı - 3. kanca çağrısı), neden WordPress'in gerekenden daha fazla atma çalışması yapmasına izin verdiniz? ( Hangi kancanın kullanılacağını bulmak için Alet Kancaları eklentisini kullandım.)
URL /wp-admin/tools.php
adresimin, $pagenow
değişkeni inceleyerek başladığından emin olmak için kontrol ettiğimde , bunu doğrularım current_user_can('download_csv')
ve geçerse o $_GET['download']
zaman içerip içermediğini görmek için test ederim data.csv
; eğer evet ise pratikte eskisi gibi aynı kodu kullanıyoruz. Ayrıca , önceki örnekte ,true,200
yapılan çağrıdan çağrıyı kaldırdım header()
çünkü burada WordPress bunun iyi bir URL olduğunu biliyor, bu yüzden henüz 404 durumunu ayarlamadı. İşte kodunuz:
<?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();
}
Ve işte aktive edilmiş eklentinin ekran görüntüsü:
(kaynak: mikeschinkel.com )
Ve sonunda burada indirmeyi tetikleyen bir ekran görüntüsü:
(kaynak: mikeschinkel.com )