教文館の社内ナレッジベースです。

カスタムフィールドタイトルキーワード)をキーワード検索の対象に含める関数でエラーが出た。

function posts_search_custom_fields( $orig_search, $query ) {
if ( $query->is_search() && $query->is_main_query() && ! is_admin() ) {
// 4.4のWP_Query::parse_search()の処理を流用しています。(検索語の分割処理などはすでにquery_vars上にセット済のため省きます)
global $wpdb;
$q = $query->query_vars;
$n = ! empty( $q['exact'] ) ? '' : '%';
$searchand = '';

foreach ($q['search_terms'] as $term ) {
$include = '-' !== substr( $term, 0, 1 );
・・・・・・・・・・・

「Warning: Invalid argument supplied for foreach() in 具体的なファイルパス」のようなエラー警告が出たときは、foreachの使い方が間違っているそうです。

foreach ¶

(PHP 4, PHP 5, PHP 7)

foreach は、配列を反復処理するための便利な方法です。 foreach が使えるのは配列とオブジェクトだけであり、 別のデータ型や初期化前の変数に対して使うとエラーになります。 この構造には二種類の構文があります。

foreach (array_expression as $value)

foreach (array_expression as $key => $value)

出典:

http://php.net/manual/ja/control-structures.foreach.php

「Invalid argument supplied for foreach() …」エラーの原因は配列の形式ではない変数でforeach文を実行しようとしているからです。

出典:http://kotori-blog.com/php/foreach_error/

「配列は、データのみをもっている。オブジェクトは、データと操作をセットでもっている。」のでそもそも取り出し方が違うようです。

この場合、「(array)$arr」で$arrを強制的に配列の形にすることで「Invalid argument supplied for foreach() …」エラーを回避することができます。

function posts_search_custom_fields( $orig_search, $query ) {
if ( $query->is_search() && $query->is_main_query() && ! is_admin() ) {
// 4.4のWP_Query::parse_search()の処理を流用しています。(検索語の分割処理などはすでにquery_vars上にセット済のため省きます)
global $wpdb;
$q = $query->query_vars;
$n = ! empty( $q['exact'] ) ? '' : '%';
$searchand = '';

foreach ((array)$q['search_terms'] as $term ) {
$include = '-' !== substr( $term, 0, 1 );