検索結果をソース(投稿タイプ)ごとにグループ化し、順序を設定する
デフォルトでは、SearchWPはエンジン内のすべてのソースから関連性の重みで降順にランク付けされた結果を返します。
場合によっては、ソース別に結果をグループ化し、各ソースグループ内で関連性によって結果を並べ替えると便利です。
これを実現するために、\SearchWP\Mod を利用できます。
すべてのフックはカスタムのSearchWP カスタマイズプラグインに追加する必要があります。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?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 を返して適用するかどうかを判断できます。

