【WordPress】カスタム投稿タイプで管理画面一覧のカスタマイズ

Posted on カテゴリー: タグ:

WordPressでカスタイム投稿タイプを設定して管理者が使いやすくすることはよくあります。
ただデフォルトの状態だと記事一覧ページは「ページタイトル 列 」「日付 列 」ととてもシンプルです。
ここでは、列の追加やソート、絞り込みのカスタマイズを解説します。

列の名前を追加

// 列の追加
function my_add_columns($columns)
{
    $columns['my_column_name'] = '列名';

    // 日付を列の最後に移動
    $date = $columns['date'];
    unset($columns['date']);
    $columns['date'] = $date;

    return $columns;
}

add_filter('manage_edit-{カスタム投稿タイプ}_columns', 'my_add_columns');

「{カスタム投稿タイプ}」の部分はカスタム投稿タイプのスラッグを指定してください。

例)
add_filter( ‘manage_edit-blog_columns’, ‘my_add_columns’ );

列の内容を追加

アイキャッチを表示

// 列の内容を追加
function my_add_columns_content($column_name, $post_id)
{
    if ($column_name == 'my_column_name') {
        // アイキャッチを表示
        $stitle = get_the_post_thumbnail($post_id, 'thumbnail');
    }

    if (isset($stitle) && $stitle) {
        echo $stitle;
    }
}

add_action('manage_{カスタム投稿タイプ}_posts_custom_column', 'my_add_columns_content', 10, 2);

カスタムフィールドを表示

// 列の内容を追加
function my_add_columns_content($column_name, $post_id)
{
    if ($column_name == 'my_column_name') {
        // カスタムフィールドを表示
        $stitle = get_post_meta($post_id, '{カスタムフィールドのキー}', true);
    }

    if (isset($stitle) && $stitle) {
        echo esc_attr($stitle);
    }
}

add_action('manage_{カスタム投稿タイプ}_posts_custom_column', 'my_add_columns_content', 10, 2);

タームを表示

// 列の内容を追加
function my_add_columns_content($column_name, $post_id)
{
    if ($column_name == 'my_column_name') {
        // タームを表示
        $my_terms = get_the_terms($post_id, '{タクソノミーのスラッグ}');

        if ($my_terms && !is_wp_error($my_terms)) {
            $draught_links = array();
            foreach ($my_terms as $my_term) {
                $draught_links[] = $my_term->name;
            }
            $stitle = join(", ", $draught_links);
        }
    }

    if (isset($stitle) && $stitle) {
        echo esc_attr($stitle);
    }
}

add_action('manage_{カスタム投稿タイプ}_posts_custom_column', 'my_add_columns_content', 10, 2);

タームを表示させる場合は、記事と紐付いているタームを取得してから連結して出力する必要があります。

列のソート

ソートする列の指定

// ソートする列の指定
function my_add_sort($columns)
{
    $columns['my_column_name'] = 'ID';
    return $columns;
}

add_filter('manage_edit-{カスタム投稿タイプ}_sortable_columns', 'my_add_sort');

ソートのルールを指定

// ソートのルールを指定
function my_add_sort_by_meta($query)
{
    if ($query->is_main_query() && ($orderby = $query->get('orderby'))) {
        switch ($orderby) {
            case 'my_sort_name':
                $query->set('meta_key', '{カスタムフィールドのキー}');
                $query->set('orderby', 'meta_value_num');
                break;
        }
    }
}

add_action('pre_get_posts', 'my_add_sort_by_meta', 1);

タクソノミーでの絞り込みを追加

記事一覧上部の日付で絞り込むプルダウンの右側にタクソノミーで絞り込むプルダウンを追加します。

// タクソノミーでの絞り込みを追加
function my_add_filter()
{
    global $post_type;
    if ('{カスタム投稿タイプ}' == $post_type) {
        ?>
        <select name="{タクソノミー}">
            <option value="">タクソノミー指定なし</option>
            <?php
            $terms = get_terms('{タクソノミー}');
            foreach ($terms as $term) { ?>
                <option value="<?php echo $term->slug; ?>" <?php if ($_GET['{タクソノミー}'] == $term->slug) {
                    print 'selected';
                } ?>><?php echo $term->name; ?></option>
                <?php
            }
            ?>
        </select>
        <?php
    }
}

add_action('restrict_manage_posts', 'my_add_filter');

まとめ

列の追加に関しては、できるだけ多くの列を表示させるようにカスタマイズしていいと思います。もし不要な列が存在する場合は、管理画面上部の「表示オプション」から消し込む事もできます。

ソートに関しては順番を決めれる列に指定しましょう。(画像などの順番を決めづらい列には指定する必要はないです。)

絞り込みは基本的にタクソノミーで良いでしょう。カスタムフィールドなどはフリーワード検索で絞り込めるようにプラグインをインストールするのが最適だと思います。