All in One SEOを再インストールしたらphpでWarningが出て困り果てた話

約5分

皆さんはWordpressにどの様なプラグインを入れていますでしょうか?

ウェブサイトを運営していたらやはりSEO対策は避けては通れないので、WordpressであればYoast SEOAll in One SEO Packのいずれかのプラグインをインストールしているのでは無いでしょうか?

今回はYoast SEOからAll in One SEO Packに戻した時に発生したエラーについて、備忘録的なお話をさせてもらいます。



なぜAll in One SEO Packを一度は止めたのか?

SEO(Search Engine Optimization:検索エンジン最適化)も大切ですが、アクセス解析もやはり大切ですよね?

当初は問題無かった筈なのですが、Wordpressやプラグインのアップデートを幾つか繰り返す内に..アクセスログが取れなくなってしまったのです!

直接的な原因が何かは突き止めていないのですが、トライアンドエラーの最中にAll in One SEO Packを外したらアクセスログが動き始めたのです!

だから単純にAll in One SEO Packを一度止めてみた次第です。

Yoast SEOではどの様なエラーが発生したのか?

元々Yoast SEOは気になる存在でした。

と言うのもAll in One SEO Packの有効インストール数は2百万+と表示されていますが、Yoast SEOは倍以上の5百万+と表示されていたからです!
そんなに人気であれば間違い無いであろうと思っていた訳です。

そしていきなり勢い余って有償のPremium版としたのですが..今一違いが感じられません。
そして..そもそも日本語には弱いのですね。

そこまでは仕方無いとして、問題はメタディスクリプションが反映されない事でした!

1ヶ月ほど待てば検索結果に反映されるだろうと呑気に構えていましたが..2ヶ月待っても反映されません..。
改めてSEOチェキで調べても、メタディスクリプションは反映されていませんでした。

因みにPremium版の特長の一つである、サービスに英語で問い合わせてみたのですが..1週間返答無しでした。

再びAll in One SEO Packに戻してみると..

そんなこんなの紆余曲折が有り、時間も経ったので、実験的にAll in One SEO Packに戻してみたら..あれ、嬉しい事にアクセスログが動いている!

しかしながらトップページでは何も問題は現れませんでしたが、投稿レイアウトではヘッダー部にこの様な英語が表示されてしまったのです!

Warning: count(): Parameter must be an array or an object that implements Countable in ../public_html/wp-includes/post-template.php on line 309

なんじゃ..これ!!

なぜWarningが発生したのか?

プログラム的にはよくわからないものの、英語からすると、


  • カウントに対する警告
  • 引数は配列か数えられるオブジェクトでなければならない
  • post-template.phpの309行目に問題が有る
と言う事がわかりますが..だから何なのかがわかりませんが。

パニックになりながらも、その解決策を求めてググりまくったところ、php7.2.0でcount関数の仕様変更が行われ、引数がカウント出来ない場合にWarningが表示される様になったとの事でした。

投稿レイアウトのsingle.phpではどうやらNULLが渡されるので、NULLは数えられないのでWarningとなる訳です。

phpのcount関数で発生したWarningをどの様に回避したのか?

サーバー側でpost-template.phpを開き、309行目を見てみるとこの様な事が書かれていました。

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

..ふむふむ。
NULLだと数えられないので、NULLを上手く処理する必要が有る訳です。

empty関数でNULLじゃない場合にカウントし、NULLの場合には0にすると言う

if ( ! empty( $pages ) ) {
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
}else {$page = 0;}
となるif文を上記の直後に追加したら..Warningが出なくなりました!

WordPressのコアファイルはいじるべきでは無いと考えると、今回のはかなりの対症療法となりますので、取り敢えず問題は回避されましたが注意して経過観察していきたいと思います。

〜 後日追記分 〜

All in One SEO Packを3.3.1.1にバージョンアップした時に、また同じ様なWarningが出てしまいました。
そして同じ様に上記を追加したらWarningが消えました!

そして翌日更に新しい3.3.2がリリースされているのに気付き、そちらにしたら..Warningが出て来ませんでした!
そもそもの3.3.1.1がPHPのWaning問題の対処で、3.3.2はスニペットプレビューとキャラクターカウンターの改善と言う事なのですが..まあ結果オーライですが。