Nếu tôi hiểu bạn một cách chính xác, bạn muốn có một URL giống như sau đây mà phản hồi của bạn đối với trình duyệt sẽ là nội dung bạn tạo, tức là .CSV
tệp của bạn và không có nội dung được tạo từ WordPress?
http://example.com/download/data.csv
Tôi nghĩ rằng bạn đang tìm kiếm 'template_redirect'
hook. Bạn có thể tìm thấy 'template_redirect'
trong /wp-includes/template-loader.php
đó một tệp mà tất cả các nhà phát triển WordPress nên làm quen với; nó ngắn và ngọt ngào và định tuyến cho mỗi lần tải trang không phải của quản trị viên, vì vậy hãy chắc chắn xem qua nó.
Chỉ cần thêm phần sau vào functions.php
tệp của chủ đề của bạn hoặc trong tệp khác mà bạn include
tham gia 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();
}
}
Lưu ý kiểm tra '/downloads/data.csv'
URL bằng cách kiểm tra $_SERVER['REQUEST_URI']
. Cũng lưu ý thêm vào cuộc gọi ,true,200
của bạn header()
, nơi bạn đặt Content-type
; điều này là do WordPress sẽ đặt mã trạng thái 404
"Không tìm thấy" vì nó không nhận ra URL. Mặc dù vậy, không có vấn đề gì khi true
nói header()
thay thế 404
WordPress đã đặt và sử dụng mã trạng thái 200
"Okay" HTTP thay thế.
Và đây là giao diện của FireFox ( Lưu ý ảnh chụp màn hình không có /downloads/
thư mục ảo vì sau khi chụp và chú thích ảnh chụp màn hình, có vẻ như đó là một ý tưởng hay để thêm '/downloads/'
thư mục ảo):
(nguồn: mikechinkel.com )
CẬP NHẬT
Nếu bạn muốn tải xuống được xử lý từ một URL có tiền tố /wp-admin/
để cung cấp cho người dùng dấu hiệu trực quan rằng nó được bảo vệ bởi thông tin đăng nhập, bạn cũng có thể làm điều đó; mô tả về một cách sau.
Lần này tôi đã gói gọn vào một lớp, được gọi DownloadCSV
và để tạo ra "khả năng" của người dùng được gọi 'download_csv'
cho 'administrator'
vai trò (đọc về Vai trò và Khả năng ở đây ) Bạn có thể cõng 'export'
vai trò được xác định trước nếu muốn và nếu vậy chỉ cần tìm kiếm & thay thế 'download_csv'
bằng 'export'
và loại bỏ register_activation_hook()
cuộc gọi và activate()
chức năng. Nhân tiện, nhu cầu về móc kích hoạt là một lý do khiến tôi chuyển cái này sang plugin thay vì giữ trong functions.php
tệp của chủ đề . *
Tôi cũng đã thêm tùy chọn menu "Tải xuống CSV" khỏi menu "Công cụ" bằng cách sử dụng add_submenu_page()
và liên kết nó với 'download_csv'
khả năng.
Cuối cùng tôi đã chọn 'plugins_loaded'
móc vì đó là móc thích hợp sớm nhất tôi có thể sử dụng. Bạn có thể sử dụng 'admin_init'
nhưng hook đó được chạy muộn hơn nhiều (cuộc gọi hook thứ 1130 so với cuộc gọi hook thứ 3) vậy tại sao lại để WordPress thực hiện nhiều công việc vứt bỏ hơn mức cần thiết? (Tôi đã sử dụng plugin Cụ móc của mình để tìm ra cách sử dụng móc nào.)
Trong hook tôi kiểm tra để đảm bảo URL của tôi bắt đầu bằng /wp-admin/tools.php
cách kiểm tra $pagenow
biến, tôi xác minh điều đó current_user_can('download_csv')
và nếu điều đó vượt qua thì tôi sẽ kiểm tra $_GET['download']
xem nó có chứa hay không data.csv
; nếu có, chúng tôi thực tế chạy mã giống như trước đây. Tôi cũng xóa ,true,200
từ cuộc gọi đến header()
trong ví dụ trước vì ở đây WordPress biết đó là một URL tốt nên chưa đặt trạng thái 404. Vì vậy, đây là mã của bạn:
<?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();
}
Và đây là một ảnh chụp màn hình của plugin được kích hoạt:
(nguồn: mikechinkel.com )
Và cuối cùng đây là một ảnh chụp màn hình kích hoạt tải xuống:
(nguồn: mikechinkel.com )