WordPress で PHPキャッシュ(APCu等)を有効化するプラグイン「WP-FFPC」ですが、PHP 8.0 ではエラーがでてサイトが止まってしまいます。PHP 7.4 では動きます。PHP の APCu モジュールは、さくらインターネットのレンタルサーバー等、APCu モジュールが使える PHPで有効化するとサイトのパフォーマンスがかなり上がる無くてはならないものです。それが PHP 8.0になるとサイトが止まってしまうのは大問題です。
そこで WP-FFPC 1.11.2 (2021年3月5日時点)を修正して問題を解決してみました!その備忘録をまとめておきます。
PHP 8.0.0 上で、WP-FFPCをインストールすると・・・
有効化するまえに、下記のエラーでサイトが止まります。
これらを参考にソースコードをチェックした結果、下記の赤文字の部分の問題があることがわかりました。どのような問題かは後述します。
wp-ffpc-class.php
1016-1018行目
public function plugin_options_migrate( &$options ) {
if ( version_compare ( $options['version'], $this->plugin_version, '<' ) ) {
問題を解決する方法
この 1017行目に
if($options === false) $options = array('version' => '0.0');
を追加することで本問題を回避できます。
実際には、下記の青のコードを追加するということです。
public function plugin_options_migrate( &$options ) {
if($options === false) $options = array('version' => '0.0');
if ( version_compare ( $options['version'], $this->plugin_version, '<' ) ) {
原因の説明
これはプログラムのバグです。
wp-ffpc-abstract.php
514行目から
public static function _get_option ( $optionID, $network = false ) {
if ( $network ) {
static::debug ( sprintf( __( '- getting network option %s', 'PluginUtils' ), $optionID ) );
$options = get_site_option( $optionID );
}
else {
static::debug( sprintf( __( ' – getting option %s', 'PluginUtils' ), $optionID ));
$options = get_option( $optionID );
}
return $options;
}
において、 戻り値の $options は、false (bool値), 配列等いくつかのパターンがあり、最初にインストールするときに、WP-FFPCの設定が WordPressで利用するデータベースに存在しないことから、$options の値が false (bool値)となります。
そうすると、下記の $options['version'] が存在しないことになり (falseとなる)、version_compare の第1引数が false になります。しかし、version_compare は引数に string を期待しているため、型の不一致が起こります。PHP 8.0からはそうした場合にはエラーになるということです。
wp-ffpc-class.php
1016-1018行目
public function plugin_options_migrate( &$options ) {
if ( version_compare ( $options['version'], $this->plugin_version, '<' ) ) {
このバージョンチェックは、WP-FFPCプラグインのバージョンが、インストール前のバージョンよりも新しければというチェックをしています。つまりプラグインが更新したときの処理でしょう。そのため、初期値を 0.0 にすることで、最初にインストールしたときには、必ずこのチェックが真になるように、下記のように比較前にコードを追加してあげればよいです。
if($options === false) $options = array('version' => '0.0');
これでエラー無く動くので、あとは一度でも WP-FFPCの設定を保存すれば、以後は $options が false になることはないはずです。
開発者の GitHUBに ISSUEとしてあげておきました。
さらに WordPress.org のプラグインサポートのほうにも投稿
修正されることを祈っておきます!
付録A) APCu キャッシュを有効にできる他のプラグイン等について
なかなか思うようなプラグインには出会えず。
- Power Cacheプラグイン: https://ja.wordpress.org/plugins/powered-cache/
- ドロップインに追加されるが、エラーがでてしまっている。wp-content/object-cache.php → wp-content/plugins/object-cache.php へシンボリックリンクを張れば動く。
- APC Object Cache Backendプラグイン:https://wordpress.org/plugins/apc/
付録B) Deprecated: contextual_help の使用はバージョン 3.3.0 から非推奨になっています ! への対応
作成:2021年3月8日
Deprecated: contextual_help の使用はバージョン 3.3.0 から非推奨になっています ! 代わりに get_current_screen()->add_help_tab(), get_current_screen()->remove_help_tab() を使ってください。 in /****/wp-includes/functions.php on line 5234
これは、wp-admin/ 以下の管理画面の上部にヘルプタブに追加する機能のようです。
が使い方が書かれていますが、結構修正は大変のように見えます。
これなくても機能としては問題ないため
wp-ffpc-class.php
add_filter('contextual_help', array( &$this, 'plugin_admin_nginx_help' ), 10, 2);
を
// add_filter('contextual_help', array( &$this, 'plugin_admin_nginx_help' ), 10, 2);
wp-ffpc-abstract.php
add_filter('contextual_help', array( &$this, 'plugin_admin_help' ), 10, 2);
を
// add_filter('contextual_help', array( &$this, 'plugin_admin_help' ), 10, 2);
とコメントして無効化しておけば、とりあえず問題なさそうですね。
2021年3月5日 @kimipooh
2021年3月8日 付録2) を追記