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

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

新規登録して質問してみよう
ただいま回答率
85.35%
WordPress

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

PHP

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

Q&A

解決済

2回答

3125閲覧

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

NNC

総合スコア22

WordPress

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

PHP

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

0グッド

2クリップ

投稿2021/02/21 12:27

編集2021/02/23 09:10

現在、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 );

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

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

コードを見て思う点。

  • あるあるのUncaught TypeError: $ is not a functionが出てないか。
  • $sort_valが未定義なのでエラーになる。
  • カスタムタクソノミーの場合tax_queryを使わないといけない。

https://developer.wordpress.org/reference/classes/wp_query/#taxonomy-parameters

参考
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 01:49

編集2021/02/23 01:59
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NNC

2021/02/23 09:11

ご回答ありがとうございます。 >1つのカスタムタクソノミーに3つのタームを作成 が正しいのではないだろうか。 失礼しました。 3つのカスタムタクソノミーを作成したという意味であり、 セレクトボックスで、各々のスラッグ(もしくはID)の若い順に切り替えができればと言う意味になります。 >あるあるのUncaught TypeError: $ is not a functionが出てないか。 調べてみる限り、出ているような表記はなかったのですが $sort_valが未定義のエラーが原因かとは感じています。 その上で参考サイトを拝見しながら、多々試してみた所、 【追記2】のような状態になりました。 ※書き方が悪いのだろうというのはわかってはいるのですが…。
guest

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が怪しい気もしていますが、
とりあえず行いたい並び替え通りにはなっているので、これでしばらく様子を見てみようと思います。

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

投稿2021/02/24 07:26

NNC

総合スコア22

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問