前言
在 WordPress 網站中,常見需求是當新會員註冊時,自動建立一篇專屬於該會員的自訂文章類型(Custom Post Type, CPT),例如會員介紹頁面。本文適合具備基本 WordPress 開發經驗的工程師或自學者,說明如何利用 user_register Hook 自動建立 member_info 文章,並設定內容與 ACF 欄位。
註冊 member_info 自訂文章類型
首先,必須在主題的 functions.php 中註冊 member_info 這個自訂文章類型。以下程式碼會在 WordPress 初始化時執行:
function register_member_info_post_type() {
$args = array(
'labels' => array(
'name' => '會員資訊',
'singular_name' => '會員資訊'
),
'public' => true,
'has_archive' => true,
'supports' => array('title', 'editor', 'author'),
'rewrite' => array('slug' => 'member-info'),
);
register_post_type('member_info', $args);
}
add_action('init', 'register_member_info_post_type');
此段程式碼會建立一個公開且有存檔頁的 CPT,並支援標題、內容編輯器與作者欄位。
自動建立會員資訊文章
接著,利用 user_register Hook 監聽新會員註冊事件,當會員註冊時自動建立一篇 member_info 文章,並填入預設內容與 ACF 欄位:
function ks_create_member_info_post($user_id) {
$user = get_userdata($user_id);
$display_name = $user->display_name;
$post_title = $display_name;
$post_content = '
<h3 class="wp-block-heading"><strong>經歷</strong>(公開資訊)</h3>
<p>公開資訊</p>
<h3 class="wp-block-heading"><strong>專長</strong>(公開資訊)</h3>
<p>公開資訊</p>
';
$post_data = array(
'post_title' => $post_title,
'post_content' => $post_content,
'post_status' => 'publish',
'post_author' => $user_id,
'post_type' => 'member_info',
);
$post_id = wp_insert_post($post_data);
if ($post_id) {
update_field('member_content', '登入會員限定內容', $post_id);
update_field('member_current_position', '目前任職', $post_id);
update_field('member_experience', '(公開資訊區)<br>信箱、網站、學歷、學號?', $post_id);
}
}
add_action('user_register', 'ks_create_member_info_post');
此函式會取得新會員的顯示名稱作為文章標題,並用 Gutenberg 格式設定文章內容。若有安裝 Advanced Custom Fields,則會填入指定欄位的預設值。
程式碼說明
user_registerHook:會員註冊時觸發,執行自動建立文章函式。get_userdata($user_id):取得會員資料。wp_insert_post():建立自訂文章並回傳文章 ID。- Gutenberg 內容格式:使用區塊編輯器標記語法,方便未來編輯。
- ACF 欄位設定:透過
update_field()填入預設值,需先安裝並啟用 ACF 外掛。
確保程式運作正確
- 確認
member_infoCPT 已成功註冊並可在後台管理。 - 確認 Advanced Custom Fields 外掛已啟用,且欄位名稱正確。
- 測試新會員註冊流程,並檢查「會員資訊」文章是否自動產生。
延伸應用與常見坑
- 若需更多欄位,可在 ACF 中擴充並同步更新
update_field()。 - 若會員資料需同步更新文章,可監聽
profile_updateHook。 - 注意文章內容格式需符合 Gutenberg 區塊語法,避免前端顯示異常。
完整程式碼
function register_member_info_post_type() {
$args = array(
'labels' => array(
'name' => '會員資訊',
'singular_name' => '會員資訊'
),
'public' => true,
'has_archive' => true,
'supports' => array('title', 'editor', 'author'),
'rewrite' => array('slug' => 'member-info'),
);
register_post_type('member_info', $args);
}
add_action('init', 'register_member_info_post_type');
function ks_create_member_info_post($user_id) {
$user = get_userdata($user_id);
$display_name = $user->display_name;
$post_title = $display_name;
$post_content = '
<h3 class="wp-block-heading"><strong>經歷</strong>(公開資訊)</h3>
<p>公開資訊</p>
<h3 class="wp-block-heading"><strong>專長</strong>(公開資訊)</h3>
<p>公開資訊</p>
';
$post_data = array(
'post_title' => $post_title,
'post_content' => $post_content,
'post_status' => 'publish',
'post_author' => $user_id,
'post_type' => 'member_info',
);
$post_id = wp_insert_post($post_data);
if ($post_id) {
update_field('member_content', '登入會員限定內容', $post_id);
update_field('member_current_position', '目前任職', $post_id);
update_field('member_experience', '(公開資訊區)<br>信箱、網站、學歷、學號?', $post_id);
}
}
add_action('user_register', 'ks_create_member_info_post');