先日、数独のソースコードをダウンロードできるようにしたが、せっかくなのでダウンロード数をカウントできるプラグインを導入してみた。実現可能なプラグインはいくつかあるようだったが、その中で便利そうに思えた下記のプラグインを採用させてもらった。

bovendeur.org:『Download Counter for Wordpress』

導入・設定

上記URLを辿ったページに「Downloading」という項があり、文中の「here」からダウンロードできる。最初、「here」にリンクが張られていることに気づかなくて、しばらく探してしまった。

ダウンロードしたファイルを解凍すると、「wp-downloadcounter」というフォルダが作られるので、フォルダごと「wp-content/plugins」ディレクトリにアップロードし、管理画面から有効にすればひとまず導入は完了となる。

導入完了後、管理画面から「管理」→「Downloads」と辿ると、下記のような画面が表示されるので、初期設定を行う。
DownloadCounter
「Use pretty links」のチェックを外し、「Save changes」ボタンで保存する。
「Use pretty links」の詳細については後述する「きれいなURLを使う」の項を参照してもらいたい。チェックするとURLの生成方法が変わるのだが、若干手間が必要になる。まずは、プラグインの動作を簡単に確認しておきたいのでチェックを外しておく。

最後に、ファイルをアップロードするディレクトリを用意する。既にそういった用途のディレクトリがある場合はそのまま使用していいし、新たにお好みのディレクトリを作成してもいい。私は「files」というディレクトリにいろいろなファイルをアップロードしているので、そこを使用することにした。

ダウンロード数をカウントさせてみる

ダウンロードさせるファイルを上記で作成した(作成されていた)ディレクトリにアップロードする。
アップロード完了後、管理画面から「管理」→「Downloads」を辿り、「Add Download」ボタンを押してファイルの登録画面に移動する。
DownloadCounterのファイル登録
「Name」には任意の名前を、「URL」にはアップロードしたファイルのURLを入力し、「Save」ボタンで保存する。

画面下に登録したファイルの情報が表示され、ダウンロード数などが参照できるようになっている。
「With counter」に張られたリンクからダウンロードするとダウンロード数がカウントされ、「Without counter」に張られたリンクではプラグインを通さないためカウントされない。よって、前者のURLを使用すれば良い。

きれいなURLを使う(Use pretty links)

通常、「http://(サイトのURL)/?download=sudoku」といったURLが生成されるが、見るからにCGI経由なので見栄えが良くない(と考える人がいるかもしれない)。そこで、「Use pretty links」と「Download slug」を使用する。

管理画面の英文を訳すと大体下記のようになる。

Use pretty links

ここをチェックすると、ダウンロードスラッグ(以下のDownload slugのこと)を使用したURLが生成されます。チェックしなかった場合、「/?download=<名称>」のようなURLが生成されます。

Download slug

この値を変更した場合、新しいダウンロードスラッグを反映させるために管理画面の「パーマリンク設定」からパーマリンク構造を更新する必要があります。あなたがパーマリンク構造を更新するまで、訪問者は「404 NOT FOUND」ページを受け取ることになります。

「Use pretty links」をチェックし、「Download slug」に任意のスラッグを入力する。ダウンロードスラッグは既存カテゴリーのスラッグと被らない方が無難だろう。ここでは「download」とする。

設定を保存すると、登録したファイルの「With counter」のURLが変更される。

http://spring.sakurasaita.net/?download=sudoku

http://spring.sakurasaita.net/download/sudoku

プラグインで生成されるURLがダウンロードスラッグを使用したものに置き換わるだけということに注意しなければいけない。そのままでは、このURLにアクセスしても404 NOT FOUNDとなり、使用できない。解説に従えばパーマリンク構造を変更するらしいのだが、単にパーマリンク構造を変更しただけでダウンロードできるとも思えない。そこで、「.htaccess」ファイルを編集することにした。(もし、本来はその他の手順で行うべきなのだとしたら、ぜひお教えいただきたい)

「.htaccess」ファイルを作成し、下記のように編集する。

<IfModule mod_rewrite.c>
    # 置換を有効にする
    RewriteEngine On
    # URL先頭から置換を開始する
    RewriteBase /
    # 先頭が「/download/」で始まる場合のみ置換する
    RewriteCond %{REQUEST_URI} ^/download/
    # 「download/文字列」を「?download=文字列」に置換する
    RewriteRule ^download/(.+) ?download=$1 [L]
</IfModule>

これでdownload以下へのアクセスは「?download=<名称>」にリダイレクトされるため、正常にアクセス出来るようになる。
もし、パーマリンク構造を変更していて、既に「.htaccess」ファイルが存在する場合は下記のように赤字を追記すれば良い。

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_URI} ^/download/
    RewriteRule ^download/(.+) ?download=$1 [L]
    # DownloadCounterで使用するURLは置換対象から除く
    RewriteCond %{REQUEST_URI} !^/download/
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
</IfModule>

