WordPressで「Warning: count(): Parameter must be an array or an object that implements Countable in」というエラーというか警告が出る話です。
PHP7.2.x でのエラー
PHPのバージョンを7.2以上に上げた途端、何かと警告が出てくるようになりました。7.1までは幸せに暮らしていたのに7.2で厳しくなったんでしょうか。対処に追われました。
コメントアウトの場所
PHPコードの狭間にコメントを書いたりしているとアウトになりました。コメントはちゃんと区切りの後や改行箇所で入れてやらないと警告出ます。
囲みは厳密に
囲まなくてもなんとかなっていたような箇所にも、きっちり囲みを入れてやらないと警告が出るようになりました。
'kakomi'
こんな感じですね。
これ、自分ではあまりミスなかったんですが、使ってるプラグインでエラーが結構出まして、ドキドキしながプラグインのPHPを修正しました。
でもまだまだPHP絡みの警告はありました。本題いきます。
post-template.php の問題
どうしても判らない警告はこれでした。
「Warning: count(): Parameter must be an array or an object that implements Countable in
/home/アカウント名/サイト/パス/パス/wp-includes/post-template.php on line 310」
サブループを仕込んだテンプレートを用いた固定ページでこの警告が出ました。
警告されるとき、大抵は wp-content 以下の何かについてです。テンプレートだったりプラグインだったりです。ですがこのエラーは /wp-includes/post-template.php ですから困りました。WordPressの本体みたいなもので迂闊に手を出すのが怖い部分です。
警告文で検索しているといくつか記事がヒットしました。有力そうなのがあったので早速参考にします。
WordPressでphp7.2にした時にWarning: count()が出た場合の治し方(コピペ可)
最初の修正(結果:失敗)
何かバッチリな感じがする賢そうな方の技術情報です。
理由と共に、警告されているpage-template.phpの該当箇所をこう書き換えれば良いと書かれていました。
// If post password required and it doesn't match the cookie. if ( post_password_required( $post ) ) return get_the_password_form( $post ); if ( $page > count( $pages ) ) // if the requested page doesn't exist $page = count( $pages ); // give them the highest numbered page that DOES existそれをこのように変えます。
// If post password required and it doesn't match the cookie. if ( post_password_required( $post ) ) return get_the_password_form( $post ); if ( ! empty( $pages ) ) { if ( $page > count( $pages ) ) // if the requested page doesn't exist $page = count( $pages ); // give them the highest numbered page that DOES exist } else { $page = 0; }
よし真似て修正しよう。と、早速書き換えました。すると、警告どころか完全なエラーとなってDigitalbooは一瞬何も表示されなくなりました。あわてて修正したところを元に戻します。
よくよく見ると、エラーの行番号もコードも微妙に異なっています。
現在、この記事が対象としているWordpressのバージョンは5.2.3で、警告は310行目です。該当箇所はこうなっています。
// If post password required and it doesn't match the cookie. if ( post_password_required( $_post ) ) { return get_the_password_form( $_post ); } if ( $elements['page'] > count( $elements['pages'] ) ) { // if the requested page doesn't exist $elements['page'] = count( $elements['pages'] ); // give them the highest numbered page that DOES exist }
ほとんど同じように見えますがちょっと違いますね。対象にしているWordPressのバージョンが異なっていて、コードも少し違うのです。
そりゃコピペしたら壊れるわという、そういうことです。警告の行が284行目と310行目ではこういう違いがあるので、310行目でエラーが出た人は後先考えずにコピペしてはいけません。
頭を使えば上手に改変して修正できそうなのですが、私はありとあらゆる物事に精通していながら if の { } がどうしても苦手で、{ } を見るだけで逃げ出したくなります。
ですので尻尾を巻いて逃げて、別のもっと楽な手はないのかと探します。
結局楽な手などなかったわけですが、一見ぜんぜん関係なさそうな会話の中に答えを見つけました。
その場しのぎの修正
検索していていヒットしたこの記事、これはWelcartというカートシステムか何かでしょうか、そのフォーラムのようですね。
関係なさそうなので即閉じしようとしましたがふと引っかかるこの一文。
カートページ(テーマディレクトリ/wc_templates/cart/wc_cart_page.php)に以下の記述があれば、この一文を削除してください。
<?php the_content();?>
実際、すぐにページ閉じて他の検索結果を漁っていたんですが、the_contentを削除してくれという不思議な言葉がどうにも引っかかるので試してみたのです。
具体的に警告が出ていたページは、固定ページで「特集シリーズ記事」でした。このページのテンプレートはデフォルトをちょっとカスタムした専用のものですが、普通にこういう記述もあります。
the_contentがないと本文が表示できないですからね。当然あります。
でも該当記事では、本文はほとんど重要ではないので、試しにthe_content()を消してみたんです。
治った
すると警告は消えました。
どうやらWordPressのpage-template.phpでは、cocntentの表示に問題があるようです。
治りましたので、もともと固定ページに書いていた本文をテンプレートのほうに移動させようとしましたが、ここでふと別の方法を試みることを思いつきます。
the_contentをthe_excerptに変えてみる
the_content(); をね、the_excerpt(); に変えてみたんですよ。
そしたらね、
治った
警告が消えて、治りました。
どうやらthe_contentを読み込むことに関してのみ問題があるようです。
この問題の答えはこうなりました。
暫定的な解決方法
サブループなどを使ったテンプレートを固定ページで使うとき、本文を使用しない。
これですね。
本文も含めてテンプレートに記述するか、簡素な本文なら抜粋を使用します。
the_content を使用しないことが大事でした。なかなかこんなこと思いつきませんよね。思いついた人すごいな。
WordPressの5.2.3 と PHP7.2.17
この記事ではWordPressの5.2.3、PHP7.2.17 に関する記事でした。PHP7.3でもいろいろ問題が出ているみたいですね。
WordPressはまだPHP7.2以上に完璧には対応しきれておらず、PHPのバージョンを5.6xに下げるか、警告と適度にお付き合いしながら使い続けるしかない模様です。
私個人的には、PHPのバージョンを5から7に上げて速度の恩恵を感じているので、こうして警告に気づいたらぼちぼち対処するという方向でいいんじゃないかと思っていますが、大事なサイトを運営している人なんかは注意したほうが良さそうです。