検索結果をソートしたい

検索結果をソートするには、通常query_posts()で”orderby”を指定する。
ただし指定できる項目は、投稿テーブル(wp-posts)のフィールドに限られる。
他の項目(カスタムフィールドや、カテゴリ順など)でソートした場合には、
フィルターフックでSQLに手を加えるとよい。

たとえばカテゴリのid順にソートした場合は、

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;
}

独自に作成したテーブルを追加することも可能だ。ただしやりすぎと負荷がかかるので、様子を見ながら対応すること。

コメントをどうぞ

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>