web-dev-qa-db-ja.com

W3総キャッシュ、RackSpaceクラウドファイル、および強制ダウンロード

私はW3 Total CacheのRac​​kSpace CloudFilesへのCDN接続を使用して数百のメディアファイルを提供しています。私の目標は、ファイルをストリーミングではなくユーザーのブラウザでダウンロードできるようにすることです。 CloudFilesドキュメント(http://docs.rackspacecloud.com/files/api/v1/cf-devguide-20111115.pdf)によると、Content Dispositionヘッダーを設定できます。

W3 Total Cacheを介してこれを行うことができる方法を誰かが知っていますか。あるいは、CDN経由で提供されているファイルを強制的にダウンロードする方法をもう1つ知っていますか。

4
Jonathan Wold

これはカスタムフィルタを追加することで簡単な作業に分割できます。

Cloudfiles_http.phpの1283行目のCF_Httpクラス内の_send_requestメソッドに以下を追加する必要があります。

$headers = $this->_make_headers($hdrs);
//Add this line below
$headers = apply_filters('cloudfiles_headers', $headers, $url_path, $method);

これにより、W3TCを大幅に編集するのではなく、プラグインからヘッダーにアクセスできます。

あなたのプラグインの中で、あなたはこのような関数を作成することができます:

add_filter('cloudfiles_headers', 'wpse_42273_cloudfiles_headers', 0, 3);
function wpse_42273_cloudfiles_headers($headers, $url_path, $method){
    if($method != 'GET')
         return $headers;
    if(preg_match_all('~^.*/(.+\.(jpg|jpeg|png|gif|pdf|doc|docx|csv))$~i', $url_path, $matches)){
        $filename = $matches[1][0];
        $headers[] = "Content-Disposition: attachment; filename=$filename";
    }
    return $headers;
}

W3TCが上記の正規表現にリストされているファイル拡張子を持つオブジェクトを取得している場合、これはダウンロードを強制するために適切なヘッダを追加します。これは、ブラウザでどのファイルを提供するか、およびどのファイルをダウンロードする必要があるかを制御するための良い方法です。

あなたは私があなたの便宜のために作成したプラグインでこれを試すことができます。これには少し調整が必要かもしれませんが、これが私があなたがこの問題に取り組むべきだと私が感じる方法です。

こちらからプラグインをダウンロードしてください。 http://3-3.me/K4SL

最後の注意として、これは明らかにW3TCプラグインのコアを編集しています(ただ1行のコードで)。これはベストプラクティスではありませんが、それはあなたのために働くでしょう。つまり、アップグレードすると変更が上書きされます。 WordPressがプラグインを更新しようとしないように、プラグインの名前を変更する(システムにforkを作成する)のが賢明かもしれません。

これがあなたを助けてくれることを願っています!

6
Brian Fegter