前言

在 WordPress 中,管理使用者時常需要新增自訂欄位以標示特定身份。本文針對如何在使用者編輯頁面新增「是否是老師」欄位,並在使用者列表中顯示及篩選此欄位進行說明,適合具備基礎 PHP 與 WordPress 開發經驗的工程師或自學者。

一、在使用者編輯頁面新增自訂欄位

首先,我們要在使用者編輯頁面新增一個勾選框,讓管理員能標記該使用者是否為老師。透過 show_user_profileedit_user_profile 兩個 action,將欄位輸出到前端。

關鍵程式碼片段:

function ks_add_teacher_user_profile($user) {
    ?>
    <h3>老師身分設定</h3>
    <table class="form-table">
        <tr>
            <th><label for="teacher_user">是否為老師</label></th>
            <td>
                <input type="checkbox" name="teacher_user" id="teacher_user" value="1" <?php checked(get_user_meta($user->ID, 'teacher_user', true), 1); ?> />
                <span class="description">勾選此選項以標記此使用者為老師。</span>
            </td>
        </tr>
    </table>
    <?php
}
add_action('show_user_profile', 'ks_add_teacher_user_profile');
add_action('edit_user_profile', 'ks_add_teacher_user_profile');

二、保存欄位數據

為了將勾選框的值存入資料庫,我們使用 personal_options_updateedit_user_profile_update 兩個 action,並利用 update_user_meta 保存。

關鍵程式碼片段:

function save_teacher_user_profile($user_id) {
    if (!current_user_can('edit_user', $user_id)) {
        return false;
    }

    $checkbox_value = isset($_POST['teacher_user']) ? 1 : 0;
    update_user_meta($user_id, 'teacher_user', $checkbox_value);
}
add_action('personal_options_update', 'save_teacher_user_profile');
add_action('edit_user_profile_update', 'save_teacher_user_profile');

三、在使用者列表新增自訂欄位

為了在使用者列表頁面顯示「是否是老師」欄位,我們需要新增欄位標題與欄位內容。

  1. 新增欄位標題:
function ks_add_teacher_user_column($columns) {
    $columns['teacher_user'] = '老師';
    return $columns;
}
add_filter('manage_users_columns', 'ks_add_teacher_user_column');
  1. 顯示欄位內容:
function ks_show_teacher_user_column($value, $column_name, $user_id) {
    if ('teacher_user' === $column_name) {
        $is_teacher_user = get_user_meta($user_id, 'teacher_user', true);
        return $is_teacher_user ? '已啟用' : '-';
    }
    return $value;
}
add_filter('manage_users_custom_column', 'ks_show_teacher_user_column', 10, 3);

四、在使用者列表新增篩選功能

為了方便管理員快速篩選出老師帳號,我們新增篩選按鈕與過濾邏輯。

  1. 新增篩選按鈕:
function ks_add_teacher_user_filter_button($which) {
    if ('top' === $which) {
        ?>
        <a href="<?php echo admin_url('users.php?teacher_user_filter=1'); ?>" class="button">篩選老師</a>
        <?php
    }
}
add_action('restrict_manage_users', 'ks_add_teacher_user_filter_button');
  1. 過濾老師清單:
function ks_filter_teacher_user_list($query) {
    global $pagenow;

    if ('users.php' === $pagenow && isset($_GET['teacher_user_filter']) && $_GET['teacher_user_filter'] === '1') {
        $meta_query = array(
            array(
                'key' => 'teacher_user',
                'value' => '1',
                'compare' => '='
            ),
        );
        $query->set('meta_query', $meta_query);
    }
}
add_action('pre_get_users', 'ks_filter_teacher_user_list');

實作結果

完成以上步驟後,使用者編輯頁面會多出「是否是老師」勾選框,使用者列表頁面會顯示老師欄位並可透過篩選按鈕快速查看所有老師帳號,提升管理效率。

完整程式碼

function ks_add_teacher_user_profile($user) {
    ?>
    <h3>老師身分設定</h3>
    <table class="form-table">
        <tr>
            <th><label for="teacher_user">是否為老師</label></th>
            <td>
                <input type="checkbox" name="teacher_user" id="teacher_user" value="1" <?php checked(get_user_meta($user->ID, 'teacher_user', true), 1); ?> />
                <span class="description">勾選此選項以標記此使用者為老師。</span>
            </td>
        </tr>
    </table>
    <?php
}
add_action('show_user_profile', 'ks_add_teacher_user_profile');
add_action('edit_user_profile', 'ks_add_teacher_user_profile');

function save_teacher_user_profile($user_id) {
    if (!current_user_can('edit_user', $user_id)) {
        return false;
    }

    $checkbox_value = isset($_POST['teacher_user']) ? 1 : 0;
    update_user_meta($user_id, 'teacher_user', $checkbox_value);
}
add_action('personal_options_update', 'save_teacher_user_profile');
add_action('edit_user_profile_update', 'save_teacher_user_profile');

function ks_add_teacher_user_column($columns) {
    $columns['teacher_user'] = '老師';
    return $columns;
}
add_filter('manage_users_columns', 'ks_add_teacher_user_column');

function ks_show_teacher_user_column($value, $column_name, $user_id) {
    if ('teacher_user' === $column_name) {
        $is_teacher_user = get_user_meta($user_id, 'teacher_user', true);
        return $is_teacher_user ? '已啟用' : '-';
    }
    return $value;
}
add_filter('manage_users_custom_column', 'ks_show_teacher_user_column', 10, 3);

function ks_add_teacher_user_filter_button($which) {
    if ('top' === $which) {
        ?>
        <a href="<?php echo admin_url('users.php?teacher_user_filter=1'); ?>" class="button">篩選老師</a>
        <?php
    }
}
add_action('restrict_manage_users', 'ks_add_teacher_user_filter_button');

function ks_filter_teacher_user_list($query) {
    global $pagenow;

    if ('users.php' === $pagenow && isset($_GET['teacher_user_filter']) && $_GET['teacher_user_filter'] === '1') {
        $meta_query = array(
            array(
                'key' => 'teacher_user',
                'value' => '1',
                'compare' => '='
            ),
        );
        $query->set('meta_query', $meta_query);
    }
}
add_action('pre_get_users', 'ks_filter_teacher_user_list');