ダウンロード
以下よりダウンロード。
bbPress Attachments « bbPress Plugin Browser
bbPress は、この記事作成時点で 1.0.3 が最新だが、まだダッシュボード画面からプラグインを検索してダウンロードするような形にはなっていない。
そのため、昔ながらの方法で、プラグインをダウンロード、解凍して、bbPress のmy-plugins フォルダーに配置する。
設定
設定もダッシュボードからするのでは無く、手作業でファイルをいじっていく。
Readme.txt を読むと、bbPress 0.9.0.2 より前のバージョンと、それ以降のバージョンで作業が違っている。
bbPress 0.9.0.2 より前は、自分で bb-attachments というファイルをアップロードするためのディレクトリを作る必用があったが、bbPress 0.9.0.2 以降では違う手順が必用なようだ。
が、動かない・・・
フォーラムに最新版がある
このプラグイン自体は、年号自体が古くなっている事からもわかるように現在、正式にはアップデートされていない。作者さんも Donate が少ない。。とぼやいていらっしゃる。。
使い込んでみてよかったら Donate しよう。。。
一方でフォーラムでは、細々とサポートしてくれていて、以下から最新版が個別ファイルとしてダウンロードできる。こちらは動いた。
http://plugins-svn.bbpress.org/bb-attachments/trunk/
現行バージョンが正式に今後の bbPress に対応していくかどうかは、結構難しそうなので或程度はこのプラグインを自分で使えるようにカスタマイズできるようにならないといけなさそうだ。
bb-attachments というフォルダーを作って、そこにダウンロードしたファイルを置き、ダッシュボードから有効化する。
既に旧バージョンをダウンロードしている場合は、そこのフォルダーに上書きでもOK。
旧バージョンと違って、イメージを置くフォルダーを手動で作成しなくてもよい。
どこを探してもアップロードした画像ファイルが見つからないので、どうやらDBに書き込んでいるように見える。
アップロードしたファイルが壊れて開けなくなる
画像のアップロードはできるが、画像が表示されない事があった。
調べて見ると画像ファイルが壊れていたのが原因だった。
アップロード中に PHP のエラーが起きて、そのエラーメッセージが画像ファイル中に埋め込まれていた。青字の部分が画像データでは無い部分。
<br />
<b>Warning</b>: set_time_limit() [<a href='function.set-time-limit'>function.set-time-limit</a>]: Cannot set time limit in safe mode in <b>/home/users/bbpress/my-plugins/bb-attachments/bb-attachments-init.php</b> on line <b>495</b><br />
リ・JFIF ,, ロ C
ソースの情報がエラーに入っているので、そこを当たってみると、set-time-limit(0) 「PHP のタイムアウト値を0(無し)にする」というPHPの関数が失敗しているようだ。ファイルの読み込み時に実行しているので、ファイルのデータとこの関数のエラーメッセージが混ざっている。
これは PHP の設定で、PHP が、”safe_mode ON” に設定されていると、set-time-limit がエラーになるようです。
ですので、safe mode を OFF にして上げる必用があります。通常は、php.ini を編集する必用がありますが、ロリ・ポップはユーザーに直接編集を許しておらず、GUI から設定するようになっていました。
以下のガイドに従えば、簡単にセーフモードをOFFにできます。
ロリポップで PHP セーフモードを OFF にする方法 | さあ WordPress をはじめよう
セーフ・モードを OFF にしない (PHP.ini の設定を変えない) アプローチ
セーフモード自体は、PHP6では削除される機能のようです。ですので、OFF にしてしまっても良い感じもするのですが、コード上でセーフモードが設定されているかどうかで判別する方法もあります。
この書き方は、既に紹介した、set_time_limit のマニュアルのサンプルコードの中にありました。
bb-attachments では、bb-attachments-init.php の中で以下のように set_time_limit を使っています。(使われている箇所は、全部で3カ所ありました。)
$fp = @fopen($fullpath,"rb");
set_time_limit(0);
fpassthru($fp); // avoids file touch bug with readfile
これを以下のように変更します。
$fp = @fopen($fullpath,"rb");
if( !ini_get('safe_mode') ){
set_time_limit(0);
}
fpassthru($fp); // avoids file touch bug with readfile
これで、safe_mode が設定されているかどうか判別して set_time_limit 関数を実行するかどうか決めるようになります。