bbPress

bbPress の画像を添付するプラグイン bb-attachmentsを使ってみる

ダウンロード

以下よりダウンロード。

bbPress Attachments « bbPress Plugin Browser

bbPress は、この記事作成時点で 1.0.3 が最新だが、まだダッシュボード画面からプラグインを検索してダウンロードするような形にはなっていない。
そのため、昔ながらの方法で、プラグインをダウンロード、解凍して、bbPress のmy-plugins フォルダーに配置する。

image

設定

設定もダッシュボードからするのでは無く、手作業でファイルをいじっていく。

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 がエラーになるようです。

PHP: set_time_limit - Manual

ですので、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 関数を実行するかどうか決めるようになります。

-bbPress

Copyright© エンジニアの何でもメモ帳 , 2021 All Rights Reserved.