これで、エントリーへのリクエストとダウンロードへのリクエストの両方を扱えるようになる。

動作確認時の注意点

「Use pretty links」の確認を行う場合、一度ブラウザのキャッシュをクリアした方がいい。
いろいろなパターンの設定を試していた時、正常にダウンロードできるはずなのにダウンロードできない、ダウンロードできないはずなのに正常にダウンロードできるといったことがあったからだ。念のため、ブラウザのリクエストヘッダを確認してみたところ、期待しない動作の場合はそもそもリクエストヘッダが送信されていなかった。そこでキャッシュをクリアしたところ、期待通りの動作を行うようになった。

まとめ

以上でDownloadCounterの設定は完了となる。
個人的には、「Use pretty links」は使用しないで「?download=<名称>」とする方がダウンロードされるんだなということがはっきりするので好みかもしれない。

ファイルがダウンロードされたということは、少なくともエントリーに興味をもってくれた人がいたということになるので、単にアクセス数が伸びるよりもうれしい。今後もDonwloadCounterを活用させてもらおうと思う。

.htaccessの説明

上記で作成した「.htaccess」ファイルだが、Apacheにあまり馴染みの無い方は内容を把握しきれないかもしれない。把握していない設定を使用するのも気持ち悪いと思うので、簡単に説明しようと思う。本項はDownloadCounterの設定には直接関係ないので読み飛ばしても何ら問題無い。

<IfModule mod_rewrite.c>
    ~
</IfModule>

これは「mod_rewrite」モジュールがロードされている場合のみ、タグに囲われたディレクティブを読み込ませるために記述する。実際の置換には関わらない部分であり、保険のために記述する。

RewriteEngine On

置換エンジンを有効にする。もし、置換をやめたい場合、「On」→「Off」とすれば、せっかく書いた置換ルールを削除しないで置換をやめることができる。

RewriteBase /

URLのどの部分から置換を開始するのかを指定する。
RewriteBaseディレクティブを省略すると、ローカルのファイルパスが使用されてしまう。「/index.php」がローカルのパスでは「/var/www/html/index.php」となっている場合、後者が使用されることになる。これは大抵期待外れなので、常にきっちりと指定した方が良い。

RewriteCond %{REQUEST_URI} ^/download/

RewriteCondディレクティブは置換対象の条件を指定する。
%{REQUEST_URI}は、リクエストヘッダのリソース部分を扱える。リクエストヘッダが「GET /perl/28.html HTTP/1.1」だとすると、「/perl/28.html」となる。
上記例ではリソースの先頭が「/download/」で始まるURLを置換対象としてくれ、という意味になる。

RewriteRule ^download/(.+) ?download=$1 [L]

RewriteRuleディレクティブは、RewriteCondディレクティブの条件に合致したURLを実際に置換する。
URLの先頭「download/(何かの文字列)」を「?donwload=(何かの文字列)」に置換している。「$1」とは、置換元文字列の括弧で囲まれた部分を使用するよという意味になる。括弧が複数個ある場合は、「$1」「$2」「$3」と数字を増やしていけばいい。
末尾に記載されている「[L]」はLastのことで、このRewriteRuleディレクティブで置換されたURLは置換を終了するという意味だ。これ以降にもRewriteRuleディレクティブが指定されている場合に期待しない置換が行われることを防いでくれる。

RewriteCond %{REQUEST_URI} !^/download/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

1行目は、リソースの先頭が「/download/」で始まらないURLを置換対象としてくれ、という意味になる。記述しなくても、問題ないので単なる保険だ。

2~3行目で使用されている%{REQUEST_FILENAME}はファイルのローカルパスを扱える。「/index.php」がローカルのパスでは「var/www/html/index.php」となっている場合、後者が使用される。「-f」「-d」という記述は、「ファイルだったら置換対象」「ディレクトリだったら置換対象」の意味だ。しかし、先頭に「!」が付いているため真偽が逆になり、「ファイルでなかったら」「ディレクトリでなかったら」となる。
つまり、2~3行目はローカルのパスでチェックして、ファイルでもディレクトリでもない(要は存在しない)ファイルへのリクエストだったら置換対象としてくれ、という意味になる。

4行目は、リソースをindex.phpに置換している。パーマリンク構造の細かな解析はindex.php内で行われているのだろう。末尾の「[L]」は、先の説明と同様となる。

もっと細かく知りたい場合は下記のリンクを参照して欲しい。
Apache module mod_rewrite

トラックバック / RSS
投稿

Copyright 2008 As You Like It All rights reserved.
Powered by Wordpress, Base template by WEB MAGIC, Photo by Encyclorecorder