其實Wordpress 的iOS app 我用得不多,但偶爾會用一下,有時候想到什麼先寫下來,整理了再發出來,但是最近iOS app 更新後我發現登錄不上。
經過我和AI 對source code 的分析,最終定位到問題所在,去github 提了個issue,很快就被合併提交,既然他們動作這麼快,為什麼之前都沒人提?
因為這是一個老用戶才會卡到的bug, 新用戶不存在,我直接修改了database 來匹配新版的app。
以下為AI 整理:
問題
WordPress iOS app (26.8) 登入自架站 時,瀏覽器 2FA 認證成功、產生 Application Password 也成功,但最後顯示「Site details cannot be loaded」。
根本原因
WordPress iOS app 新的 Rust-based HTTP client (wordpress-rs 0.1.0) 在 wp_api/src/users.rs 裡,把 extra_capabilities 宣告成:
pub extra_capabilities: Option<HashMap<String, bool>>,
值必須是 boolean。但 2011 年建立的老 admin 帳號,資料庫 wp_usermeta.wp_capabilities 裡存的是:
array('administrator' => '1') // string
Rust serde deserializer 遇到 string "1" 無法轉成 bool,整個 User 物件 parse 失敗 → iOS app 回報「Site details cannot be loaded」。
新註冊的使用者沒問題,因為 WordPress 核心 set_role() 寫入的是 true(boolean)。
解法
直接改資料庫:
update_user_meta(1, 'wp_capabilities', array('administrator' => true));
Debug 過程的收穫
- 證實不是 server 設定問題:Nginx、CloudFront、REST API、Application Password 全部正常
- 排除了 Two Factor / WP-WebAuthn / Jetpack 404 等假設
- PHP-FPM 的
php_admin_value[error_log]會強制覆蓋WP_DEBUG_LOG,導致 WordPress debug log 無法運作 - systemd PrivateTmp 會讓
/tmp變成 service 專屬,外部看不到 - Android app 能過但 iOS 不行 是因為 iOS 改用 wordpress-rs,Android 還在用舊 client(type 較寬鬆)
- 當 server 端所有回應看起來都正常,而錯誤發生在 client 端時,直接看 client 的原始碼是最直接的 debug 方式(最後一步靠 clone wordpress-rs 找出答案)
建議
這是 wordpress-rs 的 bug,應該寬容處理 "1" → true。可以到 https://github.com/Automattic/wordpress-rs/issues 報告,幫其他老站使用者。