ワードプレスやプラグイン、そしてベースとなるPHPのバージョンアップでエラーが出ることがあります。この「WordPress Ping Optimizerについては、当サイトでもPing送信のプラグインとしてご紹介してきましたが、PHPのバージョンアップにより、「Parameter must be an array or an object・・」という警告エラーをWEB画面に表示するようになります。
そもそも「Parameter must be an array or an object」とは
そもそも「Parameter must be an array or an object・・」とは、 パラメータは、配列またはCountableを実装するオブジェクトでなければなりません.という意味であり、要は「きちんとした配列になってないといけません」というエラーになっています。
エラーの場所
wordpress-ping-optimizer/cbnet-ping-optimizer.php が該当のPHPコードになります。
エラー警告メッセージを見るとわかるのですが、このPHPソースコードの530行目あたりにある
$pingCount=count($this->cbnetpo_future_pings);
という部分がエラーになっています。
つまり、この部分
count($this->cbnetpo_future_pings)
こいつがエラーの現況となっているわけです、
PHP7.2以降では、count関数は配列の要素数を調べる関数ですが、配列でないとエラーになります。
WordPressその他の対応を見てみると
1 2 3 4 5 6 7 8 9 |
if ( is_array( $this->posts ) ) { $this->found_posts = count( $this->posts ); } else { if ( null === $this->posts ) { $this->found_posts = 0; } else { $this->found_posts = 1; } } |
このように、配列かどうかを確認してから、変数の設定を行っています。つまり、count() に渡す前に is_array() で配列かどうか判定しています。配列でないときは、 null なら 0 、それ以外では 1 にする…という、count() の挙動が if 文で再現された格好になっているわけです。
では、PingOptimaizerではどうするか?
上記同様に考えると、PingOptimaizerでも、配列かどうかの判断をして、その後各種の判断を行う形に書き換える必要があります。
ちなみに、そのままの段階で、var_dumpでpingCountの値を表示すると「1」になります。
ですので、上記を参考にし、しかも、もともとあったNullチェックも活かすためのコードは下記になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
/** * Checks if time elasped for future post, and if so, removes post form the ping list and pings * For wordpress versions below 2.4 */ function cbnetpoFuturePing() { global $wpdb; $pingCount=0; // handle null before count /* if (is_null($this->cbnetpo_future_pings)) $pingCount=0; else $pingCount=count($this->cbnetpo_future_pings); */ if ( is_array( $this->cbnetpo_future_pings ) ) { $pingCount=count($this->cbnetpo_future_pings); } else { if ( null === $this->cbnetpo_future_pings ) { $pingCount=0; } else { $pingCount=1; } } // future ping list is empty |
上記は、前後もわかるようにエラー部分やコメントをそのままにしてあります。
おおもとのプラグインが修正されるまでの一時的な措置かもしれませんが、他のプラグインや、テーマでも起きうる話なので、参考になればと思い記載いたしました。