Web制作・開発会社 プレスマンのスタッフブログ

PRESSMAN*Tech

[WordPress]ユーザー一覧画面にカラムを追加する[WP10]

WP10は弊社が掲げる「WordPressを使った10倍速開発」です。
10倍とは、フルスクラッチに比べて10倍ということです。 この連載ではWP開発に長く携わっている弊社のWordPress開発ベストプラクティスを発信していきます。 第三回はユーザー一覧画面にカラムを追加し、任意の値を表示します。

一覧ページでのカラムの追加方法

WordPressでは、入稿などの一覧ページに新規カラムを追加する場合、以下の選択肢があります。
  • WordPressのhookを利用する
  • プラグイン(Admin Columns)を利用する
  • プラグインAdmin ColumnsのAdd onを利用する
今回は「WordPressのhookを利用する」方法をご紹介します。 なお、「プラグインAdmin ColumnsのAdd onを利用する」方法は下記の記事をご覧ください。
https://www.pressmantech.com/tech/4558
https://www.pressmantech.com/tech/4718

ユーザー一覧画面と目標物

現在、ユーザーは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のコードをオブジェクト指向で書いて、クエリ数を削減する方法を紹介します!