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

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

ただいまの
回答率

87.33%

【Wordpress】検索結果にタクソノミーまたはACFの値によるソート切り替え(一覧の並び替え)を設置したい。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 777

score 17

現在、Wordpressにて検索画面を作成しています。
その際、検索結果にタクソノミーによるソート切り替え機能を実装したいと思い、
多々調べながら、実装を試みていますが適用されずの為、ご相談させて頂きます。

こちらのページを参考に、

・おすすめ(pick_up)
・徒歩(walk_time)
・値段(max_price)

上記、3つのタクソノミーを作成し
※()内はタームです。

その後、functions.phpにて

// 並び替え条件パラメータを追加
function add_sort_query_vars( $public_query_vars ) {
  $public_query_vars[] = 'sort';
  return $public_query_vars;
}
add_filter( 'query_vars', 'add_sort_query_vars' );
// 並び替え処理を設定
function change_posts_per_page( $query ){
  if($query->is_search()){
    if( !empty($_GET['sort']) ){
      if( $_GET['sort'] == 'RENT_DESC' ){
        $query->set( 'orderby', array( 'max_price' => 'DESC') );
      }elseif( $_GET['sort'] == 'RENT_ASC' ){
        $query->set( 'orderby', array( 'walk_time' => 'ASC' ) );
      }else{
        $query->set( 'orderby', array( 'pick_up' => 'DESC' ) );
      }
    }
  }
}
add_action( 'pre_get_posts', 'change_posts_per_page' );


このように記述し、
search.phpには

<!-- 並び替え用のセレクトボックス -->
<select id="sort" name="sort">
<option value="<?php echo add_query_arg('sort', false); ?>" <?php if($sort_val == ''): echo 'selected'; endif; ?>>オススメ順</option>
<option value="<?php echo add_query_arg('sort', 'RENT_DESC'); ?>" <?php if($sort_val == 'RENT_DESC'): echo 'selected'; endif; ?>>値段が高い順</option>
<option value="<?php echo add_query_arg('sort', 'RENT_ASC'); ?>" <?php if($sort_val == 'RENT_ASC'): echo 'selected'; endif; ?>>駅から近い順</option>
</select>
<!-- 並び替えの条件が変わった時の処理 -->
<script>
    $("select[name='sort']").change(function() {
    var href = $(this).val();
    if(href != ''){
        location.href = href;
    }
    });    
</script>


このように行ってみましたが、
並び替えが適用されない状態です。

この方法を行う上で『ここをこうすれば良い』
または、別の方法などでも結構ですので、ご教授頂ければ幸いです。

よろしくお願いします。

【追記1】

参考URLでは、カスタムフィールドで行っていたので、

・おすすめ(sort_pickup)
・徒歩(sort_walktime)
・値段(sort_maxprice)

このようにフィールドを作りfunctions.phpに

// 並び替え条件パラメータを追加
function add_sort_query_vars( $public_query_vars ) {
  $public_query_vars[] = 'sort';
  return $public_query_vars;
}
add_filter( 'query_vars', 'add_sort_query_vars' );
// 並び替え処理を設定
function change_posts_per_page( $query ){
  if($query->is_search()){
    if( !empty($_GET['sort']) ){
      if( $_GET['sort'] == 'RENT_DESC' ){
        $query->set( 'orderby', array( 'sort_maxprice' => 'DESC') );
      }elseif( $_GET['sort'] == 'RENT_ASC' ){
        $query->set( 'orderby', array( 'sort_walktime' => 'ASC' ) );
      }else{
        $query->set( 'orderby', array( 'sort_pickup' => 'DESC' ) );
      }
    }
  }
}
add_action( 'pre_get_posts', 'change_posts_per_page' );


こちらで試してみましが上手く行かずでしたので、

