WordPressで記事毎にカスタムフィールドを使用している場合、ダッシュボードの投稿一覧でカスタムフィールドの内容が確認できると便利です。
カスタムフィールドでPV数などを記録している場合、カスタムフィールドの値で投稿一覧を並べ替えら得ると便利さが増します。
ここまでの内容は検索すると簡単に見つかるのですが、実際に実装してみるとソート機能が思った動きをしないことがほとんどです。
それはなぜかと言えば、ソート機能が数値に対応していないからです。
この記事では、カスタムフィールドに数値を保存しているケースで、投稿一覧にカスタムフィールドを表示し、数値でソートできるカスタマイズをご紹介します。
カスタム投稿の投稿一覧にカスタムフィールドを表示するカスタマイズ
カスタム投稿毎にレビューとレビュー数のカスタムフィールドが2つあり、それを投稿一覧に表示します。
レビューは、0~5.00までの少数点ありの数値で、レビュー数は整数値です。
function add_posts_columns($columns) {
// $columns['他と被らない名前'] = '任意の名前';
$columns['review_text'] = 'レビュー';
$columns['review_count_text'] = 'レビュー数';
return $columns;
}
function custom_posts_column($column_name, $post_id) {
// $column_name == '$columns['〇〇'] で指定した名前を入力'
if ($column_name == 'review_text') {
// get_post_meta() でカスタムフィールド値の取得しています
// get_post_meta() の第2引数にカスタムフィールドのフィールド名を指定してください
$cf_date = get_post_meta($post_id, 'review_text', true);
// 三項演算子
// カスタムフィールドに値があるかどうか ? ある場合 = カスタムフィールドの値を表示 : ない場合 = 『 - 』を表示
echo ($cf_date) ? $cf_date : '-';
}
if ($column_name == 'review_count_text') {
// get_post_meta() でカスタムフィールド値の取得しています
// get_post_meta() の第2引数にカスタムフィールドのフィールド名を指定してください
$cf_date = get_post_meta($post_id, 'review_count_text', true);
// 三項演算子
// カスタムフィールドに値があるかどうか ? ある場合 = カスタムフィールドの値を表示 : ない場合 = 『 - 』を表示
echo ($cf_date) ? $cf_date : '-';
}
}
add_filter('manage_{カスタム投稿名}_posts_columns', 'add_posts_columns');
add_action('manage_{カスタム投稿名}_posts_custom_column', 'custom_posts_column', 10, 2);
function posts_register_sortable( $sortable_column ) {
$sortable_column['review_text'] = 'review_text';
$sortable_column['review_count_text'] = 'review_count_text';
return $sortable_column;
}
add_filter( 'manage_edit-{カスタム投稿名}_sortable_columns', 'posts_register_sortable' );
function column_orderby_custom( $vars ) {
if (isset($vars['orderby']) && 'review_text' == $vars['orderby']) {
$vars = array_merge($vars, array(
'orderby' => 'meta_value_num',
'meta_query' => array(
array(
'key' => 'review_text',
'value' => array(0), // 値が0のものを除く
'compare' => '>',
),
),
));
}
if (isset($vars['orderby']) && 'review_count_text' == $vars['orderby']) {
$vars = array_merge($vars, array(
'orderby' => 'meta_value_num',
'meta_query' => array(
array(
'key' => 'review_count_text',
'value' => array(0), // 値が0のものを除く
'compare' => '>',
),
),
));
}
return $vars;
}
add_filter( 'request', 'column_orderby_custom' );
このコードは、WordPressのカスタム投稿タイプに新たなカラムを追加し、そのカラムをソート可能にするためのものです。具体的には、「レビュー」および「レビュー数」の2つのカラムを追加しています。
add_posts_columns($columns)
関数: 新たなカラムを追加します。ここでは、$columns['review_text']
と$columns['review_count_text']
という2つのカラムを追加しています。custom_posts_column($column_name, $post_id)
関数: カラムに表示する値を指定します。カラム名が’review_text’または’review_count_text’の場合、対応するカスタムフィールドの値を取得し、その値が存在する場合はその値を、存在しない場合は’-’を表示します。add_filter
とadd_action
の部分: WordPressのフックを使用して上記の関数を登録します。ここで、manage_{カスタム投稿名}_posts_columns
とmanage_{カスタム投稿名}_posts_custom_column
は実際にはカスタム投稿タイプの名前に置き換える必要があります。posts_register_sortable($sortable_column)
関数: カラムのソート可能性を設定します。ここでは’review_text’と’review_count_text’のカラムをソート可能に設定しています。column_orderby_custom($vars)
関数: カラムのソート順を定義します。ここでは、’review_text’または’review_count_text’のカラムが選択された場合、そのカラムの値が0以上の投稿をソートの対象にしています。- 最後の
add_filter
でcolumn_orderby_custom
関数を’request’フックに登録します。これにより、ユーザーがソート順を指定したときに上記のソートルールが適用されます。
参考:https://qiita.com/uto-usui/items/6a4987fd1e65bbc22ad6
まとめ
カラムを追加してソート機能を追加しても文字列として比べられてしまうので、自前で実装することで数値でソートできるようになります。