跳到內容

LearnDash 儲存被 bbPress 統計欄位擋住

整理日期:2026-10-20

某線上課程網站的管理員新增 LearnDash「章」時,區塊編輯器顯示「發佈時發生錯誤」,並指出目前的登入身分沒有編輯自訂欄位 _bbp_topic_count 的權限。

到 User Role Editor 也找不到同名權限,因為這是 bbPress 用來記錄討論數量的資料欄位,錯誤訊息裡的名稱不能直接當成角色權限來勾選。


  • 帳號驗證:REST API 是否能辨識目前帳號,角色與一般編輯權限是否正確。
  • 內容類型:LearnDash「章」的 sfwd-lessons 是否出現了不屬於課程的 bbPress 欄位。
  • 欄位註冊:檢查 object_subtype、show_in_rest 與 auth_callback。
  • 寫入請求:儲存時是否帶回 _bbp_topic_count,以及回應的錯誤代碼。

這次使用 bbPress 2.6.20,程式以 register_meta( 'post', ... ) 註冊統計欄位,沒有指定 object_subtype,因此支援自訂欄位的非討論區內容,也會在 REST API 讀到這些欄位。

這些統計資料可透過 REST 讀取,但 auth_callback 明確設為 __return_false,當儲存請求把欄位送回並進入寫入檢查時,就會被拒絕,即使使用管理員帳號也一樣。

用測試草稿寫入 _bbp_topic_count: 0,回傳 HTTP 403 與 rest_cannot_update,錯誤文字與編輯器顯示一致,確認問題出在欄位範圍與寫入檢查。


先備份原有程式碼片段與相關 REST schema,再使用網站已安裝的 Code Snippets 加入修正,讓全域的 bbPress 文章欄位只註冊到 forum、topic、reply。

以下程式碼貼入 PHP 片段,不需要再加上 <?php,設定為全站執行:

add_action( 'init', function () {
if ( ! function_exists( 'bbp_get_forum_post_type' ) ) {
return;
}
$post_types = array(
bbp_get_forum_post_type(),
bbp_get_topic_post_type(),
bbp_get_reply_post_type(),
);
// bbPress counts belong to forum content, not LearnDash or ordinary posts.
foreach ( get_registered_meta_keys( 'post' ) as $meta_key => $args ) {
if ( 0 !== strpos( $meta_key, '_bbp_' ) ) {
continue;
}
unregister_meta_key( 'post', $meta_key );
foreach ( $post_types as $post_type ) {
if ( ! isset( get_registered_meta_keys( 'post', $post_type )[ $meta_key ] ) ) {
register_post_meta( $post_type, $meta_key, $args );
}
}
}
}, 20 );

修正保留原本的欄位參數,包含禁止 REST 寫入統計值與隱藏欄位的設定,也不修改使用者統計或資料庫中的既有欄位值,若其他外掛已註冊同名的內容類型專用欄位,就保留既有設定。

啟用後先重新整理編輯頁,避免沿用先前載入的欄位,再依序檢查:

  1. LearnDash 課程、章、節,以及一般文章與頁面的 REST schema,不再出現 _bbp_ 統計欄位。
  2. 用測試草稿送回完整中繼資料,確認能儲存並回讀內容。
  3. 其他課程欄位、原有程式碼片段與帳號權限沒有變動。
  4. 原本的編輯器新增、儲存、發佈流程,以及討論區實際發文與統計仍正常。

這次修正後,同一份測試草稿儲存回傳 HTTP 200,回讀內容一致,測試資料也已移入回收桶,實際編輯器發佈、討論區發文與會員端課程流程仍需另行驗收。

若出現其他相容性問題,可先停用這段片段回到原本的欄位註冊方式,日後更新 bbPress 也要重新確認是否仍需要這段修正。

參考:bbPress 2.6.20 欄位註冊程式、WordPress register_meta 說明。


  • 把 _bbp_topic_count 當成一般角色權限,持續在 User Role Editor 裡新增勾選。
  • 為了通過儲存,全面放寬 _bbp_ 欄位的寫入保護。
  • 只移除第一個報錯的欄位,留下其他混入的統計欄位。
  • 直接修改 bbPress 外掛檔案,讓下次更新覆蓋修正。
  • 把 REST API 草稿儲存成功,記成所有編輯器與討論區功能都已驗收。

  • WordPress、LearnDash 與 bbPress 版本。
  • 出錯的內容類型、完整錯誤文字及帳號角色。
  • 寫入請求的 meta 欄位、HTTP 狀態與 REST 錯誤代碼。
  • 欄位是否全域註冊,以及原本的 auth_callback 設定。
  • 修正前後的 schema、測試草稿回讀結果及回滾方式。

分享請求紀錄時,先移除 Authorization、Cookie、應用程式密碼與真實帳號資訊。


  • WordPress
  • LearnDash
  • bbPress
  • REST API
  • 自訂欄位
  • 權限