投稿の並び順を変更する方法
WordPressの並び順を変える方法はいくつかあります。
まず、簡単なのは、プラグインを利用する方法。
そして、直接並び順を、プログラム記述する方法。一部の投稿並び替えプラグインを、さらに独自でカスタマイズも出来ます。
投稿の並び順をプラグインを使わずにプログラムで変更する
子テーマのファイル中にある、funciton.phpに以下を記述します。
並び替えはソートともいいます。
orderで昇順か降順かを指定する。
ASC : 昇順
DESC :降順
orderbyでソート順を何で並べ替えるかを指定
none | 順序なし |
---|---|
ID(大文字) | 投稿ID順 |
author | 作成者順 |
title | タイトル順 |
date | 日付順 |
modified | 更新日順 |
parent | 親ページID順 |
rand | ランダム順 |
comment_count | コメント数順 |
add_actionをつかった並び替え
子テーマの中の、funciton.phpに並び順を記述します。
add_actionで、メインクエリ作成前に、 sort_postdata(任意の関数名) を実行するように設定します。class-wp-query.php の get_posts 関数の先頭付近で実行されます。
//記事の表示順変更
function sortpost($query) {
if(is_admin() || !$query->is_main_query()){
return;
}
//ASC:昇順、DESC:降順
$query->set('order', 'DESC');
//orderbyで何順に並べ替えるか指定
$query->set('orderby', 'modified');
}
add_action('pre_get_posts', 'sortpost');
テーマによって並び替えが出来ない理由。
以下は、テーマで使われている並び替えの例です。
//テーマ側でpre_get_postsフックでorderbyを指定している例
function po_pre_get_posts( $query ) {
$options = get_design_plus_option();
// Modify post order of faq and clinic
if ( is_admin() ) return;
if ( $query->is_post_type_archive( 'service' ) || $query->is_post_type_archive( 'faq' )) {
// Change post order by menu_order and date
$query->set( 'orderby', array( 'menu_order' => 'ASC', 'date' => 'DESC' ) );
// Display all posts in archive pages
if ( $query->is_main_query() ) {
// Change posts number to display
$query->set( 'posts_per_page', -1 );
}
}
}
add_action( 'pre_get_posts', 'po_pre_get_posts' );
この場合、既にadd_action(‘pre_get_posts’, 任意の関数名)が利用されています。テーマによってはadd_actionで変更できまないことがあります。
プラグイン「Intuitive Custom Post Order」
3.14バージョンに、不具合がありました。
※2023年2月にセキュリティ面が更新された3.14バージョンがリリースされまいたが、並び替えができなくなる不具合がでているので、次の更新バージョンがでるまで3.14への更新は控えたほうがおすすめです。3.13バージョンは並び替えは問題ありません。
代表的なプラグインは「Intuitive Custom Post Order」。
最新のWordPressにも互換性があるプラグインです。ただし、更新が数年前で、WordPressの最新でのテストが認証されていないため、表示ができなくなる可能性はあります。ただ、とても便利なのでこちらを使ってもいいと思います。このプラグインがやっっていることは、jsでListの順番を並び替えて、並び順をDBに登録しているだけなので、jsを書けば、自分でも実装出来る内容です。プラグインを無効化しても、DBに並び順が残るので呼び出すことができます。
実装は、とても簡単です。「設定」の「並び順」から画面を表示されたら、並び替えたい表示先のページ名にチェックをいれるだけです。
WordPressの投稿一覧の並び順は「テーマ」依存
WordPressの、投稿一覧は、テーマによる投稿並び順が優先されます。紹介したプラグインの「Intuitive Custom Post Order」を有効化して設定しても、DBに登録はできても、投稿表示の際には、並び順がかわらないテーマがあります。テーマの複雑なフィルターフックを調べるよりは、一覧表示部分をPHPでプログラム記述して定義するほうが手っ取り早いです。
Intuitive Custom Post Orderをカスタマイズして使う。
Intuitive Custom Post Orderで、DBに登録された値は “menu_order”で設定することができます。
menu_order | Intuitive Custom Post Orderをつかった場合 |
---|
「Intuitive Custom Post Order」の説明に以下のようにあります。
説明
WordPressの設定メニューの「直感的なCPO」メニューからソート可能な項目を選択します。
直感的に、ドラッグ アンド ドロップで並べ替え可能な JavaScript を使用して、アイテム (投稿、ページ、カスタム投稿タイプ、カスタム分類法、サイト) を並べ替えます。
テーマでパラメーター ( orderby = menu_order, order = ASC ) を使用します。自動変換されたパラメーター ( orderby および order ) をオーバーライドすることもできます。
注意: ‘get_posts()’ を使用してデフォルトの順序 ( orderby = date, order = DESC ) に再上書きする場合のみ、独自のカスタム パラメータ ‘orderby = default_date’ を使用する必要があります。このプラグインはGitHub で公開されています。
https://wordpress.org/plugins/intuitive-custom-post-order/
テーマで優先された投稿一覧の並び順を変更する方法
WP_Queryで表示順をカスタマイズする方法
new WP_Query()で新たな並び順を、独自で設定しています。
new WP_Queryは、最後に wp_reset_postdata() 関数を必ず実行するようにしましょう。
//---------------------
//独自の投稿並び順
//---------------------
$args = array(
'orderby' => 'tile',//タイトル順
'order' => 'desc'//降順
);
$the_query = new WP_Query($args);
//------------
//表示
//------------
while ( $the_query->have_posts() ) {
$the_query->the_post();
the_title();
the_content();
}
wp_cache_init();//キャッシュクリア
wp_reset_postdata(); wp_reset_query();//postクリア、queryリセット
上のプログラムだと、絞り込み条件がないので投稿記事をタイトル順に全部取得します。実際に使う場合は、カテゴリIDを指定して、以下のように使います。
子テーマの中に、カテゴリページ(categpry.php)を独自で作ります。HTMLをシンプルにすると以下のようなプログラムになります。
<?php
$cat = get_the_category();//カテゴリデータ配列を取得
$cat_ID = $cat[0]->cat_ID;//カテゴリIDを取得
$category_count = $cat[0]->category_count;//カテゴリの投稿数
//---------------------
//独自の投稿並び順
//---------------------
$args = array(
//'category_name' =>”カテゴリのスタッグ”,
'category__in' => $cat_ID,
//'orderby' => 'tile',//タイトル順
'orderby' => "menu_order", //Intuitive Custom Post Order:プラグインの並び順
'order' => 'desc'//降順
);
$the_query = new WP_Query($args);
if( $the_query->have_posts() ):
while($the_query->have_posts() ): $the_query->the_post();
?>
<!-- 一覧表示 HTML -->
<a href="<?php echo esc_url(get_the_permalink()); ?>" alt="<?php the_title(); ?>" >
<?php
//サムネ(アイキャッチ)画像
if(has_post_thumbnail()): ?>
<img src="<?php the_post_thumbnail_url(); ?>" alt="<?php get_the_title(); ?>">
<?php
endif;//------
?>
<h2><?php the_title(); ?></h2>
</a>
<?php
endwhile;
endif;
wp_cache_init();//キャッシュクリア
wp_reset_postdata(); wp_reset_query();//postdataクリア、queryリセット
//end--------------
?>
こうすることによって、add_action(‘pre_get_posts’, 任意の関数名)を使わずに、並び順を自由にカスタマイズすることができます・
サイドのウィジェット・カテゴリの並び替え
add_filterをつかった並び替え
同じ要領で、ウィジェットの「カテゴリ」の表示順の並び替えができます。
//カテゴリーを投稿数順に変更する
function categories_order($cat_args) {
$cat_args['orderby'] = 'count';
$cat_args['order'] = 'DESC';
return $cat_args;
}
add_filter('widget_categories_args', 'categories_order', 10);