LearnDash 儲存被 bbPress 統計欄位擋住
整理日期:2026-10-20
某線上課程網站的管理員新增 LearnDash「章」時,區塊編輯器顯示「發佈時發生錯誤」,並指出目前的登入身分沒有編輯自訂欄位 _bbp_topic_count 的權限。
到 User Role Editor 也找不到同名權限,因為這是 bbPress 用來記錄討論數量的資料欄位,錯誤訊息裡的名稱不能直接當成角色權限來勾選。
先拆成幾層看
Section titled “先拆成幾層看”- 帳號驗證: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 寫入統計值與隱藏欄位的設定,也不修改使用者統計或資料庫中的既有欄位值,若其他外掛已註冊同名的內容類型專用欄位,就保留既有設定。
啟用後先重新整理編輯頁,避免沿用先前載入的欄位,再依序檢查:
- LearnDash 課程、章、節,以及一般文章與頁面的 REST schema,不再出現
_bbp_統計欄位。 - 用測試草稿送回完整中繼資料,確認能儲存並回讀內容。
- 其他課程欄位、原有程式碼片段與帳號權限沒有變動。
- 原本的編輯器新增、儲存、發佈流程,以及討論區實際發文與統計仍正常。
這次修正後,同一份測試草稿儲存回傳 HTTP 200,回讀內容一致,測試資料也已移入回收桶,實際編輯器發佈、討論區發文與會員端課程流程仍需另行驗收。
若出現其他相容性問題,可先停用這段片段回到原本的欄位註冊方式,日後更新 bbPress 也要重新確認是否仍需要這段修正。
參考:bbPress 2.6.20 欄位註冊程式、WordPress register_meta 說明。
不建議先做的事
Section titled “不建議先做的事”- 把
_bbp_topic_count當成一般角色權限,持續在 User Role Editor 裡新增勾選。 - 為了通過儲存,全面放寬
_bbp_欄位的寫入保護。 - 只移除第一個報錯的欄位,留下其他混入的統計欄位。
- 直接修改 bbPress 外掛檔案,讓下次更新覆蓋修正。
- 把 REST API 草稿儲存成功,記成所有編輯器與討論區功能都已驗收。
下次遇到可以先整理什麼
Section titled “下次遇到可以先整理什麼”- WordPress、LearnDash 與 bbPress 版本。
- 出錯的內容類型、完整錯誤文字及帳號角色。
- 寫入請求的 meta 欄位、HTTP 狀態與 REST 錯誤代碼。
- 欄位是否全域註冊,以及原本的
auth_callback設定。 - 修正前後的 schema、測試草稿回讀結果及回滾方式。
分享請求紀錄時,先移除 Authorization、Cookie、應用程式密碼與真實帳號資訊。
WordPressLearnDashbbPressREST API自訂欄位權限