ถ้าฉันเข้าใจคุณอย่างถูกต้องคุณต้องการให้URL มีลักษณะดังนี้ต่อไปนี้ซึ่งการตอบสนองต่อเบราว์เซอร์จะเป็นเนื้อหาที่คุณสร้างเช่น.CSV
ไฟล์ของคุณและไม่มีเนื้อหาที่สร้างจาก WordPress?
http://example.com/download/data.csv
ฉันคิดว่าคุณกำลังมองหา'template_redirect'
ตะขอ คุณสามารถค้นหา'template_redirect'
ใน/wp-includes/template-loader.php
ซึ่งเป็นไฟล์เวิร์ดเพรสนักพัฒนาทุกคนควรทำความคุ้นเคยกับ; มันสั้นและหวานและเส้นทางการโหลดทุกหน้าไม่ใช่ผู้ดูแลเพื่อให้แน่ใจว่าได้ดู
เพียงเพิ่มสิ่งต่อไปนี้ในfunctions.php
ไฟล์ธีมของคุณหรือในไฟล์อื่นที่คุณ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 $_SERVER['REQUEST_URI']
โดยการตรวจสอบ นอกจากนี้ยังทราบการเพิ่ม,true,200
การheader()
โทรของคุณที่คุณตั้งContent-type
; นี่เป็นเพราะ WordPress จะได้ตั้งรหัสสถานะ404
"ไม่พบ"เพราะมันไม่รู้จัก URL ไม่มีปัญหาแม้ว่าจะเป็นการtrue
บอกheader()
ให้แทนที่404
WordPress ที่ได้ตั้งค่าไว้และใช้รหัสสถานะHTTP 200
"ตกลง"แทน
และนี่คือสิ่งที่ดูเหมือนใน FireFox ( โปรดทราบว่าภาพหน้าจอไม่มี/downloads/
ไดเรกทอรีเสมือนเพราะหลังจากถ่ายภาพและใส่คำอธิบายประกอบภาพหน้าจอมันก็ดูเหมือนว่าเป็นความคิดที่ดีที่จะเพิ่ม'/downloads/'
ไดเรกทอรีเสมือน):
(ที่มา: mikeschinkel.com )
UPDATE
หากคุณต้องการให้จัดการการดาวน์โหลดจาก URL ที่มีคำนำหน้าด้วย/wp-admin/
เพื่อให้ผู้ใช้เห็นด้วยภาพว่าได้รับการคุ้มครองโดยการเข้าสู่ระบบคุณสามารถทำได้เช่นกัน คำอธิบายของวิธีหนึ่งต่อไปนี้
ฉันโพสต์ลงในชั้นเรียนเวลานี้เรียกว่าDownloadCSV
และเพื่อสร้างผู้ใช้"ความสามารถ"เรียกว่า'download_csv'
สำหรับ'administrator'
บทบาท(อ่านเกี่ยวกับบทบาทและความสามารถที่นี่ ) คุณก็สามารถวิ่งออกจากที่กำหนดไว้ล่วงหน้า'export'
บทบาทหากคุณต้องการและหากดังนั้นเพียงค้นหาและแทนที่'download_csv'
ด้วย'export'
และลบการregister_activation_hook()
โทรและactivate()
ฟังก์ชั่น ความจำเป็นในการขอเปิดใช้งานเป็นเหตุผลหนึ่งที่ทำให้ฉันย้ายสิ่งนี้ไปยังปลั๊กอินแทนที่จะเก็บไว้ในfunctions.php
ไฟล์ของธีม*
ฉันยังเพิ่มตัวเลือกเมนู"ดาวน์โหลด CSV"ออกจากเมนู"เครื่องมือ"โดยใช้add_submenu_page()
และเชื่อมโยงกับ'download_csv'
ความสามารถ
สุดท้ายฉันเลือก'plugins_loaded'
เบ็ดเพราะเป็นตะขอที่เหมาะสมที่สุดที่ฉันสามารถใช้ได้ คุณสามารถใช้งานได้'admin_init'
แต่ตะขอนั้นจะทำงานช้ากว่านั้น (1130th hook call เทียบกับ hook hook ที่ 3) ดังนั้นทำไม WordPress ถึงทำงานได้มากกว่าที่มันต้องการ? (ฉันใช้ปลั๊กอินเครื่องมือตะขอของฉันเพื่อหาว่าจะใช้ตะขอตัวใด)
ในเบ็ดฉันตรวจสอบเพื่อให้แน่ใจว่า URL ของฉันเริ่มต้นด้วย/wp-admin/tools.php
การตรวจสอบ$pagenow
ตัวแปรฉันตรวจสอบว่าcurrent_user_can('download_csv')
และถ้าผ่านแล้วฉันทดสอบ$_GET['download']
เพื่อดูว่ามีdata.csv
; ถ้าใช่เราจะเรียกใช้รหัสเดียวกันตามเดิม ฉันยังลบการ,true,200
เรียกไปยังheader()
ในตัวอย่างก่อนหน้าเพราะที่นี่ WordPress รู้ว่ามันเป็น URL ที่ดีดังนั้นยังไม่ได้ตั้งสถานะ 404 ดังนั้นนี่คือรหัสของคุณ:
<?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();
}
และนี่คือภาพหน้าจอของปลั๊กอินที่เปิดใช้งาน:
(ที่มา: mikeschinkel.com )
และสุดท้ายนี่คือภาพหน้าจอของการกระตุ้นการดาวน์โหลด:
(ที่มา: mikeschinkel.com )