WordPressの管理画面の投稿一覧をカスタムフィールドの値でソートする

NO IMAGE

WordPressの管理画面で投稿一覧を表示するときにタイトルや日付でソートすることができます。
しかし、自分自身で追加したカスタムフィールドの値などではソートをすることができません。
そこで今回はカスタムフィールドの値でソートをする方法を書きました。

コード

/**
 * オリジナルのカラムを登録する
 */
function my_add_columns($columns) {
    $ordered_columns = [];
    foreach($columns as $key => $value) {
        if ($value === '日付') { // 日付の前に出力するということ
            $ordered_columns['column_name'] = 'カラムの名前'; // key['column_name']は任意の文字列
        }
        $ordered_columns[$key] = $value;
    }
    return $ordered_columns;
}
add_filter( 'manage_edit-xxx_columns', 'my_add_columns' ); // xxxには投稿タイプ名を入れる

/**
 * オリジナルのカラムに値を出力する
 */
function my_add_columns_content($column_name, $post_id) {
    if( $column_name == 'column_name' ) { // 先ほど設定したkey
        $something_id = get_field('something_id', $post_id); // ACF等で表示したいものの値をとってくる
        if($something_id) {
            $stitle = get_the_title($something_id);
        }
    }

    if ( isset($stitle) && $stitle ) {
        echo esc_attr($stitle); // 値が入っていれば出力
    }
}
add_action( 'manage_xxx_posts_custom_column', 'my_add_columns_content', 10, 2 ); // xxxには投稿タイプ名を入れる

/**
 * オリジナルのカラムにソートボタンをつける
 */
function sortable_column( $columns ) {
  $columns['column_name'] = 'sort_name'; // 
  return $columns;
}
add_filter( 'manage_edit-xxx_sortable_columns', 'sortable_column' );  // xxxには投稿タイプ名を入れる

/**
 * ソート時にクエリを書き換える
 */
function my_add_sort_by_meta( $query ) {
  if ( $query->is_main_query() && ( $orderby = $query->get( 'orderby' ) ) ) {
    switch( $orderby ) {
      case 'sort_name': // 上記で設定した値
        $query->set( 'meta_key', 'sort_meta' ); // ソートしたいフィールド名
        $query->set( 'orderby', 'meta_value_num' );
        break;
    }
  }
}
add_action( 'pre_get_posts', 'my_add_sort_by_meta', 1 ); // 一覧で表示するpost取得前にqueryを書き換える

参考サイト

【WordPress】管理画面で、タクソノミーやカスタムフィールドの列を追加する(ソート機能付き) – 東京のホームページ制作 / WEB制作会社 BRISK