Go to top Go to bottom

メインループにおいて、投稿の並び順はデフォルトで「投稿日が新しい順」となっています。ここではこの条件をタイトル順や更新日順などに変更してみたいと思います。

投稿の並び順を変更する方法

メインループのクエリ条件を変更するには、pre_get_postsというアクションフックを利用します。このライブラリで説明している通り、query_posts()使用してはいけません

function twpp_change_sort_order( $query ) {
  if ( is_admin() || ! $query->is_main_query() ) {
    return;
  }

  if ( $query->is_home() ) {
    $query->set( 'order', 'ASC' );
    $query->set( 'orderby', 'title' );
  }
}

add_action( 'pre_get_posts', 'twpp_change_sort_order' );

並び順を変更するには、クエリの順序付けパラメータを変更します。7行目で順序をASC(昇順)に、基準を「タイトル」に変更しています。これにより、「投稿のタイトル順」に記事が並びます。

並び順を制御するための主なパラメータ

昇順、降順の切り替えは、'ASC''DESC'で行います。初期値は'DESC'なので、昇順にしたい場合のみ設定すればよいでしょう。日付の場合、デフォルトの場合は'DESC'、すなわち新しい順に並びます。

$query->set( 'order', 'ASC' );

順序の基準を変更する主なパラメータは次の通りです。

author著者で並び替える
titleタイトル順に並び変える
date投稿日時の新しい順(DESC)・または古い順(ASC)に並び変える
modified更新日時の新しい順(DESC)・または古い順(ASC)に並び変える
randランダムで並び替える
comment_countコメントの数が多い順・または少ない順で並び替える

すべてのパラメータについてはCodexを参照してください。

条件分岐を使えば、場面によって並び順を変更することもできます。

function twpp_change_sort_order( $query ) {
  if ( is_admin() || ! $query->is_main_query() ) {
    return;
  }

  if ( $query->is_home() ) {
    $query->set( 'orderby', 'comment_count' );
  } elseif ( $query->is_category() ) {
    $query->set( 'orderby', 'modified' );
  } elseif ( $query->is_search() ) {
    $query->set( 'order', 'ASC' );
    $query->set( 'orderby', 'title' );
  }
}

add_action( 'pre_get_posts', 'twpp_change_sort_order' );

$query->is_category()はカテゴリーページ、$query->is_search()は検索結果ページかどうかを判定する関数です。

is_home()$query->is_home()

現在のページが投稿ページか、検索結果ページか、あるいは固定ページかなどを判定するための関数は、WP_Queryクラスで定義されています。上記の$queryや、グローバル変数の$wp_queryはいずれもWP_Queryクラスのインスタンスですので、$query->is_home()$wp_query->is_single()などと書くことができます。

各テンプレートで使用する条件分岐タグ、is_home()is_single()は、中で$wp_query->is_home()$wp_query->is_single()を呼んでいるだけです。ここで定義を確認することができます。