web-dev-qa-db-ja.com

URLリクエストをフックする

ブラウザにインラインで表示させるのではなく、XMLファイルをダウンロード可能にしたいです。

私はContent-Disposition: attachment HTTPヘッダーを使用できることを知っています(もちろん、もっと良い解決策は大歓迎です)。ユーザーがXMLファイルをダウンロードしようとしたときに、すべてのHTTP応答にこのヘッダーを追加します。

私は以下のPHPコードを使うことができます:

header('Content-Disposition: attachment; filename="the_filename.xml"');

問題は次のとおりです。いつこの命令を呼び出すことができますか?どのフックをどのように使うべきですか?

4
User

実際には、私のお勧めは物事を少し違ったやり方にすることでしょう。これらのファイルを特別に処理するためにWordPressにカスタム書き換えエンドポイントを追加することができます。

たとえば、URL http://site.com/download-xml/the_filenameは、指定されたファイルを添付ファイルとして自動的にダウンロードします。

まず、これを設定するためにカスタムの書き換えエンドポイントを追加する必要があります。

function add_endpoint() {
    add_rewrite_endpoint( 'download-xml', EP_ALL );
}
add_action( 'init', 'add_endpoint' );

これは便利なクエリ変数も追加するので、標準のテンプレートリダイレクト中にこのエンドポイントが使用されているかどうかを確認できます。

function download_redirect() {
    global $wp_query;

    // If this isn't the right kind of request, bail.
    if ( ! isset( $wp_query->query_vars['download-xml'] ) || empty( $wp_query->query_vars['download-xml'] ) )
        return;

    // Download the file.

    exit();
}
add_action( 'template_redirect', 'download_redirect' );

上記の機能では、ファイルをダウンロードするために必要なことは何でもできます。 /wp-content/uploadsディレクトリからストリームとしてそれをロードし、ファイルヘッダを設定し(content-dispositionを "attachment"に設定)、データベース内の何かに基づいて動的にコンテンツを生成します。

exit()呼び出しを最後にするようにしてください。そうしないと、WordPressは通常のテンプレートリダイレクト呼び出しを実行しようとし、後で "ヘッダーが既に送信されている"というエラーが発生します。

4
EAMann

プラグインAPI /アクションリファレンス/ヘッダの送信 をご覧ください。

例:

add_action( 'send_headers', 'add_header_xua' );
function add_header_xua() {
     header( 'X-UA-Compatible: IE=Edge,chrome=1' );
}
2
Michael Ecklund

parse_requestアクションフック parse_request が使えると思います

add_action('parse_request', 'handleDownload', 10, 1);
0
Sumit Parkash