// 並び替え条件パラメータを追加
function add_sort_query_vars( $public_query_vars ) {
  $public_query_vars[] = 'sort';
  return $public_query_vars;
}
add_filter( 'query_vars', 'add_sort_query_vars' );
// 並び替え処理を設定
function change_posts_per_page( $query ){
  if($query->is_search()){
    if( !empty($_GET['sort']) ){
      if( $_GET['sort'] == 'RENT_DESC' ){
        $query->set( 'orderby', array( get_field('sort_maxprice') => 'DESC') );
      }elseif( $_GET['sort'] == 'RENT_ASC' ){
        $query->set( 'orderby', array( 'get_field('sort_walktime') => 'ASC' ) );
      }else{
        $query->set( 'orderby', array( get_field('sort_pickup') => 'DESC' ) );
      }
    }
  }
}
add_action( 'pre_get_posts', 'change_posts_per_page' );


このように、get_fieldでも検証してみましたが、
ソートの切り替えが反映されませんでした。

最終的にはタクソノミーでも、カスタムフィールドでも
ソートの切り替えができれば問題はないと思っておりますので、
お知恵貸して頂ければ幸いです。

よろしくお願いします。

【追記2】

頂いた参考サイトを元に、
試行錯誤しながら下記のようにしてみましたが
切り替え用のセレクトボックスでソートを切り替えを行った所、
一旦は並び替わるようになしましたが、再度他のソートにした所、
1回目に切り替えた並び順から変更されない状態になりました。

// おすすめ
$walk_time = array(
    'post_type' => 'post',
    'tax_query' => array(
        array(
            'taxonomy' => 'walk_time',
            'field'    => 'slug',
        ),
    ),
);
$walk_time_query = new WP_Query( $walk_time );
// 徒歩
$walk_time = array(
    'post_type' => 'post',
    'tax_query' => array(
        array(
            'taxonomy' => 'walk_time',
            'field'    => 'slug',
        ),
    ),
);
$walk_time_query = new WP_Query( $walk_time );
// 値段
$max_price = array(
    'post_type' => 'post',
    'tax_query' => array(
        array(
            'taxonomy' => 'max_price',
            'field'    => 'slug',
        ),
    ),
);
$max_price_query = new WP_Query( $max_price );
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

+1

・おすすめ(pick_up)
・徒歩(walk_time)
・値段(max_price)
上記、3つのタクソノミーを作成し
※()内はタームです。

この説明は正しいだろうか。
1つのカスタムタクソノミーに3つのタームを作成 が正しいのではないだろうか。

コードを見て思う点。

参考
Theres a way to use $query->set('tax_query' in pre_get_posts filter?
https://wordpress.stackexchange.com/questions/35196/theres-a-way-to-use-query-settax-query-in-pre-get-posts-filter

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2021/02/23 18:11

    ご回答ありがとうございます。

    >1つのカスタムタクソノミーに3つのタームを作成 が正しいのではないだろうか。
    失礼しました。
    3つのカスタムタクソノミーを作成したという意味であり、
    セレクトボックスで、各々のスラッグ(もしくはID)の若い順に切り替えができればと言う意味になります。

    >あるあるのUncaught TypeError: $ is not a functionが出てないか。
    調べてみる限り、出ているような表記はなかったのですが
    $sort_valが未定義のエラーが原因かとは感じています。

    その上で参考サイトを拝見しながら、多々試してみた所、
    【追記2】のような状態になりました。
    ※書き方が悪いのだろうというのはわかってはいるのですが…。

    キャンセル

check解決した方法

0

タクソノミーではなく、
ACFで設定したカスタムフィールドを用いた方法でとりあえずは切り替えができるようになりました。

【functions.php】
function change_posts_query( $query ) {
    if( is_category() ) {
        if( !empty($_GET['order_by_sort_maxprice']) ){
            $query->set('meta_key', 'sort_maxprice');
            $query->set('orderby', 'meta_value_num');
            $query->set('order', 'ASC');
        }elseif( !empty($_GET['order_by_sort_walktime']) ){
            $query->set('meta_key', 'sort_walktime');
            $query->set('orderby', 'meta_value_num');
            $query->set('order', 'ASC');
        }elseif( !empty($_GET['order_by_sort_pickup']) ){
            $query->set('meta_key', 'sort_pickup');
            $query->set('orderby', 'meta_value_num');
            $query->set('order', 'ASC');
        }
    }
}
add_action('pre_get_posts', 'change_posts_query');

【search.php】
<a href="<?php echo add_query_arg( array('order_by_recommended'=>'ASC')); ?>">おすすめ順</li>
<a href="<?php echo add_query_arg( array('order_by_examination'=>'ASC')); ?>">駅から近い順</a></li>
<a href="<?php echo add_query_arg( array('order_by_creditlimit'=>'ASC')); ?>">値段が安い順</a></li>


ちょっとURLが怪しい気もしていますが、
とりあえず行いたい並び替え通りにはなっているので、これでしばらく様子を見てみようと思います。

ご回答頂いた方、ありがとうございました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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

  • トップ
  • PHPに関する質問
  • 【Wordpress】検索結果にタクソノミーまたはACFの値によるソート切り替え(一覧の並び替え)を設置したい。