2026年5月28日
2026年5月28日
WordPressのPost Types Orderでカスタム投稿タイプの並び順を制御する方法
カスタム投稿タイプの表示順を手作業で決めたいなら、Post Types Order プラグインで管理画面からドラッグして並べ、フロント側では menu_order の昇順で表示するのが基本の形です。この記事では、プラグインが並び順をどこに保存しているのか、設定のポイント、自動並べ替えを使う場合と使わない場合のクエリの書き方、意図した順にならないときの確認手順を説明します。
並び順は wp_posts の menu_order に入る
WordPress の投稿には、もともと menu_order という整数の列があります。固定ページの「順序」欄で入力している値がこれです。Post Types Order は、管理画面でドラッグした順番をこの menu_order に書き込みます。独自のテーブルや特殊な形式を使うわけではないので、プラグインを止めても値は投稿に残り、WP_Query で 'orderby' => 'menu_order' を指定すれば同じ順で取り出せます。
この仕組みを理解しておくと、プラグインに頼る範囲と、テーマ側のコードで責任を持つ範囲を分けて考えられます。並び替えの操作はプラグイン、表示の順番はクエリ、と分けるのが運用しやすい形です。
導入と基本設定
Post Types Order は WordPress.org で配布されている無料プラグインで、開発元から機能を増やした有料版も提供されています。設定画面の項目名や配置はバージョンによって変わることがあるため、ここでは目的ごとに説明します(2026年10月現在)。
- プラグインを有効化すると、設定メニューの中にプラグインの設定ページが追加されます
- 設定ページで、並べ替えの画面を表示する投稿タイプを選びます。対象にした投稿タイプのメニューには、並べ替え用のサブメニューが追加されます
- 並べ替え画面で投稿をドラッグし、更新ボタンで保存します。投稿一覧の画面で直接ドラッグできる設定もあります
並べ替えを保存すると、対象の投稿の menu_order がまとめて書き換わります。件数が多い投稿タイプで初めて保存する前には、データベースのバックアップを取っておくと、意図しない順番になったときに戻せます。
なお、タクソノミーのタームの並べ替えは別の機能です。同じ開発元が Category Order and Taxonomy Terms Order という別プラグインを出しています。
自動並べ替え(Auto Sort)をどうするか
設定には、フロント側のクエリに自動で menu_order 順を適用するオプション(Auto Sort)があります。ここが最も影響の大きい判断です。
自動並べ替えを有効にすると、テーマのコードを変えなくても対象の投稿タイプが手動の並び順で表示されます。その反面、新着順で出したいウィジェットや、価格順で並べたい一覧のように、別の順番を指定しているクエリまで上書きされることがあります。プラグインのドキュメントでは、特定のクエリだけ自動並べ替えを外す引数やフィルターが案内されていますが、名前や挙動はバージョンで変わる可能性があるため、使う前に現在のドキュメントで確認してください。
テーマを自分で管理しているなら、自動並べ替えは無効にして、必要なクエリにだけ並び順を書くほうが挙動を追いやすくなります。
クエリで並び順を指定する
独自のループで使う
スタッフ一覧のように特定のページで呼び出す場合は、WP_Query に直接指定します。
<?php
$staff = new WP_Query( array(
'post_type' => 'staff',
'posts_per_page' => 50,
'orderby' => array(
'menu_order' => 'ASC',
'title' => 'ASC',
),
'no_found_rows' => true,
) );
if ( $staff->have_posts() ) {
echo '<ul class="staff-list">';
while ( $staff->have_posts() ) {
$staff->the_post();
echo '<li><a href="' . esc_url( get_permalink() ) . '">' . esc_html( get_the_title() ) . '</a></li>';
}
echo '</ul>';
wp_reset_postdata();
}
orderby を配列にすると、menu_order が同じ値の投稿どうしを第2条件で並べられます。並べ替えを一度もしていない投稿は menu_order が 0 のままなので、第2条件を決めておくと表示が安定します。
アーカイブページで使う
投稿タイプのアーカイブ(/staff/ など)はメインクエリで表示されるため、pre_get_posts で並び順を変えます。子テーマの functions.php かサイト専用プラグインに書きます。
<?php
add_action( 'pre_get_posts', function ( $query ) {
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
if ( $query->is_post_type_archive( 'staff' ) ) {
$query->set( 'orderby', array(
'menu_order' => 'ASC',
'title' => 'ASC',
) );
}
} );
is_admin() と is_main_query() の条件を外すと、管理画面やウィジェットのクエリまで変わってしまうので残しておきます。
編集画面で順序を直接入力したい場合
投稿タイプを登録するときに supports に page-attributes を含めると、編集画面に「順序」の入力欄が表示され、ドラッグせずに数値で指定できます。
<?php
register_post_type( 'staff', array(
'label' => 'スタッフ',
'public' => true,
'has_archive' => true,
'show_in_rest' => true,
'supports' => array( 'title', 'editor', 'thumbnail', 'page-attributes' ),
) );
register_post_type() は init フックの中で呼びます。
並び順が反映されないときの確認手順
意図した順にならない場合は、可能性の高いものから順に確認します。
- 値が保存されているか: WP-CLI で
wp post list --post_type=staff --fields=ID,post_title,menu_order --orderby=menu_order --order=ascを実行し、menu_orderに期待した数値が入っているかを見ます。すべて 0 なら、並べ替えが保存されていません - クエリに並び順が指定されているか: 自動並べ替えを無効にしている場合、テーマのクエリが日付順のままだと反映されません。該当するテンプレートの
WP_Queryやpre_get_postsを確認します - 別のプラグインやテーマが上書きしていないか: 並び替え系のプラグインを複数入れている、テーマに独自の並び順設定がある、といった場合は後から実行された設定が優先されます。ステージングで他のプラグインを一時的に止めて切り分けます
- キャッシュ: ページキャッシュやオブジェクトキャッシュが古い一覧を返していることがあります。キャッシュを消してから確認します
ブロックエディターのクエリループブロックは、画面上で選べる並び順に menu_order が含まれていないことがあります。手動の並び順で出したい一覧は、自動並べ替えに任せるか、独自のブロックやショートコードで WP_Query を書く方法を検討します。
前後の記事リンクとの関係
previous_post_link() や next_post_link() は、標準では投稿日をもとに前後を決めます。並び順を menu_order にしても、記事下の「前へ・次へ」は日付順のままになることがあります。プラグインにはこの前後リンクにも並び順を適用する設定がありますが、項目の有無はバージョンで変わるため、設定ページで確認してください。
まとめ
- Post Types Order はドラッグした順番を投稿の
menu_orderに保存する。プラグインを止めても値は残る - 自動並べ替えは手軽だが、別の順番を指定したいクエリまで上書きしうる。テーマを管理しているなら無効にしてクエリで指定する方法が追いやすい
- 独自ループは
WP_Queryのorderby、アーカイブはpre_get_postsでmenu_order順を指定し、第2条件も決めておく - 反映されないときは、保存値、クエリ、競合、キャッシュの順に確認する
- 大量の並べ替えを保存する前にはバックアップを取る