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

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

ただいまの
回答率

91.24%

  • PHP

    15700questions

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

  • WordPress

    5015questions

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

[Wordpress]tax_queryで親のタクソノミーを指定すると検索に表示されない + 単語検索が機能しない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 77

diver_north

score 2

Wordpress4.9.1です。見よう見まねで実装しようとしているので、説明が不明瞭な部分があるかもしれません。また、PHP初心者のため、コードも冗長な部分や見づらい部分があろうかと思います。申し訳ございません。

前提・実現したいこと

投稿を複数のカスタムタクソノミーで絞込したいと考えています。
タクソノミーは親子階層を持っています。
親を選択したときは子をすべて含めて検索、
子を選択したときは子のみを検索したいです。

子を含む投稿のタクソノミーは親と子を指定しています。

発生している問題・エラーメッセージ

現在、親を選択すると検索結果に現れず、子を選択したときのみ検索結果が表示されます。
もともと子がない親の場合は正常に検索結果が表示されます。

該当のソースコード

検索条件設定画面での記述は下記の通りです。
下記のproductは子あり、foodは子なしです。

<?php
<input type="search" class="search-field" placeholder="キーワードを入力" value="<?php echo get_search_query() ?>" name="s" />

//products 子あり
$terms_order = get_terms ( "products", array ( 'orderby' => 'term_order', 'order' => 'ASC' ) );

// 親タームと子供のタームに分解
foreach ( $terms_order as $term ) {
  if ( $term -> parent == "0" ) {
    $parents_object[]  = $term;
  } else {
    $children_object[] = $term;
  }
}

// 親カテゴリー(親ターム) 
foreach ( $parents_object as $parent ) {
  if ( isset ( $_POST["products"] ) ) {
    if ( in_array ( $parent -> slug, $_POST["products"] ) ) {
      $checked_text = " checked";
    } else {
      $checked_text = "";
    }
  }

  echo '<li>' . '<input type="checkbox" name="products[]" value="' . $parent -> slug . '"' . $checked_text . '>' . $parent -> name . '</li>';

  // 子カテゴリー(子ターム)
  $child_flg = "";
  foreach ( $children_object as $child ) {
    if ( $parent -> term_id == $child -> parent ) {

      if ( isset ( $_POST["products"] ) ) {
        if ( in_array ( $child -> slug, $_POST["products"] ) ) {
          $checked_text = " checked";
        } else {
          $checked_text = "";
        }
      }

      echo '<li class="child">' . '<input type="checkbox" name="products[]" value="' . $child -> slug . '"' . $checked_text . '>' . $child -> name . "  " . '</li>';
      $child_flg = 1;
    }
  }
} ?>
</ul>
<ul>  

//food 子なし
$tax_name = 'food';
$terms_order2 = get_terms($tax_name);
if(!is_wp_error($terms_order2) && count($terms_order2)):
    foreach($terms_order2 as $taxonomy):
        $tax_posts = get_posts(array('post_type' => get_post_type(), 'taxonomy' => $tax_name, 'term' => $taxonomy->slug ) );
        if($tax_posts):
?>
<li><input type="checkbox" name="food[]" value="<?php echo $taxonomy->slug; ?>"><?php echo $taxonomy->name; ?></label></li>
<?php
        endif;
    endforeach;
endif;
?>
</ul>


親子で見た目を区別したいため、上記のように振り分けています。
検索結果ページには下記の記述をしています。

<?php
$s = $_GET['s'];
$tax_products = $_GET['products'];
$tax_food = $_GET['food'];

if(count($tax_products) >= 1){$tax_products_flg = 1;} else {$tax_products_flg = 0;};
if(count($tax_food) >= 1){$tax_food_flg = 1;} else {$tax_food_flg = 0;};

if($tax_products_flg + $tax_food_flg > 1){$relation_key = 'AND';} else {$relation_key = 'OR';}

$search_taxonomies = array(
            'relation' => $relation_key,
            array(
                'taxonomy' => 'products',
                'field' => 'slug',
                'terms' => $tax_products,
                'operator' => 'AND'
            ),
            array(
                'taxonomy' => 'food',
                'field' => 'slug',
                'terms' => $tax_food,
                'operator' => 'IN'
            )
            );
?>
<?php
query_posts( array(
    'tax_query' => $search_taxonomies,
    's' => $s
    )
);

?>

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

<div><?php the_title(); ?></div>
<div><?php the_content(); ?></div>

<?php endwhile; else : ?>

<div>該当なし</div>

<?php endif;
wp_reset_query(); ?>


$search_taxonomiesをvar_dumpで見てみたのですが、
子ありの表示されない時と、子なしの表示される時で差異はありませんでした。(入っているタクソノミーは異なりますが)

ちなみに検索ワードも認識されません。
var_dumpで$sを見ると、ちゃんと入力したものが表示されています…。

色々WEB検索してみたりして調べてみたのですが、ここ数日どうにも行き詰まっております…。
どこが原因なのかもサッパリ見当がつかず…。

お心当たりの方、ヒントなどでもお教えいただければ幸いです。

以上、何卒よろしくお願い致します。

その後チェックした事項

-$wp_query->requestの中身
↓下記はうまく表示できないときの中身です。

string(436) "SELECT SQL_CALC_FOUND_ROWS  wp_posts.ID FROM wp_posts  LEFT JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) WHERE 1=1  AND ( 
  wp_term_relationships.term_taxonomy_id IN (3,4,5)
) AND wp_posts.post_type IN ('post', 'page', 'attachment') AND (wp_posts.post_status = 'publish' OR wp_posts.post_author = 1 AND wp_posts.post_status = 'private') GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 10"


↓下記は表示できるときの中身です。

string(432) "SELECT SQL_CALC_FOUND_ROWS  wp_posts.ID FROM wp_posts  LEFT JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) WHERE 1=1  AND ( 
  wp_term_relationships.term_taxonomy_id IN (4)
) AND wp_posts.post_type IN ('post', 'page', 'attachment') AND (wp_posts.post_status = 'publish' OR wp_posts.post_author = 1 AND wp_posts.post_status = 'private') GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 10"


差異は「wp_term_relationships.term_taxonomy_id IN (3,4,5)」の数値だけでした。
該当DB内にちゃんと数値が存在するかも確認しました。

-フォームのname属性のタイプミス確認
→何度か見直しましたが、タイプミスはありませんでした。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

check解決した方法

+1

些細な点で引っかかっていた…というか、当たり前の挙動でした。

単に、親タクソノミーを指定すると子をすべて選択した状態になりますが、$search_taxonomiesのOPERATORでANDにしており、子タクソノミーすべてを含む投稿がないため表示されていなかっただけでした。
INにして解決しました。なぜこんなことに気づかなかったのか…。

お目汚し失礼いたしました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

ただいまの回答率

91.24%

関連した質問

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

  • PHP

    15700questions

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

  • WordPress

    5015questions

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

  • トップ
  • PHPに関する質問
  • [Wordpress]tax_queryで親のタクソノミーを指定すると検索に表示されない + 単語検索が機能しない