質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

87.49%

WordPress - 2つのWP_Queryを使って検索結果を表示したい

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 4,101

score 16

WordPressで、以下のようなカテゴリーとタグとキーワードを使った検索フォームを作成しています。

<検索フォームページ : 下準備>

<label><input type="checkbox" value="11" name="cat[]">カテゴリー1</label>
<label><input type="checkbox" value="12" name="cat[]">カテゴリー2</label>

<label><input type="checkbox" value="1" name="tag_id[]">タグ1</label>
<label><input type="checkbox" value="2" name="tag_id[]">タグ2</label>

<input type="text" name="s" id="s" placeholder="検索">
<input id="submit" type="submit" value="検索">

<検索結果ページ : 下準備>

$cat_keys = $_GET['cat'];
$tag_keys = $_GET['tag_id'];

// カテゴリーアリ&配列ならIDを$cat_idsへ
if(is_array($cat_keys)) { 
    foreach($cat_keys as $cat_key):
        $cat_ids[] = get_category($cat_key)->term_id;
    endforeach;
}
// タグアリ&配列ならIDを$tag_idsへ
if(is_array($tag_keys)) { 
    foreach($tag_keys as $tag_key):
        $tag_ids[] = get_term_by('ID', $tag_key, 'post_tag') ->term_id;
    endforeach;
}

// 検索ワードがある場合は検索ワードを$word_strへ
if (isset($_GET['s']) && empty($_GET['s'])) {
    $word_str = get_query_var('s');
}

上記、質問に不要と思われる余計なコード等は割愛してますが、
今の段階で検索結果ページにて「カテゴリーID」「タグID」「検索キーワード」を、
表示させるところまでは出来ています。

表示イメージ)
・検索対象のカテゴリーIDは 1,2 です
・検索対象のタグIDは 11,12 です
・検索キーワードは「あああ いいい」です

ここから、次のようにWP_Queryを使って検索結果を取得し表示させたいのですが
キーワードが絡むと表示がどうしてもうまくいきません↓

    // relationの設定 ★事前に各$**_key変数が空じゃなければ $**_flag変数をtrueに設定済
    if($tag_keys_flag  && $cat_keys_flag) { $relation_key = 'AND';} else { $relation_key = 'OR';}

    // 検索条件
    $query1 = new WP_Query( array(
        'post_type' => 'post',
        'tax_query' => array(
            'relation' => $relation_key,
            array(
                'taxonomy' => 'category',
                'field' => 'id',
                'terms' => $cat_ids,
                'operator' => 'IN'
            ),
            array(
                'taxonomy' => 'post_tag',
                'field' => 'id',
                'terms' => $tag_ids,
                'operator' => 'IN'
            )
        )
    ));

    // もし「キーワード」があったらWP_Queryを追加
    if($word_flag) {
        $query2 = new WP_Query( array(
            'posts_per_page' => -1,
            's' => $s,
        ));
    }

    // 結果を取得&表示
    $result = new WP_Query();

    $result->posts = array_merge( $query1->posts, $query2->posts  );
    $result->post_count = count( $result->posts );

    // 条件にマッチした記事数を$get_numへ
    $get_num = $result->post_count;

■ ここまで出来ていること
・マッチした記事数は正常に取得できている (キーワードアリ/ナシ問わず問題なし)
・キーワードがない場合の検索結果の一覧表示

■ ここまでで出来ないこと
キーワードがある場合の検索結果 (カテゴリー、タグの値の有無に関係なく、
上記のarray_merge部分について、以下のようなエラーが表示されます。

Warning: array_merge(): Argument #1 is not an array in /home/[サイトURL]/[ファイルURL] on line 11

エラーの内容を確認し、$query2を$query2[] などとしてみたり、
色々と試してはみたのですが、いずれもダメでした。

すみません、どこで躓いているのか、どういう組み立て方が正しいのか、
などご教示いただける方がいましたら、どうぞお力を貸してください。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    退会済みユーザー

    2017/07/19 19:36

    $word_strはどこで使用していますか。また、WP_Queryを2つに分ける必要はないように思えるのですが、いかがでしょうか。

    キャンセル

  • waon

    2017/08/04 16:41

    mizさん、はじめまして。回答ありがとうございます。また、返信まで時間が空いてしまってすみません。$word_str の記載、間違えてました。$query2が「's' => $word_str」になりますね。

    キャンセル

  • waon

    2017/08/04 16:49

    ちなみにWP_Queryは最初1つで試していたのですが、「$s => '$word_str'」が空の場合に検索結果がどんな条件でも0件になってしまったので分けてみた次第です。ただ、そんなことをしなくても$word_strに値がある場合は、条件分岐で「$query1['s'] = $word_str;」といった書き方でいけました。

    キャンセル

回答 1

checkベストアンサー

+1

Warning: array_merge(): Argument #1 is not an array in /home/[サイトURL]/[ファイルURL] on line 11


$query1->postsや$query2->postsの型は配列じゃないです。
配列じゃ無いものをarray_merge()などできません。
$query1や$query2は、WP_Queryクラスのインスタンスです。

やりたいことの確認ですが、カテゴリー、タグ、検索ワードで絞り込んだ投稿データの出力ですよね?
そうであれば、そもそもWP_Queryを2つに分ける必要はないです。

    // 検索条件
    $query1 = new WP_Query( array(
        'post_type' => 'post',
        's'         => $s,
        'tax_query' => array(
            'relation' => $relation_key,
            array(
                'taxonomy' => 'category',
                'field' => 'id',
                'terms' => $cat_ids,
                'operator' => 'IN'
            ),
            array(
                'taxonomy' => 'post_tag',
                'field' => 'id',
                'terms' => $tag_ids,
                'operator' => 'IN'
            )
        )
    ));

これでいけます。
$sの制御ですが、$_GET['s']が空だったらそのまま空文字いれれば検索ワード無しということで動いたはずです。
もしうごかなければ、's' => $s を変数化して$sがある時だけ配列に組み込むように制御すればOKです。

このようにすれば、あとは普通にループの展開で検索結果がとれると思いますよ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/04 16:55 編集

    Iya712さん、はじめまして。回答ありがとうございます。また、返信までにお時間が空いてしまいすみません。いただいた回答を参考に、試行錯誤しながら何とか検索結果が得られました。

    元々、WP_Queryは1つだったのですが、$sが空の場合は検索結果がどんな条件でも0件になってしまっていました。その後、質問時に記載したWP_Queryを2つ使う方法で試していたのですが、「もしうごかなければ、's' => $s を変数化して$sがある時だけ配列に組み込むように制御すればOKです。」をヒントに「if($s) { $query1['s'] = $s;}」といった方法で実現できました。ありがとうございます。

    キャンセル

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

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る