WEB制作、マーケティングに関する情報をお届けします。ホームページ制作会社、テラのブログ

WordPressのユーザー一覧画面の表の列にカスタムフィールドを追加する方法

タグ:

会員サイトを運用する際には管理者画面のユーザー一覧画面を利用することは多いです。
ただ、デフォルトではユーザー名、名前、メール、権限グループ、投稿数のみしか表示されません。
例えば法人向けのサービスであればユーザーの会社名、住所、URLなどを表示したいという場合もあるかと思います。
今回は『WordPressのユーザー一覧画面の表の列にカスタムフィールドを追加する方法』を紹介します。

コードを解説

// 表示したいカスタムフィールドを定義
define('USER_CUSTOM_FIELDS', array('office_name', 'area', 'url'));

/**
 * ACFフィールドのタイプが日付かどうかを確認し、必要に応じてフォーマットする関数
 */
function format_custom_user_field_value_acf($field_name, $user_id, $value) {
    // ACFがインストールされている場合のみ処理を行う
    if (function_exists('get_field_object')) {
        // フィールドオブジェクトを取得(ユーザーIDに基づく)
        $field = get_field_object($field_name, 'user_' . $user_id);

        // フィールドが存在し、タイプが日付(date_picker)であればフォーマットする
        if ($field && $field['type'] === 'date_picker') {
            // 既に d/m/Y 形式の日付が保存されているため、それをパースしてフォーマット
            $date = DateTime::createFromFormat('d/m/Y', $value);
            return $date ? $date->format('Y/m/d') : $value; // フォーマットできなかった場合はそのまま返す
        }
    }

    // ACFのフィールドではない場合や、日付フィールドでない場合はそのままの値を返す
    return $value;
}

/**
 * ユーザー一覧にカスタムフィールドを表示するためのカラムを追加する
 */
function add_custom_user_columns($columns) {
    // 定数からカスタムフィールドを追加
    foreach (USER_CUSTOM_FIELDS as $field) {
        $columns[$field] = ucwords(str_replace('_', ' ', $field)); // カラム名を追加
    }
    
    return $columns;
}
add_filter('manage_users_columns', 'add_custom_user_columns');

/**
 * カスタムカラムに対応するユーザーメタデータを表示する
 */
function display_custom_user_column_data($value, $column_name, $user_id) {
    // 定数からカスタムフィールドを確認
    if (in_array($column_name, USER_CUSTOM_FIELDS)) {
        // ACFを使ってカスタムフィールドを取得
        $value = get_field($column_name, 'user_' . $user_id);

        // ACFのフィールドが日付の場合、フォーマット
        $value = format_custom_user_field_value_acf($column_name, $user_id, $value);

        return esc_html($value); // 取得した値を表示
    }
    
    return $value;
}
add_filter('manage_users_custom_column', 'display_custom_user_column_data', 10, 3);

コードの解説

functions.phpにコードを追加していきます。
表示したいカスタムフィールド名を配列で設定します。
arrayの中にカンマ区切りで書いてください。

define('USER_CUSTOM_FIELDS', array('office_name', 'area', 'url'));

日付を入れる場合の処理を書きます。
Advanced Custom Fieldを使用している場合、日付選択にdate_pickerを使用する場合もあるのでその場合は日付のフォーマットを整える関数を作成します。Advanced Custom Fieldを使用していない場合はそのまま値を返します。

function format_custom_user_field_value_acf($field_name, $user_id, $value) {
    // ACFがインストールされている場合のみ処理を行う
    if (function_exists('get_field_object')) {
        // フィールドオブジェクトを取得(ユーザーIDに基づく)
        $field = get_field_object($field_name, 'user_' . $user_id);

        // フィールドが存在し、タイプが日付(date_picker)であればフォーマットする
        if ($field && $field['type'] === 'date_picker') {
            // 既に d/m/Y 形式の日付が保存されているため、それをパースしてフォーマット
            $date = DateTime::createFromFormat('d/m/Y', $value);
            return $date ? $date->format('Y/m/d') : $value; // フォーマットできなかった場合はそのまま返す
        }
    }

    // ACFのフィールドではない場合や、日付フィールドでない場合はそのままの値を返す
    return $value;
}

表の見出しを出力して、列を追加します。

function add_custom_user_columns($columns) {
    // 定数からカスタムフィールドを追加
    foreach (USER_CUSTOM_FIELDS as $field) {
        $columns[$field] = ucwords(str_replace('_', ' ', $field)); // カラム名を追加
    }
    
    return $columns;
}
add_filter('manage_users_columns', 'add_custom_user_columns');

次に値を設定していきます。
『get_post_meta』でカスタムフィールドの値をセット、冒頭で設定したAdvanced Custom Fieldの日付フィールドフォーマットを通過して出力しています。
最後に一覧画面に追加するためにフックを設定します。

function display_custom_user_column_data($value, $column_name, $user_id) {
    // 定数からカスタムフィールドを確認
    if (in_array($column_name, USER_CUSTOM_FIELDS)) {
        // ACFを使ってカスタムフィールドを取得
        $value = get_field($column_name, 'user_' . $user_id);
        // ACFのフィールドが日付の場合、フォーマット
        $value = format_custom_user_field_value_acf($column_name, $user_id, $value);
        return esc_html($value); // 取得した値を表示
    }
    return $value;
}
add_filter('manage_users_custom_column', 'display_custom_user_column_data', 10, 3);

まとめ

以上、『WordPressのユーザー一覧画面の表の列にカスタムフィールドを追加する方法』でした。
要件として求められることが多いので押さえておくと便利でしょう。

テラ合同会社(東京都)

テラは2014年に東京都でスタートアップしたホームページ制作会社です。ホームページ制作以外にも広告運用、マーケティング、ブランディング、印刷物など幅広い領域をサポートしています。
コーポレートサイトはこちらをご覧ください。