検索結果をソース(投稿タイプ)ごとにグループ化し、順序を設定する
デフォルトでは、SearchWPはエンジン内のすべてのソースから関連性の重みで降順にランク付けされた結果を返します。
場合によっては、ソース別に結果をグループ化し、各ソースグループ内で関連性によって結果を並べ替えると便利です。
これを実現するために、\SearchWP\Mod を利用できます。
All hooks should be added to your custom SearchWP Customizations Plugin.
| <?php | |
| // Group SearchWP results by Source, sort by relevance within each Source group. | |
| // @link https://searchwp.com/documentation/knowledge-base/group-results-by-source-post-type/ | |
| add_filter( 'searchwp\query\mods', function( $mods, $query ) { | |
| $mod = new \SearchWP\Mod(); | |
| $mod->order_by( function( $mod ) { | |
| // Search results should be grouped by Sources in this order. | |
| // NOTE: _ALL_ Engine Sources must be included here! | |
| $source_order = [ | |
| 'user', | |
| \SearchWP\Utils::get_post_type_source_name( 'post' ), | |
| \SearchWP\Utils::get_post_type_source_name( 'page' ), | |
| ]; | |
| return "FIELD({$mod->get_foreign_alias()}.source, " | |
| . implode( ',', array_filter( array_map( function( $source_name ) { | |
| global $wpdb; | |
| return $wpdb->prepare( '%s', $source_name ); | |
| }, $source_order ) ) ) . ')'; | |
| }, '', 1 ); | |
| $mods[] = $mod; | |
| return $mods; | |
| }, 10, 2 ); |
注意: このカスタマイズを完全に有効にするには、$source_order 配列を(希望する順序で)ソース名でカスタマイズする必要があり、エンジンソースのすべてを含める必要があります。
上記のコードスニペットは、投稿タイプのSearchWPの内部ソース名を取得するためのユーティリティ関数を参照しています。ユーザーソースはuserという名前で、その他のソース名も含まれている必要があります。
この並べ替えを条件付きで適用したい場合は、$query 変数を調べて、早期に終了するか、\SearchWP\Mod を返して適用するかどうかを判断できます。

