ワードプレスのテーマ作成したりしているときにこんな事思ったことありませんか?
投稿記事の表示順を変更したい!
特にカテゴリ一覧や日別の一覧を表示するときは複数のページが表示されます。このとき、基本的にページは「投稿日時に対して降順」に並べて表示されます。「基本的に」と書いたのは、この並び順は変更することが可能だからです。
このページでは、この投稿記事の表示順を変更する方法について解説します。
解説の中でクエリという言葉が出てきます。クエリについての知識が曖昧な方はまず下のページを読んでいただければ、このページへの理解がさらに深まります。
ワードプレスのクエリとは?メインクエリとサブクエリの違いは?Contents
投稿日時が新しい順に表示される理由
最初に結論を言うと、投稿日時が新しい順に表示される理由は、メインクエリで投稿データ取得順が投稿日時の新しい順に設定されているからです。
メインクエリの投稿データ取得順は投稿日時の新しい順
メインクエリとはページ表示に必要な投稿データの要求です。このメインクエリを発行することで、ページ表示に必要な投稿データ(記事の本文やタイトルなど)がデータベースから取得されます。
ワードプレスでは、デフォルト設定であれば、このメインクエリの投稿データ取得順として「投稿日時の新しい順」が設定されています。そのためメインクエリを発行することで複数の投稿データを取得する場合、投稿日時の新しい投稿から順に取得されます。
スポンサーリンク
the_post 関数はクエリ発行で取得された順に投稿データを取得
一方、テーマ内で記事データを取得するために使用する the_post 関数はクエリ発行で取得された順に投稿データを取得する関数です。
前述の通り、メインクエリでは投稿データは投稿日時の新しい順に取得されます。ですので、例えばテーマ内の category.php などで the_post 関数を使うと、投稿日時の新しい順に記事の投稿データが取得されることになります。
表示順序変更方法
ここまでが「ワードプレスで投稿記事の表示順が投稿日時の新しい順になっている理由」です。
続いては表示順序を変更する方法を解説していきます。このページでは2つの方法を紹介します。
メインクエリの条件設定を変更
1つ目は「メインクエリの条件設定を変更」する方法です。この方法ではメインクエリ作成前にメインクエリに設定する取得順序を変更します。その後はいつも通りワードプレスがメインクエリの作成 / 発行が行われますが、メインクエリ作成前に投稿データの取得順序が変更されていますので、クエリ発行により取得される投稿データの順番も変わることになります。
やり方も実に簡単で、テーマフォルダ内の functions.php に下記を追記すれば良いだけです。
<?php
function sort_postdata( $query ) {
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
$query->set( 'order', 'ASC' );
$query->set( 'orderby', 'modified' );
}
add_action( 'pre_get_posts', 'sort_postdata' );
?>
ポイントは3つです。
1つ目は下記の部分です。
add_action( 'pre_get_posts', 'sort_postdata' );
これはメインクエリ作成前に、 sort_postdata 関数を実行するように設定する処理です。
具体的には class-wp-query.php の get_posts 関数の先頭付近で実行されます
do_action_ref_array( 'pre_get_posts', array( &$this ) );
この add_action によりメインクエリ作成前に sort_postdata 関数が実行されるようになります。ですので、sort_posetdata 関数に投稿データを取得する順序を設定する処理を書いておけば、メインクエリ作成前に投稿データの取得順序を設定することが可能です。
結果的にメインクエリはこの設定に基づいて、つまりあなたが設定した順序に基づいて作成されますので、投稿データも設定した順序に基づいて取得されることになります。
その順序を設定しているのが下記の部分になります。ここがポイントの2つ目です。
$query->set( 'order', 'ASC' );
$query->set( 'orderby', 'modified' );
$query->set(‘order’, ‘XXX’); により投稿データの並び順を昇順・降順を切り替えることが可能です。XXX に ASC と記載すれば投稿データが昇順に、DESC と記載すれば降順に並ぶようにクエリが作成されます。
何に対して昇順 or 降順に並び替えるかを設定するのが $query->set(‘orderby’, ‘YYY’); です。これにより YYY に設定した項目に対して $query->set(‘order’, ‘XXX’); で設定した昇順 or 降順の順に投稿データが取得されていくことになります。例えば上記の例だと modified を指定しているので、更新日時に対して昇順、つまり更新日時が古いものから順に投稿データが取得されることになります。
orderby には下記のようなものが指定可能です。
パラメータ | ソートする項目 |
ID | 投稿 ID |
author | 著者 |
title | タイトル |
name | スラッグ |
type | 投稿タイプ |
date | 投稿日時 |
modified | 更新日時 |
parent | 親ページの ID |
rand | ランダム |
comment_count | コメント数 |
3つ目のポイントは下記の部分です。
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
これにより、管理ページ表示時やメインクエリ以外のクエリ作成時以外の時に順序変更設定が反映されないようにしています。
同様に is_single 関数、 is_category 関数などを使えば、表示しようとしているページの種類に応じて投稿データの格納順を変更するかどうかを切り替えることができます。
例えば関数を以下のように記述すれば投稿ページ以外の時はデータ取得順が変更されないことになります。
function sort_postdata( $query ) {
if ( ! is_single() || is_admin() || ! $query->is_main_query() ) {
return;
}
$query->set( 'order', 'ASC' );
$query->set( 'orderby', 'modified' );
}
以上により、メインクエリ作成前にメインクエリで要求する順序が変更されるため、投稿データが取得される順序も変更されることになります。
ですので、いつも通り下記のような have_posts – the_post のループ(メインループ)を行えば、変更後の順序で投稿データが取得されます。
while ( have_posts() ) {
the_post();
the_title();
the_content();
}
したがって、表示される投稿記事の順序も変更されることになります。
スポンサーリンク
順序変更を行ったサブクエリを作成
2つ目は「順序を変更を行ったサブクエリを作成する方法」です。新たに順序を設定したクエリーを作成して発行し、新たな投稿データを取得する方法ですね。
順序を変更したサブクエリの作成 / 発行は下記により行うことができます。
$args = array(
'order' => 'ASC',
'orderby' => 'modified',
);
$sub_query = new WP_Query( $args );
new WP_Query($args); により、$args の設定に基づいて新たなクエリを作成とそのクエリの発行を行っています(ちなみにメインクエリ以外のクエリをサブクエリと呼びます)。ですので $args に対して順序を変更する設定を格納しておけば、クエリ発行による投稿データの取得順を変更することが可能です。
下記は順序を昇順にするか降順にするかの設定になり、
'order' => 'ASC',
下記はどの項目に対して順序を変更するかの設定になります。
'orderby' => 'modified',
投稿データの格納順序を変更した新たなクエリが作成されますので、そのクエリを発行することで投稿データの取得順することができます。この作成したクエリに対して have_posts – the_post ループ(サブクエリに対するループなのでサブループと呼びます)を用いて投稿データを取得していくことで、表示する投稿データの順序も変更することが可能です。
while ( $sub_query->have_posts() ) {
$sub_query->the_post();
the_title();
the_content();
}
wp_reset_postdata();
the_title 関数や the_content 関数は、クエリに対してではなく取得した投稿データに対して行う関数ですので、$sub_query-> を関数の前に付加する必要はありません。
また $sub_query を使用し終わった後は、wp_reset_postdata 関数を必ず実行するようにしましょう。
2つの順序変更方法のメリット・デメリット
方法を2つ紹介しましたが、どっちを使えば良いのか判断は個人によると思います。ここではそれぞれのメリット・デメリットを紹介しますので、どっちを使うかの判断に参考していただければと思います。
「メインクエリの条件設定を変更」のメリット
新たにクエリを作成する必要がないため処理負荷は低いです。なのでページ表示速度を重視するのであればこの方法が良いと思います。
「メインクエリの条件設定を変更」のデメリット
影響範囲が大きいことがデメリットです。メインクエリを使用している箇所全体に影響があります。
「順序変更を行ったサブクエリを作成」のメリット
影響範囲が局所的なことです。サブクエリを使用する部分にしか影響がなく、他の部分に影響を及ぼすことがないので、比較的安心して使用できる方法だと思います。
「順序変更を行ったサブクエリを作成」のデメリット
新たにサブクエリを作成する場合、再度データベースにアクセスしてクエリが作成されます。ですので、その分処理負荷が高いです。その分ページ表示が遅くなる可能性があります。
またサブクエリに与える設定(前述のプログラムだと $args)が若干複雑です。サブクエリに表示したいページの投稿データだけが格納されるように、$args に設定を記述する必要があります。
例えばカテゴリーページでそのカテゴリーの投稿の一覧を載せる場合は下記のようにソースコードを作成する必要があります。
$tmp_category_array = get_the_category();
$args = array(
'category_name' => $tmp_category_array[0]->category_nicename,
'order' => 'ASC',
);
$sub_query = new WP_Query( $args );
echo '<div id = "content">';
while ( $sub_query->have_posts() ) {
$sub_query->the_post();
echo '<h3>';
the_title();
echo '</h3>';
}
wp_reset_postdata();
ポイントは下記の部分です。
$tmp_category_array = get_the_category();
$args = array(
'category_name' => $tmp_category_array[0]->category_nicename,
'order' => 'ASC',
);
$sub_query = new WP_Query( $args );
category_name にカテゴリの “slug 名” を指定すれは、そのカテゴリの投稿データのみを取得することができます。しかし、これがないと他のカテゴリの投稿データも含めてクエリが作成されてしまうので、注意が必要です。
要は WP_Query 関数で自分の取得したい投稿データ取得できるように、WP_Query の引数となるデータ($args)をしっかり作成する必要があるということです。この点がちょっと面倒というか複雑ですね。
まとめ
このページでは投稿記事を表示する順番を変更する二つの方法を紹介しました。
一つ目はメインクエリの条件設定をする方法、二つ目は順序を変更したサブクエリを作成する方法です。
ウェブサイトやテーマを作り込んで行くと表示順を変更したくなる時も出てくると思います。そのときはぜひこのページを参考にして表示順序変更を試してみてください!