WordPress 會員註冊時自動建立自訂文章類型實作筆記

前言

在 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_register Hook:會員註冊時觸發,執行自動建立文章函式。
  • get_userdata($user_id):取得會員資料。
  • wp_insert_post():建立自訂文章並回傳文章 ID。
  • Gutenberg 內容格式:使用區塊編輯器標記語法,方便未來編輯。
  • ACF 欄位設定:透過 update_field() 填入預設值,需先安裝並啟用 ACF 外掛。

確保程式運作正確

  • 確認 member_info CPT 已成功註冊並可在後台管理。
  • 確認 Advanced Custom Fields 外掛已啟用,且欄位名稱正確。
  • 測試新會員註冊流程,並檢查「會員資訊」文章是否自動產生。

延伸應用與常見坑

  • 若需更多欄位,可在 ACF 中擴充並同步更新 update_field()
  • 若會員資料需同步更新文章,可監聽 profile_update Hook。
  • 注意文章內容格式需符合 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');