検索結果をソートするには、通常query_posts()で”orderby”を指定する。
ただし指定できる項目は、投稿テーブル(wp-posts)のフィールドに限られる。
他の項目(カスタムフィールドや、カテゴリ順など)でソートした場合には、
フィルターフックでSQLに手を加えるとよい。
たとえばカテゴリのid順にソートした場合は、
[sourcecode language=’php’]
add_filter(‘posts_join’, ‘my_join’);
add_filter(‘posts_orderby’, ‘my_orderby’);
function my_join($query){
global $wpdb;
if(is_search()){
$query .= ” JOIN $wpdb->term_relationships AS tr ON tr.object_id=$wpdb->posts.ID JOIN $wpdb->term_taxonomy AS tt ON tt.term_taxonomy_id=tr.term_taxonomy_id JOIN $wpdb->terms AS t ON t.term_id=tt.term_id”;
}
return $query;
}
function my_orderby($query) {
global $wpdb;
if(is_search()){
$query = ” t.term_id DESC, $wpdb->posts.post_date DESC”;
}
return $query;
}
[/sourcecode]
独自に作成したテーブルを追加することも可能だ。ただしやりすぎと負荷がかかるので、様子を見ながら対応すること。