記事の並び順をカスタムフィールドのメタ値で指定する方法

記事の並び順をカスタムフィールドのメタ値で指定する方法です。

プラグインを使わなくても、メタ値の数字で記事を自在に並べ替えることができるので、小説カテゴリーのように、読む順番が固定されているシリーズものに最適です。

カスタムフィールドの名前と数値

まずカスタムフィールドの「名前」を決めて、「値」に数字を記入します。

名前は覚えやすいものでOK。

この場合、story とします。

数字は、並べたい順番に1から記入して下さい。画像は58番目の記事です。

カスタムフィールド 記事の並び順

並び順の実例は、当サイトの小説カテゴリーで確認して下さい。

https://novella.blog/novel/

各記事の公開日時や更新日はまちまちですが、カスタムフィールドの数値でストーリー順に整列しています。

途中で新規投稿を差し込むこともできます(記事後方を参照)

functions.phpの記述

functions.phpに次のように記入します。

カスタムフィールドのメタキーに story 、値(value)に数値が設定されている場合、カテゴリー・アーカイブの並び順は数字の昇順(ASD)になります。

以下は、カテゴリー novel について設定した場合。複数のカテゴリーを指定する場合は、’novel’,’post’,’movie’ のように併記します。

is_category() については 『is_categoryとin_categoryの違いや使い方、条件分岐、複数指定、子孫カテゴリがある場合などなど』(外部リンク)をご参照下さい。

// 特定のカテゴリー内の記事の並び順
function order_category_archives( $query ) {
  if ( is_category('novel') && $query->is_main_query() ){
    $query->set('order', 'ASC');
    $query->set('meta_key', 'story');
    $query->set('orderby', 'meta_value_num');
  }
}
add_action( 'pre_get_posts', 'order_category_archives' );

Queryの内容は、関数リファレンス/WP Queryを参考にアレンジして下さい。date、 ID、 modified など、いろいろ応用できます。

異なる条件で、ルールを追加する場合は、function my_orderby_meta の名称を、function my_orderby_date など、異なる名称に変更すればOK。

下記のコードは、カスタム投稿タイプ book について、管理パネルの記事の並びをカスタムフィールドの数値に準じる場合。

//管理画面の記事の並び順
function sort_novel_archive_loop($query) { 
    if ($query->is_post_type_archive('book') && $query->is_main_query()) {
    $query->set('order', 'ASC');
    $query->set('meta_key', 'story');
    $query->set('orderby', 'meta_value_num');
    }
}
add_action('pre_get_posts', 'sort_novel_archive_loop');

実例。一番右端のカラムに表示されている数値がカスタムフィールドの値です。

カスタムフィールドを使った記事の並び順 実例

下記のコードは、通常の投稿 post とカスタムポスト diary について、更新日順に並べるものです。

//更新日順に並べる
function my_orderby_modified( $query ) {
	if( $query->is_main_query() ) {
		if( $query->is_home() || $query->is_category() || $query->is_admin()) {
			$query->set( 'orderby', 'modified' );
			$query->set( 'post_type', array( 'post','diary' ) );
		}
	}
}
add_action( 'pre_get_posts', 'my_orderby_modified' );

下記のコードは、カスタム投稿タイプ book のみ、管理画面の記事の表示を更新日順にします。

function set_post_types_admin_order($wp_query){
	if(is_admin()){
		$post_type = $wp_query->query['post_type'];
		if($post_type == 'book'){
			$wp_query->set('orderby','modified');
			$wp_query->set('order','DESC');
		}
	}
}
add_filter('pre_get_posts', 'set_post_types_admin_order');

なお、並び替えのルールを適用した場合、目的のカテゴリーは思い通りに表示できても、その他のカテゴリーや別のカスタム投稿タイプでアーカイブ・リストや管理画面のタイトルリストが正常に表示されない不具合が生じることがあります。

特に、複数のカスタムポストやカテゴリーにまたがって、いくつもルールを設けた場合、どれか一つが災いすることもあります。

ルールを設定したら、必ず全体をチェックして、全てのカテゴリー・アーカイブ、タグ・アーカイブ、管理画面のタイトルリストが正常に表示されるか、確認して下さい。

正常に表示されなくなった場合は、コードの書き方(wp_queryの設定)を変えたり、別のルールを削除するなどして調整して下さい。

記事を追加したい場合の数値の書き方

メタキーの値(value)を、1 2 3 … と数字で並べても、途中で構成が変わって、2 と 3 の間に、新規の投稿を挿入したい場合がありますね。

かといって、他の投稿の値まで全部書き直すのは大変な手間です。

そんな時は、2-2 2-3 と、数字を追加しましょう。

Valueの数値の操作

これで、2 と 3 の間に、2-2、2-3 と新規の投稿を挿入することができます。

2.1 2.2 2.3  

もしくは

2,1, 2,2 2,3

と増やしてもOK。

どれが一番いいかは、自身の環境に合わせてチョイスして下さい。

あるいは、1 2 3 ではなく、10 20 30 と設定して、後から新規の投稿を 11 12 13 といった形で挿入できるようにカスタマイズしてもいいですね。

いずれにせよ、ある程度、内容が固定したシリーズ向けのテクニックなので、アクティブなサイトやカテゴリーには向きません。

万一、数字の入れ方に失敗して、データベースから一括削除したい場合は、phpMyadminのSQLで次のクエリを実行します。

この場合、meta_key = ‘story’; と記述すれば、数値ごと一括削除できます。

DELETE FROM wp_postmeta WHERE meta_key = 'YourMetaKey';


こちらの記事も参考にどうぞ

[custom-related-posts title=”” order_by=”ID” order=”ASC”]

Morgenrood 曙光

Kindleストア

宇宙文明の根幹を成すレアメタルをめぐる企業の攻防と人間の生き様を描いた本格的な海洋ロマン。専門用語は使わず、予備知識のない人でも分かりやすい内容に仕上がっています。無料PDFも配布中。Kindle Unlimited 読み放題の分冊もリリース開始。

この記事を書いた人

石田 朋子

文芸愛好家&サブカルチャー・ファン。主に70年代~90年代の作品に思い入れがあります。寺山修司の名言『詩を作るより、田を作れ(揶揄)』をモットーに、好きな作品を次代に伝えることを目標にしています。海外在住につき、現代日本とは相容れない所がありますがご容赦ください。趣味はドライブと登山。