WP10は弊社が掲げる「WordPressを使った10倍速開発」です。
10倍とは、フルスクラッチに比べて10倍ということです。

この連載ではWP開発に長く携わっている弊社のWordPress開発ベストプラクティスを発信していきます。

第三回はユーザー一覧画面にカラムを追加し、任意の値を表示します。

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

WordPressでは、入稿などの一覧ページに新規カラムを追加する場合、以下の選択肢があります。

  • WordPressのhookを利用する
  • プラグイン(Admin Columns)を利用する
  • プラグインAdmin ColumnsのAdd onを利用する

今回は「WordPressのhookを利用する」方法をご紹介します。

なお、「プラグインAdmin ColumnsのAdd onを利用する」方法は下記の記事をご覧ください。

Admin Columnsの便利なadd on
Admin Columnsの便利なadd on (part2)
目次へ戻る

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

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

この記事をシェアする:

WP10の連載一覧(全5件)

この記事へのコメント:

    [WP10]WP_Queryのクエリ数を削減する | PRESSMAN*Tech(プレスマンテック) 2018-08-24 13:24:43  返信
    […] [W10]ユーザー一覧画面にカラムを追加する […]
東日本橋の制作・開発会社 プレスマンのスタッフブログ