カスタムフィールドタイトルキーワード)をキーワード検索の対象に含める関数でエラーが出た。
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 );
