page-attributesをサポートしてるカスタム投稿タイプの管理画面での表示順をmenu_order順にする。

カスタム投稿タイプで、page-attributes を設定すると右側のサイドバーに順序ってのが出てきてくれます。

スクリーンショット_2013_03_01_5_02

 

page-attributes を有効化するには以下の様な感じです。

 

$args = array(
    'label' => __('My Post Type', 'textdomain'),
    ...
    'supports' => array(
        ...
        'page-attributes', // 表示順のボックスを表示
    )
);
register_post_type('my_post_type', $args);

 

ところが、表示順のところに数字を入れても管理画面での表示順は、投稿順になってしまいます。

スクリーンショット_2013_03_01_5_12

 

対処方法

管理画面上での表示順を、期待通りに「表示順」で指定した数字で並び替える(menu_order 順にする)には、以下のように記述すればオッケーです。

add_action('pre_get_posts', 'my_pre_get_posts');

function my_pre_get_posts($wp_query) {
    if (isset($_GET['post_type']) && ($_GET['post_type'] === 'my_post_type')) {
        if (!isset($wp_query->query_vars['orderby'])) {
            $wp_query->query_vars['orderby'] = 'menu_order';
        }
        if (!isset($wp_query->query_vars['order'])) {
            $wp_query->query_vars['order'] = 'ASC';
        }
    }       
}

2013_03_01_5_19

 

 

と、ここまで書いてから色々ググってみたら、黄色いおじさんがすでに書いてました。

順序をサポートしたカスタム投稿タイプのデフォルト表示順を変更してみる | Simple Colors

黄色いおじさんが書いてる方法は、僕の方法よりも汎用的なやりかたですが、キモの部分は同じです。

(この記事をみるまで、!isset($wp_query->query_vars['orderby']) の条件分岐の必要性には気づいておりませんでしたが。笑)

やっぱ、おじさんはさすがですね。おじさんエライ!おじさん黄色い!