WordPress で 『Warning: urldecode() expects parameter 1 to be string, array given in /www/wordpress/wp-includes/query.php on line 1893』のような警告が出たときの対処方法


Warning: urldecode() expects parameter 1 to be string, array given in /www/wordpress/wp-includes/query.php on line 1893

WordPressでこんな警告が表示されたときの
対処方法の1例について説明します。

「文字列がくるべきところに配列がきてるよ?
問題の該当箇所は query.php の 1893 行目ね。」
と警告されています。

私が遭遇したケースでは
警告が出た WordPress のバージョンを見ると 4.3.7 。
警告が発っせられた関数は parse_tax_query でした。

最新の WordPress のバージョンは 4.7.1 。
同関数は wp-includes/class-wp-query.php に記述されています。

比較して見ると3ヶ所に差分がありました。

class-wp-query-diff-1

上図のように、1つめの差分はコメントにあります。

class-wp-query-diff-2

class-wp-query-diff-3

上図のように、2つめと3つめの差分はコードです。
いずれも値を『配列』を『カンマ(,)区切りの文字列』へと変換しています。

ということは
wp-includes/query.php
の対応箇所にそれぞれ

// If querystring 'cat' is an array, implode it.
if ( is_array( $q['cat'] ) ) {
$q['cat'] = implode( ',', $q['cat'] );
}


// If querystring 'tag' is array, implode it.
if ( is_array( $q['tag'] ) ) {
$q['tag'] = implode( ',', $q['tag'] );
}

を追記 (引き写し) すれば問題は解決です。

古いバージョンでは

'1,2,3,4'

のようなカンマ区切りの文字列
のみが変数の値として許容されていました。

ということは、古いバージョンにあわせて
作られたプログラムは、値として、必ず
カンマ区切りの文字列を使うと考えられます。

上記のようなコードを追記しても、
旧バージョン向けのプログラム群は、そもそも
値として配列を使うことはないため、
追記によって各種プログラムの挙動が
変わることはなく、互換性は維持されます。

それと共に、新バージョンで新たに許容された

array(1,2,3,4)

のような配列についても、追記したコードが
旧バージョンと同様のカンマ区切りの文字列へと
変換してから処理を進めるため、
問題なく取り扱えるようになります。

WordPress のバージョンアップをするのが
この警告への望ましい対処方法なのですが、
なんらかの事情によって、今はバージョンアップ
できないという場合には、こんな対処方法も考えられます。

警告が出ている位置によって対処方法は異なると思います。
たまたま、私が遭遇したところ同じところで警告が出ている
場合は、こんな方法もありますということで。

Share

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*