WordPress

WordPressでcount():phpの警告が出てきた。PHP7.2での仕様変更が原因かも。Warning: count(): Parameter must be an array or an object that implements Countable in 【ファイルパス】/wp-includes/post-template.php on line 284

  • LINEで送る

Warning: count(): Parameter must be an array or an object that implements Countable in 【ファイルパス】/wp-includes/post-template.php on line 284

count()関数に関して、PHP7.2からは警告だすからね。って変更がありました。

こんにちは、鹿屋でwebデザインやEコマース・通販のお手伝いをしているGrowcalのヒガシと申します。

お客様よりwordpressの引っ越し作業のご要望をいただき、対象サイトを確認したところ投稿ページに上記警告が表示されておりました。

私は、こうやって解決しました。

/wp-includes/post-template.php:284行目

Before

if ( $page > count( $pages ) ) // if the requested page doesn't exist
$page = count( $pages ); // give them the highest numbered page that DOES exist

After:is_arrayで配列かどうかチェックして条件分岐

if (is_array($pages)) {
    if ( $page > count( $pages ) ) // if the requested page doesn't exist
    $page = count( $pages ); // give them the highest numbered page that DOES exist
}

原因は、PHP7.2からcount()で警告を出すように変更があった。

PHPにもバージョンというものがあります。wordpressやレンタルサーバーが「PHP7.2だよ早いしオススメだよ。切り替えてみてね」っていうのをみてバージョンアップしたりすると、突如冒頭のような警告が出るようになります。

これは、PHP7.2でcount()関数に関して、下記の様な仕様変更があったからです。

http://php.net/manual/ja/function.count.php

count() will now yield a warning on invalid countable types passed to the array_or_countable parameter.

ざっくり、「count()は、無効な値に対して警告出すようになりました。」とのこと。

これまでのverでは、count(NULL)に対して0を返してたようですが、PHP7.2から警告を出すようになりました。それが、

Warning: count(): Parameter must be an array or an object that implements Countable in 【ファイルパス】/wp-includes/post-template.php on line 284

警告:count() の引数には、配列、もしくはカウントできるオブジェクトじゃないとだめだよ。

【ファイルパス】/wp-includes/post-template.php の 284行目のことだよ。

ってな感じです。

284行目を見てみる。

if ( $page > count( $pages ) ) // if the requested page doesn't exist
 $page = count( $pages ); // give them the highest numbered page that DOES exist

count( $pages ) ありますね。この突如現れる$pagesが配列もしくはカウントできるオブジェクトじゃないから、警告が出るようになったんですね。

つまり、countを使いたいなら、もし、配列もしくはカウントできるオブジェクトだったら284行目が実行するようにすればいいってことです。

配列だったら284行目を実行、nullじゃなかったら実行とかにすれば解決。

今回のwordpressの284-5行目の場合は、NULLではない、emptyではないなら実行すればいいので、

if ( ! empty( $pages ) ) {
284行目
285行目
}
で、良いと思います。もしかしたら最後の行を
} else {
$page = 0;
}

とかしたほうがいいのかな。

まぁ私は冒頭の方法で解決しました。

if (is_array($pages)) {
	if ( $page > count( $pages ) ) // if the requested page doesn't exist
		$page = count( $pages ); // give them the highest numbered page that DOES exist
		}
  • LINEで送る