10倍とは、フルスクラッチに比べて10倍ということです。 この連載ではWP開発に長く携わっている弊社のWordPress開発ベストプラクティスを発信していきます。 第三回はユーザー一覧画面にカラムを追加し、任意の値を表示します。
一覧ページでのカラムの追加方法
WordPressでは、入稿などの一覧ページに新規カラムを追加する場合、以下の選択肢があります。- WordPressのhookを利用する
- プラグイン(Admin Columns)を利用する
- プラグインAdmin ColumnsのAdd onを利用する
ユーザー一覧画面と目標物
現在、ユーザーは3名います。一番右のカラムで各投稿者の入稿数を表示しています。この表示はAdmin Columnsの標準機能を使っています。「投稿」カラムの右に、ユーザーごとの各投稿のタイトルが表示されるようにします。カラムの見出し「投稿タイトル」を追加する
add_action( 'manage_users_columns', 'add_column_headers' , 10, 3 );
function add_column_headers( $column_headers ) {
$column_headers['post_title'] = '投稿タイトル';
return $column_headers;
}
hookはmanage_users_columnsを使用しています。hookから配列$column_headersを受け取り、新たにキーpost_titleを指定し、valueにはカラムで表示させる見出しを入力します。「投稿タイトル」カラムが追加されました!投稿タイトルの表示
いよいよラストスパートです。ここからは一気にコードを紹介します。add_action( 'manage_users_custom_column', 'add_column_body', 10, 3 );
function add_column_body( $custom_column, $column_name, $user_id ) {
// カラムが「入稿タイトル」でない場合は処理を終了する
if ( $column_name !=='post_title' ) {
return;
}
// ユーザーごとの投稿を取得
$query = new WP_Query(
[
'author' => $user_id,
'posts_per_page' => - 1,
'post_type' => 'post',
'post_status' => [
'publish'
]
]
);
// 投稿のタイトルを配列に格納
$post_titles = [];
foreach ( $query->posts as $post ) {
$post_titles[] = $post->post_title;
}
// 配列を文字列に変換
$custom_column = implode( '<br>', $post_titles );
return $custom_column;
}
フックはmanage_users_custom_columnを使用しています。
拡張性を考慮し、最初にif文を仕込んでおきます。カラムが増えたらswitch文でカラムごとに処理を分けてあげましょう。
$queryで取得した投稿オブジェクトをループ文で処理していきます。$user_idはint型、$post->post_authorはstring型なので、!=で比較しています。自分は堅牢な!==の方が好みですが、WPの仕様なので!=を使います。 最後に返却する$custom_columnは文字列なので、投稿タイトルを格納した配列を文字列に分割します。<br>で分割しないと、長い1行として表示されるので不恰好になってしまします。ユーザーごとの投稿タイトルが表示されました!
コードの全容
functions.phpに貼り付ければ動作します!WPで自分のブログをお持ちの方はぜひ試してみてください!<?php
add_action( 'manage_users_columns', 'add_column_headers' , 10, 3 );
add_action( 'manage_users_custom_column', 'add_column_body', 10, 3 );
/**
* 「投稿タイトル」カラムを追加します
*
* @param $column_headers
*
* @return array
*/function add_column_headers( $column_headers ) {
$column_headers['post_title'] = '投稿タイトル';
return $column_headers;
}
/**
* ユーザーごとの投稿タイトルを表示します
*
* @param $custom_column
* @param $column_name
* @param $user_id
*
* @return string
*/function add_column_body( $custom_column, $column_name, $user_id ) {
// カラムが「入稿タイトル」でない場合は処理を終了する
if ( $column_name !=='post_title' ) {
return;
}
// ユーザーごとの投稿を取得
$query = new WP_Query(
[
'author' => $user_id,
'posts_per_page' => - 1,
'post_type' => 'post',
'post_status' => [
'publish'
]
]
);
// 投稿のタイトルを配列に格納
$post_titles = [];
foreach ( $query->posts as $post ) {
$post_titles[] = $post->post_title;
}
// 配列を文字列に変換
$custom_column = implode( '<br>', $post_titles );
return $custom_column;
}
本稿の真ん中あたりに書いたWP_Queryは、実はユーザーごとにクエリを飛ばしています。もしユーザー数が50人や100人に増えると...。恐ろしいですね。次の記事ではWordPressのコードをオブジェクト指向で書いて、クエリ数を削減する方法を紹介します!