Day: July 12, 2026

  • WordPress iOS app 老用戶的bug

    其實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 過程的收穫

    1. 證實不是 server 設定問題:Nginx、CloudFront、REST API、Application Password 全部正常
    2. 排除了 Two Factor / WP-WebAuthn / Jetpack 404 等假設
    3. PHP-FPM 的 php_admin_value[error_log] 會強制覆蓋 WP_DEBUG_LOG,導致 WordPress debug log 無法運作
    4. systemd PrivateTmp 會讓 /tmp 變成 service 專屬,外部看不到
    5. Android app 能過但 iOS 不行 是因為 iOS 改用 wordpress-rs,Android 還在用舊 client(type 較寬鬆)
    6. 當 server 端所有回應看起來都正常,而錯誤發生在 client 端時,直接看 client 的原始碼是最直接的 debug 方式(最後一步靠 clone wordpress-rs 找出答案)

    建議

    這是 wordpress-rs 的 bug,應該寬容處理 "1"true。可以到 https://github.com/Automattic/wordpress-rs/issues 報告,幫其他老站使用者。