【WordPress】管理画面のカスタム投稿に並び順のドロップダウンを追加する方法

【WordPress】管理画面のカスタム投稿に並び順のドロップダウンを追加する方法 WordPress

WordPressの管理画面でカスタム投稿タイプを利用していると、投稿の並び順を自由に切り替えたいケースがあります。この記事では、管理画面の投稿一覧に「並び順」ドロップダウンを追加し、選択に応じて投稿を並べ替える方法を紹介します。

スポンサーリンク

並び順セレクトを管理画面に追加する

以下のコードをfunctions.phpに追加することで、投稿一覧の上部に並び替え用のセレクトボックスを追加できます。

functions.php:並び順ドロップダウンの追加
// ドロップダウンメニューの追加
function add_custom_orderby_dropdown() {
  global $typenow;
  if ($typenow === 'your_post_type') {
    $orderby = isset($_GET['orderby_custom']) ? $_GET['orderby_custom'] : '';
    echo '&nbsp;<select name="orderby_custom">';
    echo '<option value="">並び順を選択</option>';
    echo '<option value="title"' . selected($orderby, 'title', false) . '>タイトル順</option>';
    echo '<option value="menu_order"' . selected($orderby, 'menu_order', false) . '>メニュー順</option>';
    echo '<option value="date"' . selected($orderby, 'date', false) . '>公開日順</option>';
    echo '<option value="priority"' . selected($orderby, 'priority', false) . '>優先度順</option>';
    echo '</select>';
  }
}
add_action('restrict_manage_posts', 'add_custom_orderby_dropdown');

※your_post_typeの部分は実際のカスタム投稿タイプ名に置き換えてください。

並び替え条件に応じたクエリ変更処理

選択された並び順に応じて、クエリのorderbyを変更する必要があります。以下のようにフックで制御します。

functions.php:ホワイトリスト検証付きのクエリ変更
// クエリを並び順に応じて変更
function custom_orderby_query($query) {
  if (!is_admin() || !$query->is_main_query()) {
    return;
  }

  global $pagenow;
  if ($pagenow === 'edit.php' && isset($_GET['post_type']) && $_GET['post_type'] === 'your_post_type') {
    // 許可された値のみを受け付けるホワイトリスト検証
    $allowed_orderby = array('title', 'menu_order', 'date', 'priority');
    $orderby = isset($_GET['orderby_custom']) ? sanitize_text_field($_GET['orderby_custom']) : '';

    if (in_array($orderby, $allowed_orderby, true)) {
      if ($orderby === 'priority') {
        // カスタムフィールド「priority」で並び替える場合
        $query->set('meta_key', 'priority');
        $query->set('orderby', 'meta_value_num');
      } else {
        $query->set('orderby', $orderby);
      }
      $query->set('order', 'ASC'); // または DESC に変更可能
    }
  }
}
add_action('pre_get_posts', 'custom_orderby_query');
$_GETの値は必ずホワイトリストで検証する
ドロップダウンは決まった選択肢しか表示していませんが、URLのorderby_customパラメーターは訪問者が自由に書き換えられます。検証なしに$query->set('orderby', $_GET['orderby_custom'])のように渡すと、想定外の値がそのままクエリに渡ってしまいます。ORDER・ORDER BYパラメーターはWordPressプラグインで見落とされがちなインジェクションポイントとしてセキュリティ研究でも指摘されており、in_array()による厳密なホワイトリスト検証を必ず行いましょう。

よくある質問(FAQ)

Q管理画面の記事一覧にカスタムソートのドロップダウンを追加するには?
Arestrict_manage_postsアクションでselectを出力し、pre_get_postsで選択値に応じてorderby・order・meta_key等を設定します。$_GETの値はin_array()によるホワイトリスト検証を必ず行ってください。
Q日付・タイトル・カスタムフィールドを切り替えるソートUIの実装は?
Aセレクトボックスのoptionにsort_by=date・title・meta_valueなどの値を設定し、PHPで$_GET[‘sort_by’]をsanitize_text_field()で取得したうえで、許可された値のリストと照合してからWP_Queryのorderbyに設定します。
Qソート設定をユーザーごとに記憶させるには?
Aセレクト変更時にAjaxでupdate_user_meta()に保存し、ページロード時にget_user_meta()から初期値を取得します。または単純にGETパラメーターのデフォルト値として使う方法もあります。

まとめ

管理画面の投稿一覧に並び順セレクトボックスを追加すれば、カスタム投稿の運用効率が大幅に向上します。タイトル順やカスタムフィールド順など、必要な軸に応じて柔軟に拡張可能です。ドロップダウンで提供する選択肢と、サーバー側で許可する値は必ず一致させ、ホワイトリスト検証を徹底しましょう。業務用途でWordPressを利用する場合には、ぜひ取り入れておきたい機能の一つです。