🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

1267閲覧

PHP7.3.5にバージョンアップした時のWordpressのWarning: count()について

sumisumi

総合スコア9

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/12/06 07:14

前提・実現したいこと

PHPを7.3.5にバージョンアップしてから、Wordpress(バージョン 5.3–ja )の
トップ画面にて、下記警告が出来ている状態であり、下記警告を消したいですが、
消す事が出来ず困っています。

Warning: count(): Parameter must be an array or an object that implements Countable in /export/sd206/www/jp/r/e/gmoserver/1/0/sd0291610/infla-lab.com/wordpress-4.3.1-ja-jetpack-undernavicontrol/wp-includes/post-template.php on line 316

■template.phpの316行目付近

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 } $page_no = $elements['page']; $content = $elements['pages'][ $page_no - 1 ]; if ( preg_match( '/<!--more(.*?)?-->/', $content, $matches ) ) { if ( has_block( 'more', $content ) ) { // Remove the core/more block delimiters. They will be left over after $content is split up. $content = preg_replace( '/<!-- /?wp:more(.*?) -->/', '', $content );

試したこと

プラグインのJetpackを一度削除して、再インストールをしましたが、
下記警告は消えない状況です。

補足情報

WordPressで使用しているテーマは「Moesia」となります。
以上、何卒宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/12/06 07:17

そのテーマはPHP7.3に対応したものなのでしょうか。
sumisumi

2019/12/06 07:25

ご質問ありがとうございます。その観点が私に無かったため、調べてみたいと思います。ありがとうございます。
sumisumi

2019/12/06 07:58

先程テーマを、プラグインの「PHP Compatibility Checker」で調べましたが、テーマはPHP7.3と互換性ありでした。他に何か考えられうる所はありますでしょうか?
m.ts10806

2019/12/06 08:03

WordPress本体とその他利用しているプラグインがどうか、ですね。 利用しているバージョンがキーです
sumisumi

2019/12/06 08:17

ご返答ありがとうございます。 Wordpressは、バージョン 5.3–ja にアップデートしており、 その他、現在利用しているプラグインは下記ですが、全てPHP7.3 と互換性ありでした。 a3 Lazy Load - 互換性あり All In One SEO Pack - 互換性あり Async JavaScript - 互換性あり Autoptimize - 互換性あり Breadcrumb NavXT - 互換性あり Classic Editor - 互換性あり Contact Form 7 - 互換性あり Custom Post Type UI - 互換性あり Google XML Sitemaps - 互換性あり Moesia - 互換性あり Open Graph Pro - 互換性あり Simple 301 Redirects - 互換性あり SNS Count Cache - 互換性あり WordPress Popular Posts - 互換性あり WP Social Bookmarking Light -互換性あり
m.ts10806

2019/12/06 08:48

あれ?最初にテーマを確認するように言ったような
guest

回答2

0

PHPの仕様変更によるものです。
PHP 7.2 の WordPress で Warning: count(): … のエラーが出る
PHP7.2のcountにハマった話

ですが、手動で修正してしまうと他に影響を与えないという保証もないので、自己責任です。
WordPress本体が最新なのであれば、PHP7系に対応していないプラグインやテーマがあるのかもしれませんね。

投稿2019/12/06 07:27

Takumiboo

総合スコア2536

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

これは「配列か、countable である(Countableインターフェースを継承している)オブジェクトに対してでない限り、count() は使えない」という警告です。
PHP 7.2 から警告になりました。
参考:https://www.php.net/manual/ja/migration72.incompatible.php

したがって、$elements['pages'] が countable ではないのでしょう。

ではどう回避するか、ですが…… 複数くる「こともある」のであれば、count() が使えるかどうか判定するしかありません。(いちいち try-catch してしまう手もなくはないですが)

PHP

1is_array($elements['pages']) || 2 (is_object($elements['pages'] && is_subclass_of($elements['pages'], 'Countable'))

の結果を見て true であれば今のコードのままにしてよいし、false なら count の結果を 0 なり 1($elements['pages'] が NULL でなければ)と限定してよいはずです。

投稿2019/12/06 07:30

編集2019/12/06 07:33
tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/12/06 07:36

とりあえず対応でバグを誘発する(または手におえなくなる)くらいなら本体アップデートかプラグイン、テーマをアップデートしたほうがいいかもしれませんね。 最新すら対応してないなら依頼してそれまではPHPのバージョンを戻すか
tacsheaven

2019/12/06 07:42

PHP 7.2 が出たときから発生しますので、アップデートすれば解消するとは思うのですが、ダメだったら count() の代わりをする関数を作っちゃって回避ですかね。 public int looseCount($it) { return (is_array($it) || (is_object($it) && is_subclass_of($it, 'Countable')) ? count($it) : (is_null($it) ? 0: 1); } ぎりワンライナーかな(w
sumisumi

2019/12/06 08:34

いろいろとアドバイスありがとうございます。 PHPのバージョンを落としても、戻らなかったのですが、 テーマをアップデートしたら、消えました! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問