私があなたを正しく理解しているなら、あなたはブラウザへの応答があなたが生成するコンテンツ、つまりあなたの.CSV
ファイルであり、WordPressから生成されたコンテンツではない次のようなURLを持ちたいですか?
http://example.com/download/data.csv
'template_redirect'
フックを探していると思います。あなたは見つけることができます'template_redirect'
に/wp-includes/template-loader.php
すべてのWordPressの開発者が精通になるべきファイルです。短くて甘く、管理者以外のページの読み込みをすべてルーティングするので、必ず見てください。
ちょうどあなたのテーマのに以下を追加し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
れていることに注意してください。これは、WordPressがURLを認識しないため、「Not Found」ステータスコードを設定するためです。ただし、WordPressの設定を置き換え、HTTPの「OK」ステータスコードを代わりに使用するように指示されているため、問題はありません。header()
Content-type
404
true
header()
404
200
FireFoxでの表示は次のとおりです(スクリーンショットに仮想ディレクトリが含まれていないことに注意してください。スクリーンショット/downloads/
を作成して注釈を付けた後、'/downloads/'
仮想ディレクトリを追加することをお勧めします)。
(ソース:mikeschinkel.com)
更新
/wp-admin/
ログインによって保護されていることをユーザーに視覚的に示すために接頭辞が付いたURLからダウンロードを処理する場合は、同様に行うことができます。1つの方法の説明が続きます。
私はと呼ばれる、クラスにこの時間をカプセル化DownloadCSV
し、作成したユーザーに「機能」と呼ばれる'download_csv'
ために'administrator'
役割(役割と機能について読んこちら) あなただけの定義済みのオフ背負う可能性があり'export'
、単に検索と置換あなたのようなので、もしあれば役割'download_csv'
を呼び出しと関数'export'
を削除しregister_activation_hook()
ますactivate()
。ところで、アクティベーションフックの必要性は、テーマのfunctions.php
ファイルを保持するのではなく、これをプラグインに移動した理由の1つです。*
私はまた、追加、「ダウンロードCSV」オフメニューオプションを「ツール」使用してメニューadd_submenu_page()
とそれをリンク'download_csv'
機能。
最後に、'plugins_loaded'
私が使用できる最も早い適切なフックであるため、フックを選択しました。使用できます'admin_init'
が、そのフックはかなり後で実行されます(1130回目のフック呼び出しと3回目のフック呼び出し)。(使用するフックを特定するために、Instrument Hooksプラグインを使用しました。)
フックで私は私の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)