• WP_QueryカスタムフィールドでのソートでAND検索とOR検索を同時にしたい場合はどうしたら良いでしょうか?
    AND検索だけなら

    'meta_query' => array(
      'relation' => 'AND',
      array(
        'key' => 'color',
        'value' => 'blue'
        'type' => 'CHAR',
        'compare' => '='
       ),
       array(
        'key' => 'price',
        'value' => 'A',
        'compare' => 'NOT LIKE'
       )
    )

    こういった具合でできると思いますが、

    'meta_query' => array(
      'relation' => 'OR',
      array(
        'relation' => 'AND',
        array(
          'key' => 'color',
          'value' => 'blue'
          'type' => 'CHAR',
          'compare' => '='
        ),
        array(
          'key' => 'price',
          'value' => 'B',
          'compare' => 'NOT LIKE'
        )
      ),
      array(
        'relation' => 'AND',
        array(
          'key' => 'color',
          'value' => 'red'
          'type' => 'CHAR',
          'compare' => '='
        ),
         array(
          'key' => 'price',
          'value' => 'B',
          'compare' => 'NOT LIKE'
        )
      )
    )

    上記のように、AND検索のOR検索がしたいのですが可能でしょうか?

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • トピック投稿者 taaaaaaacan

    (@taaaaaaacan)

    <?php if ( have_posts() ) : ?>
      <div>
      <?php while ( have_posts() ) : the_post(); ?>
        <?php $serviceName = get_the_title(); echo $serviceName; ?>
          <?php
            $meta_query = array(
              'relation' => 'OR',
            );
            foreach( $areaA as $item ){
              $meta_query[] = array(
                'relation' => 'AND',
                array(
                  'key'     => 'area',
                  'value'   => $item,
                  'compare' => 'LIKE',
                ),
                array(
                  'value'   => $serviceName,
                  'compare' => 'LIKE',
                )
              );
            }
            $sub_query = new WP_Query(array(
              'post_type' => 'office',
              'posts_per_page' => -1,
              'meta_query' => $meta_query,
            ));
          ?>
          <?php if($sub_query->have_posts()): ?>
            <ul>
              <?php while ($sub_query->have_posts()) : $sub_query->the_post(); ?>
                <li><?php the_title(); ?></li>
              <?php endwhile; ?>
            </ul>
          <?php endif; ?>
      <?php endwhile; ?>
      </div>
    <?php endif; ?>

    このようなコードではエラーが出てしまい、画面が表示されないです。
    また、処理に時間がかかりすぎているようにも思います。

    トピック投稿者 taaaaaaacan

    (@taaaaaaacan)

    現在は

    <?php if ( have_posts() ) : ?>
      <div class="potTtl" style="padding:20px;margin:20px;border:2px solid #666;">
      <?php while ( have_posts() ) : the_post(); ?>
        <?php $serviceName = get_the_title(); echo $serviceName; ?>
          <?php
            $meta_query = array(
              'relation' => 'OR',
            );
            foreach( $areaA as $item ){
              $meta_query[] = array(
                'key'     => 'area',
                'value'   => $item,
                'compare' => 'LIKE',
              );
            }
            $sub_query = new WP_Query(array(
              'post_type' => 'office',
              'posts_per_page' => -1,
              'meta_query' => $meta_query,
            ));
          ?>
          <?php if($sub_query->have_posts()): ?>
            <ul>
              <?php while ($sub_query->have_posts()) : $sub_query->the_post(); ?>
                <?php
                $service01 = implode(',',get_field('service01'));
                $service02 = implode(',',get_field('service02'));
                $service03 = implode(',',get_field('service03'));
                $service04 = implode(',',get_field('service04'));
                $service05 = implode(',',get_field('service05'));
                $service06 = implode(',',get_field('service06'));
                $serviceA = $service01.$service02.$service03.$service04.$service05.$service06; ?>
                <?php if (strstr($serviceA, $serviceName)) { ?>
                  <li><?php the_title(); ?></li>
                <?php } ?>
              <?php endwhile; ?>
            </ul>
          <?php endif; ?>
      <?php endwhile; ?>
      </div>
    <?php endif; ?>

    このようにして対応しているのですが、カスタムフィールド「$service01から$service06」のどれかに親ループのタイトルが一致していて、エリアの複数検索をしてる感じです。

    全部を読んでいませんが、

                array(
                  'value'   => $serviceName,
                  'compare' => 'LIKE',
                )

    のキーが抜けているように思います。

    それで、どのようなエラーが出ているのでしょうか?

    トピック投稿者 taaaaaaacan

    (@taaaaaaacan)

    エラーに関しては
    2分ほど読み込みを行なったのち、
    ERR_EMPTY_RESPONSEと表示されます。

    現在は

    <?php if ( have_posts() ) : ?>
      <?php while ( have_posts() ) : the_post(); ?>
        <div class="potTtl" style="padding:20px;margin:20px;border:2px solid #666;">
        <?php $serviceName = get_the_title(); echo $serviceName; ?>
          <?php
            $meta_query = array(
              'relation' => 'OR',
            );
            foreach( $areaA as $item ){
              $meta_query[] = array(
                'relation' => 'AND',
                array(
                  'key'     => 'area',
                  'value'   => $item,
                  'compare' => 'LIKE',
                ),
                array(
                  'value'   => $serviceName,
                  'compare' => 'LIKE',
                )
              );
            }
            $sub_query = new WP_Query(array(
              'post_type' => 'office',
              'posts_per_page' => -1,
              'meta_query' => $meta_query,
            ));
          ?>
          <?php if($sub_query->have_posts()): ?>
            <ul>
              <?php while ($sub_query->have_posts()) : $sub_query->the_post(); ?>
                <?php
                $service01 = implode(',',get_field('service01'));
                $service02 = implode(',',get_field('service02'));
                $service03 = implode(',',get_field('service03'));
                $service04 = implode(',',get_field('service04'));
                $service05 = implode(',',get_field('service05'));
                $service06 = implode(',',get_field('service06'));
                $serviceA = $service01.$service02.$service03.$service04.$service05.$service06; ?>
                <?php if (strstr($serviceA, $serviceName)) { ?>
                  <li><?php the_title(); ?></li>
                <?php } ?>
              <?php endwhile; ?>
            </ul>
          <?php endif; ?>
        </div>
      <?php endwhile; ?>
    <?php endif; ?>

    こちらで対応できているのですが、カスタムフィールド「$service01から$service06」のどれかに親ループのタイトルが一致していて、エリア(複数選択可・その中のいづれかが一致する)でも検索できるようにしたい感じです。
    上記コードだと、無駄な処理が多く含まれるので、あまりよくはないのかなと思っています。
    また、
    http://wood-roots.com/web/wordpress/304
    上記のような記事も見かけるので、検索項目が多いと処理が重すぎるのかなぁと言う気もしますが。。。

5件の返信を表示中 - 1 - 5件目 (全5件中)

トピック「WP_Queryカスタムフィールドでのソート」には新たに返信することはできません。