こんにちは、Ryohei(@ityryohei)です!

本記事では、WordPressの管理画面にある投稿一覧ページにカスタムフィールドのカラムを追加し、値でソートする方法をご紹介しています。

投稿一覧をカスタムフィールドの値でソートしたいんだけど、どうやって実装するんだろう?

上記の疑問にお答えします。

※解説のため下記のページで作成したカスタムフィールドを使用します。併せてご覧いただければ幸いです!

では、解説していきます。

投稿一覧にカスタムフィールドのカラムを追加する

投稿一覧にカスタムフィールドのカラムを追加します。

投稿一覧には管理画面の左に表示されている「投稿 > 投稿一覧」を選択するか、/wp-admin/edit.phpからアクセスできます。カラム(列)というのは、投稿一覧に表示される下記赤線の列になります。

では投稿一覧にカラムを追加していきます。テーマ内のfunctions.phpに下記の追記します。(本記事で追加するカラム名は、上記画像と同様に日本語で閲覧数と表示することにします。)

もし別のカスタムフィールドを追加されたい場合は、post_views_countを追加したいカスタムフィールドのmeta_keyに変更してご利用ください。

//投稿一覧に表示するカスタムフィールドのカラム名を指定
function add_posts_columns($columns){
    $columns['post_views_count'] = '閲覧数';
    return $columns;
}
add_filter('manage_posts_columns', 'add_posts_columns');
//カスタム投稿タイプの場合
//add_filter('manage_{post_type}_posts_columns', 'add_posts_columns');


//投稿一覧にカスタムフィールドのカラムを追加する
function add_posts_custom_column($column_name, $post_id){
    if($column_name === 'post_views_count'){
        $column_count = get_post_meta($post_id, 'post_views_count', true);
        if(!empty($column_count)){
            echo esc_html($column_count);
        } else {
            echo __('None');
        }
    }
}
add_action('manage_posts_custom_column', 'add_posts_custom_column', 10, 2);
//カスタム投稿タイプの場合
//add_filter('manage_{post_type}_posts_custom_column', 'add_posts_custom_column', 10, 2);

ここまでで投稿一覧に閲覧数のカラムが追加され、対応した値が各投稿に表示されるようになります。ただ、現状では表示されているだけでソートが可能な状態ではありません。追加したカラムがソート可能となるように、テーマ内のfunctions.phpに新しいスクリプトを追記します。

カスタムフィールドのカラムでソート可能にする

投稿一覧でカスタムフィールドによるソートを可能にします。上記同様meta_keypost_views_countの部分はカスタムフィールドに応じでキーを変更してご利用ください。

//カスタムフィールドによるソートを可能にする
function posts_sortable_columns($sortable_column) {
    $sortable_column['post_views_count'] = 'post_views_count';
    return $sortable_column;
}
add_filter('manage_edit-post_sortable_columns', 'posts_sortable_columns');
//カスタム投稿タイプの場合
//add_filter('manage_edit-{post_type}_sortable_columns', 'posts_sortable_columns');


//カスタムフィールドでソートする際のパラメータ
function posts_columns_sort_param($vars){
    if(isset($vars['orderby']) && 'post_views_count' === $vars['orderby'] ) {
        $vars = array_merge(
            $vars,
            array(
                'meta_key' => 'post_views_count',
                'orderby' => 'meta_value_num', //対象が文字列の場合は「meta_value」を指定
            )
        );
    }
    return $vars;
}
add_filter('request', 'posts_columns_sort_param');

以上で閲覧数によるソートが可能になります。

投稿一覧のカラムの並び順を変更する

最後に見た目を整えるという意味で投稿一覧のカラムの並び順を変更する方法をご紹介します。

下記の$sort_numberの連想配列の値に指定されている小さい番号順に左から表示されます。中身を適宜変更してご利用いただければと思います。

//投稿一覧のカラムの並び順を変更
function posts_columns_sort($columns){
    $sort_number = array(
        'cb'                => 0,
        'title'             => 1,
        'categories'        => 2,
        'author'            => 3,
        'post_views_count'  => 4,
        'date'              => 5
    );
 
    $sort = array();
    foreach($columns as $key => $value){
        $sort[] = $sort_number[$key];
    }
    array_multisort($sort, $columns);
 
    return $columns;
}
add_filter('manage_posts_columns', 'posts_columns_sort');

最後に

最近公開されたWordPress5.8~IEのサポートが終了となりました。また、PHP8がリースされたことにより、Web業界ではしばらくはアップグレードの対応に追われる日々が続きそうですね。

WordPressは拡張性の高いシステムでエラー等もわかりやすくなっていますが、構築時に複数人が携わるため把握できていないソースコードが混在している場合が多いです。

きちんとテストしてアップする!

これをモットーにして頑張りたいと思います。

以上、WordPressで投稿一覧をカスタムフィールドの値でソートする方法のご紹介でした!

この記事を書いた人

Ryohei

Webエンジニア / ブロガー

福岡のWeb制作会社に務めるWebエンジニアです。エンジニア歴は10年程で、好きな言語はPHPとJavaScriptです。本サイトは私がインプットしたWebに関する知識を整理し、共有することを目的に2015年から運営しています。Webに関するご相談があれば気軽にお問い合わせください。