Sizi doğru anlarsam, bir URL’ye , tarayıcıya verdiğiniz içerik, yani .CSVdosyanı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.phphangi 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.phpdosyası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,200sizin 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ı truesöylediği header()için sorun değil.404200
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 DownloadCSVve 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.phpdosyası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.phpadresimin, $pagenowdeğ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,200yapı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 )