올바르게 이해하면 브라우저에 대한 응답이 생성하는 컨텐츠, 즉 파일이며 WordPress에서 생성 된 컨텐츠가 아닌 다음과 같은 URL 을 원 .CSV하십니까?
http://example.com/download/data.csv
나는 당신이 'template_redirect'갈고리를 찾고 있다고 생각합니다 . 모든 WordPress 개발자가 익숙해 져야 할 파일이 어느 파일 '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가 URL을 인식하지 못하기 때문에 404 "찾을 수 없음" 상태 코드를 설정했기 때문입니다. WordPress 를 대체 하고 HTTP "Okay" 상태 코드를 대신 사용하라는 true지시 header()에 따라 문제는 없습니다 .404200
그리고 여기가 파이어 폭스에서의 모습입니다 ( 참고 이없는 화면을 /downloads/스크린 샷을 복용하고 주석 후 그냥 추가하는 것이 생각처럼 보였다 때문에 가상 디렉터리를 '/downloads/'가상 디렉토리) :

(출처 : mikeschinkel.com )
최신 정보
접두사가 붙은 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'있지만 그 후크는 훨씬 나중에 실행됩니다 (1130 번째 후크 호출 대 3 번째 후크 호출) 왜 WordPress가 필요한 것보다 더 많은 일을 처리해야합니까? (내 장비 후크 플러그인 을 사용하여 사용할 후크를 파악했습니다.)
후크 /wp-admin/tools.php에서 $pagenow변수 를 검사하여 URL로 시작 하는지 확인하고 current_user_can('download_csv'), 확인 하면 해당 URL이 $_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();
}
다음은 활성화 된 플러그인의 스크린 샷입니다.
(source : mikeschinkel.com )
그리고 마지막으로 다운로드를 시작한 스크린 샷입니다 :
(source : mikeschinkel.com )