Repository navigation
Releases: Ya19880104/ys-admin-menu
Releases · Ya19880104/ys-admin-menu
Release list
Login attempt limits, visitor IP detection, login page styles and login entrance switches, all off by default
Login attempt limits, visitor IP detection, login page styles and login entrance switches, all off by default
Latest
這一版的新功能全部預設關閉。 更新到 1.6.0 時不建資料表、不寫任何設定;沒動過新設定的站,登入頁的外觀與登入的行為跟 1.5.2 一樣。
新增
- 登入次數限制(白牌設定「登入防護」分頁的新卡片,總開關預設關):同一個網路位址失敗太多次時,暫時不讓它登入。
- 打開後的預設:15 分鐘內失敗 10 次,鎖 30 分鐘;24 小時內第 3 次被鎖起,改鎖 24 小時。次數、時間都可以調。IPv6 以 /64 為一個單位;另可打開「IPv6 也以 /48 彙總計算」(預設關,門檻是 5 倍、鎖整個 /48)。
- 只鎖網路位址,不鎖帳號:別人故意輸錯,也不會把管理員的帳號鎖住。
- 涵蓋走 WordPress 登入流程的登入:wp-login.php(含被其他外掛改過的登入網址)、前台呼叫 wp_signon 的登入表單、XML-RPC。用應用程式密碼的 REST 請求在鎖定期間也擋(失敗不計數)。
- 被鎖住時,密碼對不對、帳號存不存在,看到的訊息都一樣;已經登入的人不受影響。
- 同一個人打錯幾次又登入成功時,只原諒他自己帳號的那幾次,猜別人帳號的照算:整間公司共用一個對外 IP 的站,通常不用把它加進白名單。
- 分不出訪客位址的登入(例如站在代理或 Cloudflare 後面、但「進階:訪客 IP」還沒設好)併成同一桶計算,門檻是 5 倍;這時設定頁與後台會提醒你去設定 IP 偵測。純內網、前面沒有代理的站,可以打開「內網位址逐一計數」。
- 計數有上限,資料表不會被灌爆:計數空間滿了、或同一個網段的位址太多時,新來的位址改用它的網段(IPv4 /24、IPv6 /48)一起計算;網段多到連這個也放不下時,超出的部分只計數、不擋人,後台會紅字提醒。
- 白名單(一行一個 IP 或 CIDR)、鎖定時的訊息、紀錄保留天數(預設 30 天;總開關關掉之後,留下的紀錄照樣每天依保留天數清掉)。
- 鎖定時寄信通知(預設關):同一個位址 24 小時內一封,全站每 24 小時最多十封;信裡只列站上存在的帳號,打錯的帳號名稱只寫個數。
- 「鎖定與紀錄」:目前鎖定中的位址(可以解鎖、全部解鎖)、最近 7 天被拒的跨站登入來源、最近的紀錄(可以只看某一個 IP)、清空紀錄、把你目前的 IP 加進白名單。每個動作都要有管理網站的權限。
- 後台提醒(只給管理員看):資料表建不起來、最近一小時有查詢失敗(計數表不見了、資料庫回報表不存在但沒辦法再確認、資料庫帳號沒有權限或其他錯誤,提醒會寫是哪一種;計數表不見或沒辦法確認時,管理員下一次打開後台就自動檢查並重建)、資料庫查詢暫時失敗(死結、逾時、連線中斷:只有一次時是黃色的提醒,一小時內一再發生才算「沒有正常作用」)、只少了紀錄表或「鍵+帳號」表(計數與鎖定照常,管理員打開後台時自動補回)、IP 偵測可能沒設好、計數空間用完、計數資料有一部分不見了、其他網站的 Cloudflare Worker 送來登入失敗、被拒的跨站來源一天超過 5 次、通知信寄不出去、清理出錯。查詢失敗的那幾次照常可以登入。
- 不會把自己鎖在外面:WP-CLI 可以解鎖、關掉;在 wp-config.php 把 YS_ADMIN_MENU_LOGIN_GUARD_DISABLED 定義成 true 可以整個停用(每天的清理照樣依保留天數刪掉舊紀錄);白名單;預設門檻寬鬆。
- 拒絕從其他網站送來的登入(建議):登入次數限制底下的子開關,打開登入次數限制時預設勾選,可以單獨取消。別的網站可以讓訪客的瀏覽器替它送出錯誤的登入、把訪客的 IP 鎖住;打開後這種登入直接拒絕、不計數。
- 剛打開的頭 24 小時只記錄、不拒絕,讓你先在「鎖定與紀錄」看到有哪些來源;要提早開始,按「現在就開始拒絕」。
- YS CART headless 前台設定的來源、WordPress 的 allowed_http_origins 自動允許;其他來源可以在「允許跨站登入的來源」加入,或在被拒的來源旁按「允許這個來源」。
- 請特別注意:前台在另一個網域、用 JWT 或 WPGraphQL 這類回傳 token 的方式登入的站,觀察期過後,這些從瀏覽器送來的登入會被擋。請先把前台的網址加進「允許跨站登入的來源」。YS CART 的前台登入會把被擋的原因一律顯示成「帳號或密碼錯誤」,請看「鎖定與紀錄」。
- 訪客 IP 偵測(「登入防護」分頁的「進階:訪客 IP」,預設收合):跟 Wordfence 一樣有多種方式可選,共六種——自動、只用 REMOTE_ADDR、Cloudflare、X-Forwarded-For、X-Real-IP、自訂標頭。
- 自動就是 REMOTE_ADDR,不猜標頭;打開「信任 Cloudflare」時,從 Cloudflare 範圍來的請求才改用 CF-Connecting-IP。
- 標頭模式只在 REMOTE_ADDR 是你加入的「信任的代理」時才看標頭;X-Forwarded-For 從右往左讀,跳過信任的代理,遇到不合法的段落就停。私有位址不會自動被信任。
- IPv4 對應的 IPv6 位址(::ffff: 開頭)與 NAT64 標準前綴 64:ff9b::/96 裡的位址,一律換回內嵌的 IPv4 判斷與計數:只有 IPv6 的主機前面用 NAT64 轉進 IPv4 訪客時,每個 IPv4 訪客照樣分開計算。白名單與「信任的代理」裡請直接填內嵌的 IPv4:填 NAT64 的寫法時,單一位址存起來會變成 IPv4,網段會被判成不合法。
- 「信任 Cloudflare」預設關。只有原站只收自己這個 Cloudflare zone 的流量時才安全,例如用 Authenticated Origin Pulls 或 Cloudflare Tunnel;只把防火牆開給 Cloudflare 的 IP 不夠,其他 Cloudflare 客戶也從那些 IP 連進來。從其他網站的 Cloudflare Worker 送來的請求不採用 CF-Connecting-IP。
- 其他網站的 Cloudflare Worker 送來的登入,一律併成一桶計算,白名單對它們不適用(Worker 帶來的位址不可信)。站方自己掛在另一個網域的 Worker,請用 ys_admin_menu_ip_own_domains 這個 filter 把那個網域加進本站的網域。
- 設定頁的診斷表列出這一次請求的各個標頭、每種選項會得到什麼 IP,並可以一鍵「信任這個代理」。
- 整合用的 ys_admin_menu_client_ip filter:回傳合法、而且跟偵測結果不一樣的位址時採用;伺服器給不出合法的 REMOTE_ADDR 時也會呼叫,可以用它補上訪客的位址。
- Turnstile 照舊用 REMOTE_ADDR:只有勾了「Turnstile 也使用偵測到的 IP」才改用偵測到的 IP。沒勾的站(包括沒存過 IP 設定的站),不管存了哪個分頁,Turnstile 都跟 1.5.2 一樣。
- 登入入口的兩個獨立開關(「登入防護」分頁的「登入入口」,預設都關,跟登入次數限制的總開關無關):「關閉 XML-RPC 登入」(需要帳密的 XML-RPC 方法一律失敗,其他照常)、「停用應用程式密碼」(已建立的保留,關掉就恢復)。
- 「停用應用程式密碼」與登入次數限制的總開關,請用設定頁或 WP-CLI 設定(會寫成自動載入):沒存過設定的站,為了每個請求都不多查資料庫,本外掛只看自動載入的設定。被別的工具改成不自動載入時,前台會先當成「關」,直到管理員下一次打開後台,或執行 wp ys-admin-menu login-guard status,本外掛會把它們改回自動載入。用 pre_option_、default_option_ filter 指定的值照樣有效:交給 default_option_ 的開關,本外掛不會替它寫入預設值(寫了就蓋掉 filter),所以前台每個請求會為它查一次資料庫,要完全不查請用 pre_option_;default_option_ 只在沒有存過值時作用,在設定頁或 WP-CLI 改成別的值之後,以存的值為準。
- 自訂登入頁的樣式(「登入頁」分頁的「樣式」卡片):主色(按鈕、焦點框、表單裡的連結;對比不夠時自動調深或改用深色字)、背景(預設深藍、淺色、自訂顏色;背景圖照樣可用)、左上字標。三項都留空時,登入頁跟 1.5.2 一模一樣。
- WP-CLI:
- wp ys-admin-menu login-guard:status(開關、資料表、IP 偵測、有沒有正常作用;加 --repair 重新建表)、list(--locked、--ip)、unlock(一個 IP 位址或鍵,或 --all;IPv6 位址解它的 /64,打開 /48 彙總時一併解 /48)、allowlist list、add、remove、enable、disable、cleanup、log(--since、--ip)、purge --drop-tables --yes、xmlrpc on 或 off、app-passwords on 或 off。
- wp ys-admin-menu ip check(用指定的 REMOTE_ADDR 與標頭試算每種選項會得到什麼,不改設定)、ip cloudflare-check(手動下載 Cloudflare 公開的 IP 清單跟內建的比對,只印差異,不改設定)。
- 從資料庫來的帳號名稱、來源在印到終端機之前會先清掉控制字元。
- list 與 log 加 --format=json 時用英文鍵(例如 key、last_ip、locked_until、created_at),時間是 UNIX 秒,給腳本用:STDOUT 只有 JSON,沒有資料時印 [],log 超過 500 筆時「只列最新的 500 筆」的說明寫到 STDERR。表格是中文,給人看。
變更
- Turnstile 擋下登入的方式改成跟登入次數限制共用同一個閘門;擋下時的行為跟 1.5.2 一樣。
解除安裝、停用與降版
- 解除安裝一律刪掉登入次數限制的三張資料表(計數、「鍵+帳號」、紀錄,裡面有 IP 與嘗試的帳號名稱),連同內部用的鍵與清理排程,不論有沒有勾「刪除外掛時一併清除所有設定」;多站網路逐站刪。其他新設定照舊:勾了清除才刪。
- 停用外掛:取消每天的清理排程,資料表與設定都留著。
- 降版回 1.5.x 之前,請先在 1.6.0 執行 wp ys-admin-menu login-guard disable,再執行 wp ys-admin-menu login-guard purge --drop-tables --yes:1.5.x 的解除安裝不知道這三張表,之後在 1.5.x 刪外掛,含 IP 與帳號名稱的紀錄會留在資料庫裡。總開關開著時,下一次有管理員打開後台就會重新建表,所以要先關。不能用 WP-CLI 時,先在設定頁取消「啟用登入次數限制」並儲存,再到「鎖定與紀錄」按「清空紀錄」(計數表裡每個位址最後一次的 IP 與帳號名稱還會留著)。新的設定留著不影響 1.5.x。
- 降回 1.5.x 之後,「關閉 XML-RPC 登入」與「停用應用程式密碼」都不再作用:XML-RPC 登入與應用程式密碼會恢復,登入次數限制也不再作用。打開過這兩個開關的站,降版前要先知道,需要的話改用其他方式關閉。
- 匯出檔的格式不變,新設定不在匯出、匯入的範圍內。
已知限制
- IPv6 位址很容易大量取得。攻擊分散在大量 IPv6 網段時,登入次數限制只能把每個網段的猜測速度壓低,沒辦法單獨擋住。請搭配 Cloudflare Turnstile 或 WAF。
- 本外掛的 Turnstile 只保護 wp-login.php,不保護 XML-RPC、REST 與前台表單;不需要 XML-RPC 時,建議打開「關閉 XML-RPC 登入」。
- 只涵蓋走 WordPress 登入流程(wp_authenticate)的登入:外掛自己直接比對密碼的登入(例如 YS CART headless 的 token 端點)不在範圍內;社群登入、單一登入、忘記密碼、註冊不計數。2FA 外掛「需要第二步驗證」的錯誤會被算成一次失敗,可以用 ys_admin_menu_login_guard_should_count 這個 filter 排除。
- 站在代理或 Cloudflare 後面、「進階:訪客 IP」沒設好時,所有人會併成同一桶計算:有人在那條路上猜到門檻時,從那條路登入的人會一起暫停(已經登入的不受影響)。
- 打開「信任 Cloudflare」、而原站沒有限制只收自己這個 zone 的流量時,訪客的 IP 可以被偽造。
- 用標頭判斷訪客 IP 時(Cloudflare、X-Forwarded-For、X-Real-IP、自訂標頭):有些伺服器會把名稱帶底線的標頭跟帶連字號的當成同一個。請確認伺服器會丟掉名稱帶底線的標頭(nginx 預設就會)。
- NAT64 用的是自己網段的前綴(不是 64:ff9b::/96)時,IPv4 訪客會落在同一個 IPv6 /64 一起計算;請用 ys_admin_menu_client_ip 這個 filter 換回內嵌的 IPv4。
- 不支援標準的 Forwarded 標頭(RFC 7239);請用 X-Forwarded-For、X-Real-IP 或自訂標頭。
- 計數空間滿了之後,同一個網段裡在表裡沒有自己紀錄的人,會跟同網段的人一起算。
- 次數用固定的時間窗計算:剛好跨過時間窗交界的那一小段時間,允許的失敗次數會比設定的門檻多。
- 很久沒動的位址被清理(或計數空間滿了、騰出空間)之後,逐次加長的次數從頭算;鎖定中的位址不會被清掉。
- XML-RPC 與應用程式密碼(REST)登入成功時,不會原諒之前打錯的次數;wp-login.php 與前台登入表單的成功登入才會。
- 在登入流程很早的時點(authenticate 優先順序 0 或更早)就自己驗證帳密、設好登入 cookie 的外掛,鎖定擋不住它。
- 常駐的 PHP 執行方式(一個程序連續處理很多個請求,例如 FrankenPHP 的 worker 模式、RoadRunner)不在支援範圍。
- 使用讀寫分離的資料庫外掛(db.php,例如 HyperDB、LudicrousDB)時:計數照樣寫進主庫、讀回同一條連線,不受影響;剛建立的鎖定可能因為讀庫的延遲,晚一點才擋得到;清理用的互斥鎖可能落在讀庫的連線上,清理偶爾會同時跑或略過一次。
- 「停用應用程式密碼」與總開關被別的工具改成不自動載入時,前台會先當成「關」,要等管理員下一次打開後台(或執行 WP-CLI 的 status)才改回來;請用設定頁或 WP-CLI 設定這兩個開關。
- 站方自己掛在另一個網域的 Cloudflare Worker 送來的登入,要用 ys_admin_menu_ip_own_domains filter 加進本站的網域;沒加之前會併成一桶,白名單對它不適用。
- 多站網路是各站分開計算;有外掛在請求中途切換到別的站(switch_to_blog)再登入時,判斷會用到切換後那個站的資料表與設定。
沒有做的
- 設計裡排在最後、可以延後的「設定頁的登入頁小預覽」這一版沒有做;要看樣式請直接開登入頁。
Custom login page card no longer repeats the brand name
變更
- 自訂登入頁的卡片裡不再放品牌小字:卡片裡「登入」標題上面那一行品牌小字跟左側的大標重複(手機上,卡片上方本來就有一行品牌名稱,有 LOGO 時連 LOGO),所以拿掉,卡片直接從「登入」標題開始。
- 已經打開自訂登入頁的站,更新後卡片裡就沒有這行小字,不用改設定。
- 左側大標、標語、頁尾文字、左上的 LOGO 或字標、手機上卡片上方那一行品牌名稱,以及「登入」標題、副標、保持登入、忘記密碼、錯誤與提示訊息、設定新密碼、註冊畫面都不變。後台登入逾時跳出的小視窗一樣只剩標題與副標。
- 白牌設定「登入頁」分頁的「品牌名稱」照舊用在左側大標(手機上是卡片上方那一行),說明文字改成現在的用法;設定的存法與預設值不變。
Saved menu settings now apply to encoded links, refreshed login page and Hub Client 2.0.7
修正
- 網址帶 %xx 編碼的選單,存過的設定沒有生效(1.4.0 以前就有):例如 Rank Math 底下的「說明與支援」、外觀底下的「自訂」。存檔時 WordPress 會把網址裡的 %xx 編碼整段拿掉,存下來的和側欄上實際的網址對不上,所以這些選單的順序、名稱、顏色、移到主選單、複製到主選單都沒有作用,設定頁的表格也一直當成沒存過;「使用者覆寫」的可見清單裡顯示成沒勾,再按一次儲存就從清單裡掉了。「自訂」的網址還帶著目前這一頁的位置,每一頁都不一樣,連隱藏、角色、僅限本人也只在設定頁本身對得上。
- 現在比對時,存下來的和側欄上實際的都先換成同一個比對用的鍵:拿掉 %xx 編碼;「自訂」「頁首」「背景」不看網址裡「目前這一頁」那一段。舊的設定不用重存就生效。
- 「頁首」「背景」的網址裡,& 是用 HTML 實體寫的;設定頁送出時瀏覽器把它還原成一般的 &,存下來的和側欄上實際的就差在這裡。帶 %xx 的網址與「自訂」「頁首」「背景」這類網址,比對前兩邊都先把 HTML 實體還原。
- 網址存檔時不會被改掉的選單(絕大多數)照舊用原字串比對,跟 1.5.0 完全一樣。
- 存法不變:新存的設定和以前同一個樣子,匯出檔、匯入、降回 1.5.0 都相容。
- 外部網址的子選單「複製到主選單」後,複製項的角色、隱藏、僅限本人也套到了原本那一項(1.3.0 起):外部網址的複製項用的就是那個網址,跟原子選單同一個字串,權限判斷把複製項的設定當成原子選單的規則。現在複製項的規則只管複製項,原子選單照它自己的規則。主選單上如果另有同一個網址的項目,設定分不出那一列是誰的,一律算複製項的,也不套到那個項目。
- 外部網址的子選單「移到主選單」後打不開(1.1.0 起):主選單上的連結被組成「admin.php?page=」加上那個網址,點了打不開,原位置的子選單又被拿掉。現在網址是 https:// 這類外部網址的子選單一律不移到主選單,留在原位,以前存下的設定也一樣;設定頁也不再對外部網址的子選單提供「移到主選單」,要放上主選單請用「複製到主選單」。其他子選單的「移到主選單」照舊。
- 原生選單樣式:側欄的子選單文字比上一層名稱偏右,而且每種狀態的起點都不一樣(目前所在的選單、其他展開的群組、手機抽屜各差幾個像素)。現在側欄展開時(含手機抽屜),子選單文字的起點一律對齊上一層名稱;目前所在、滑過的那一列,左邊的白條落在文字前面的留白裡,不會壓到字。收合側欄的浮出子選單、螢幕 960px 以下的自動收合照 WordPress 原本的樣子。
- 樣式設定的「面板左縮排」現在只管 YS CART 的選單抽屜;「左留白」不再把側欄展開時的子選單往右推。
- 站上有新版 Hub client(2.0.4 起,例如新版的 YS CART 附加外掛)時,本外掛對「電商工具箱」的設定被蓋掉:Hub client 在選單的最後把電商工具箱改回固定的名稱、圖示與位置,並把系統資訊、聯絡我們補回、排在最後,所以這裡設的改名、排序、隱藏、角色、僅限本人都沒有作用(綁給別人的系統資訊也會出現)。現在本外掛有設定時,先讓 Hub client 整理一次,再套用本外掛的設定。
變更
- 自訂登入頁改成 YS CRM 登入頁現在的樣子:接近黑的深藍底(寬螢幕左半邊兩團淡藍光暈);左側品牌區(左上放 LOGO,沒有 LOGO 時放網站標題當字標;中間大標與標語;左下頁尾文字);右側白色大圓角登入卡片,欄位與按鈕是膠囊形;手機上品牌名稱在卡片上方、白卡滿寬。「保持登入」「忘記密碼?」、錯誤與提示訊息、設定新密碼、註冊畫面都換成同一套樣子。
- 已經打開自訂登入頁的站,更新後登入頁就是新的樣子。 舊的設定欄位全部照用,不用重填,也沒有新的必填欄位。
- 語言切換預設不顯示:自訂登入頁打開時,WordPress 登入頁最下方的語言選單預設不顯示(已經打開自訂登入頁的站,更新後語言選單會不見)。白牌設定「登入頁」分頁新增「顯示語言切換」,要的話打開。
- 背景圖照樣可用;疊在圖上的深藍比以前深一點、淡色字亮一階,文字對比合乎 AA。
- Turnstile 的驗證框在白色卡片上改用淺色(只改顏色,驗證不變)。
- 登入網址被其他外掛改掉時(例如 WPS Hide Login)照樣套用。只改外觀:登入、登出、密碼、cookie 的流程都沒有動。
- 「僅允許存取受保護的管理選單」照字面:以前只要在「全部選單」分頁存過一次,表上的每一列都被當成「受保護的管理選單」,勾了這個選項的帳號幾乎每一頁都看得到、進得去。現在受保護的只有 YS CART 的頁面(含 YS CART 附加外掛登記給 YS CART 的頁面)、本外掛的頁面,以及用 ys_admin_menu_extra_admin_slugs、ys_admin_menu_external_admin_pages 指定的頁面;綁給這個帳號的「僅限本人」選單照樣看得到。
- 內附的 YS Plugin Hub Client 從 2.0.2 更新到 2.0.7:後台的「YS Plugin」選單改回「電商工具箱」(商店圖示、排在留言後面),同站其他外掛還帶舊版時也一樣,不會出現兩個;外掛市集改走 WordPress REST,更新與下載只接受 yangsheep.com.tw 的網址;系統資訊頁與「由 YANGSHEEP CLOUD 開發與維護」照舊(白牌設定隱藏後台頁尾時照樣不顯示)。需要的 PHP 版本不變(8.0)。
- 後台畫面上的「設置」一律改成「設定」:白牌設定頁的按鈕「儲存白牌設定」、儲存後的提示「白牌設定已儲存。」,以及選單與權限頁分頁列的名稱(讀屏)。只改畫面文字,設定的名稱與存下的值都不變。
升級後會改變的地方(當初存的設定開始生效)
- 請特別注意:「使用者覆寫」的可見清單勾過這類選單的帳號,會變得看得到。這是當初在可見清單裡勾的;升級後請到「使用者覆寫」確認勾選是不是你要的。
- 頂層選單與外觀底下的「自訂」:以前側欄看不到,升級後看得到。「自訂」點進去仍照 1.4.0 的規則判斷:可見清單裡沒有 customize.php 這一頁本身,所以點進去會被擋。這一版沒有改直接開網址的判斷。
- 其他子選單(例如「說明與支援」):1.4.0 起側欄與直接開網址其實已經照勾選放行,這一版只是讓可見清單顯示成已勾。
- 「僅限本人」綁在「自訂」上的:綁定的帳號會變得看得到(跟其他選單一樣,綁定的帳號不受角色與可見清單限制),其他帳號看不到。
- 隱藏、角色:「自訂」設過隱藏或限制角色的,被限制的帳號在側欄會變得看不到(這是當初設的;直接開 customize.php 照 1.4.0 不擋)。其他帶 %xx 的選單,1.4.0 起側欄與直接開網址就已經照這些規則擋,沒有變化。
- 順序、名稱、顏色、移到主選單、複製到主選單:這類選單會照存下的設定排位置、改名、上色、移到主選單或複製到主選單,側欄上的位置與名稱會變。外部網址的子選單例外,不會移到主選單(見下一條)。
- 存過「移到主選單」的外部網址子選單會回到原位:主選單上那個打不開的連結會消失,子選單回到原本的位置。誰看得到,照「全部選單」那一列與上層選單決定;以前在「主選單」分頁替移上去的那一項設的角色、隱藏、僅限本人,照樣有效。要放上主選單請改用「複製到主選單」。
- 「使用者覆寫」的可見清單勾了外部網址的子選單本身、沒勾移到主選單後那個連結的帳號:子選單回到原位後會看得到它,因為這是可見清單裡勾的。
- 設定頁:「全部選單」「主選單」分頁的表格顯示已存的順序、名稱、角色、隱藏;「使用者覆寫」的可見清單顯示已勾。
- 請特別注意:勾了「僅允許存取受保護的管理選單」的帳號(含舊版只允許受保護選單的帳號)會少看到很多頁。側欄看不到,直接開網址也會顯示「此頁面不存在或您無權存取」:控制台(打開後台會直接轉到第一個看得到的 YS CART 頁面)、文章、頁面、媒體、留言、外觀、外掛、使用者(包括自己的個人資料)、工具、設定、電商工具箱,以及 Rank Math 這類跟 YS CART 無關的外掛的選單。YS CART 附加外掛登記給 YS CART 的頁面(例如分潤的撥款管理、一頁商店,以及有聲書、新竹物流)照樣看得到、進得去。單站的管理員不受這個選項影響,跟以前一樣。要讓這類帳號多進某幾頁,用 ys_admin_menu_extra_admin_slugs 加回,或改用「可見清單」。
- 沒裝 YS CART 的站:受保護的只剩本外掛自己的頁面(要有管理網站的權限才進得去),勾了這個選項的帳號在後台幾乎什麼都沒有,打開後台會看到「此頁面不存在或您無權存取」。設定頁原本就這樣提醒,請改用「可見清單」。
- 請特別注意:外部網址的子選單複製到主選單、而且複製項設過角色、隱藏或僅限本人的:原子選單不再跟著被擋,以前因為複製項的設定看不到原子選單的帳號,會變得看得到原子選單;主選單上另有同網址的項目時,那個項目也一樣。複製項本身照它自己的設定。
說明
- 已知限制:「使用者覆寫」的可見清單勾了「自訂」、或「全部選單」把「自訂」設成隱藏或限制角色,只影響側欄;直接開 customize.php 照 1.4.0 的規則判斷(勾了點進去仍會被擋、藏了直接開網址也擋不住)。這一版沒有改直接開網址的判斷。
- 已知限制:外部網址的子選單複製到主選單後,如果來源子選單已經不在(例如那個外掛停用了)、設定裡的複製項還留著,主選單上同網址項目自己那一列的角色、隱藏、僅限本人照樣不套用。只影響外部連結,跟後台頁面的權限無關。
- 同一層裡兩個選單的網址只差 %xx 編碼時(例如一個帶 %20、一個沒有,極少見),舊的存法分不出存的是哪一列:順序、名稱、移到主選單、複製到主選單只套到網址完全相同的那一列;隱藏、角色、僅限本人、可見清單兩列都套用(跟直接開網址的判斷一樣)。
- 1.5.0 說明的更正:遷移前備份的名稱是
ys_admin_menu_config_pre_moves_b1(最後一段是 YS CART 的搬家版本);啟用時改用 YS CART 搬家前備份的,是選單每一列的設定(順序、名稱、顏色、上層與層級、移到主選單、複製到主選單、隱藏與角色等規則,連同哪些列存在)。
Menu settings follow YS CART V3's new menu groups
新增
- 配合 YS CART V3 的新選單分組,自動把你的選單設定搬過去:YS CART V3 把幾個選單換到新的分組——會員等級、購物金設定、購物金總覽、購物金規則搬到「顧客」,購物金活動搬到「優惠促銷」,運輸標籤搬到「訂單」——並拆掉「購物金」這個頂層選單。升級後第一次打開後台,這幾個選單原本設定的順序、自訂名稱、移到主選單、複製到主選單會跟著搬到新位置,側欄從第一個畫面起就是新的。附加外掛(物流、分潤、內容存取等)的頁面不在搬家清單裡,WordPress 選單上的位置不變。
- 原本因為看不到上層選單、所以也看不到這幾頁的角色或帳號,搬到新位置後照樣看不到:看不到「購物金」選單的,在「顧客」與「優惠促銷」底下也看不到購物金的頁面;看不到「促銷活動」選單的,在「顧客」底下看不到「會員等級」;看不到「金物流管理」選單的,在「訂單」底下看不到「運輸標籤」;這些角色或帳號直接開網址或從頁面裡的連結也會被擋。只會更嚴、不會放寬:角色取兩邊都允許的,兩邊沒有共同的角色就改成隱藏(原本勾的角色保留,設定頁看得出來)。
- 上層選單設了「僅限本人」、子選單自己沒設的,子選單沿用上層綁定的帳號。那個帳號原本就看不到這一頁(例如角色不符,或「使用者覆寫」的可見清單沒勾這一頁),就再加上隱藏,不會因為綁定反而多看到。子選單自己原本的「僅限本人」不改。
- 「購物金」頂層原本設的隱藏、角色或「僅限本人」,在「購物金設定」變成「顧客」底下的子選單之後照樣有效。「全部選單」分頁沒有存過「購物金」、只在「主選單(頂層)」分頁設過的,會在「全部選單」補一列帶著這些設定的「購物金設定」(不寫順序),主選單分頁那一列照樣保留。
- 「購物金」頂層原本的自訂名稱是群組名,不會套到「購物金設定」這一頁。
- 原本接在「購物金」後面的複製項、移到主選單的項目,改接在它前面的選單後面,位置不變。
- 新的分組裡已經排過順序的,搬過去的選單接在最後面、依原本的先後;新的分組從沒排過順序的,照 YS CART 的預設順序。
- 搬家完成後的提醒:後台出現一次提醒(只有管理員看得到,按「我知道了」就關掉),列出搬了哪些選單,以及需要你看一下的地方:哪些帳號的「使用者覆寫」可見清單要照新分組重新勾選、哪些頁面搬到的新位置對部分角色看不到、哪些頁面設了「僅限本人」但和原本的上層選單綁的不是同一個帳號(已經先改成隱藏,調整之前只有綁定的管理員帳號看得到;多站網路是超級管理員)、哪些頁面沿用上層的「僅限本人」後只有某個帳號看得到、哪些頁面綁定的帳號原本就看不到所以先改成隱藏(調整之前沒有任何帳號看得到或打得開)、拿掉的群組名稱,以及啟用時改用 YS CART 搬家前那份設定的說明(帳號設定照 YS CART 那份、選單改用搬家前那份、YS CART 原本那份另存在哪、怎麼查看),或沿用了 YS CART 那份設定、裡面用了本外掛看不懂的 V3 新可見規則的選單。
- YS CART V3 的「會員生日」(「顧客」底下、連到「商店設定」生日分頁的那一列)照它連到的「商店設定」判斷誰看得到:看不到「商店設定」的角色或帳號,側欄也不會出現這個連結;「商店設定」設了「僅限本人」時,綁定的帳號也要過得了「商店設定」的隱藏、角色與「使用者覆寫」可見清單才看得到;可見清單勾了「商店設定」就看得到,「使用者覆寫」的可見清單也就不再另外列「會員生日」。「商店設定」自己底下的分頁連結照 1.4.0,看連結自己的設定。只在 YS CART 提供選單搬家對照時(V3 起)才這樣判斷。
- WP-CLI:
wp ys-admin-menu moves status看遷移狀態,wp ys-admin-menu moves dry-run預覽會改哪些設定(不寫入)。
變更
- 「全部選單(含子選單)」分頁:還沒排過順序的子選單(新出現的子選單、搬家後照 YS CART 預設順序的子選單)排在它的上層選單那一組裡,不會再跑到別組中間。從沒排過序的站,畫面與順序數字都跟以前一樣。
- 沒有順序值的子選單不參與排序,留在已排序的子選單後面(以前當成 0,會排到最前面)。匯入設定時也保留「沒有順序值」。
- 「選單與權限」設定頁:搬家遷移之前就打開的設定頁,按「儲存設定」會被拒絕,請重新整理這一頁再存,不會把搬好的設定寫回舊分組。匯入設定不受影響;沒有 YS CART 選單搬家的站照常儲存。
說明
- 只在 YS CART 提供選單搬家對照時(V3 起)才會遷移。搭配舊版 YS CART,或站上沒有 YS CART 時,什麼都不做,側欄與直接開網址都跟 1.4.0 一樣。
- 遷移在第一個完整的後台頁面請求進行(admin-ajax、admin-post 不會觸發),同一版只做一次。同時有兩個請求時只有一個會寫入(遷移時的暫時鎖只由拿到它的請求放掉)。讀到設定之後、寫入之前如果有人剛好按了儲存,這一輪就放棄、不會蓋掉剛存的設定;寫入失敗或讀回來不一樣,也不算完成,下一個請求再試。選單設定寫成之後,才同步給 YS CART 的那份副本。
- 遷移前會把整份選單設定備份在
ys_admin_menu_config_pre_moves_<版本>(每個版本只寫一次、不覆蓋),需要時用它還原;不提供自動還原。另外新增遷移標記ys_admin_menu_moves_applied(自動載入:值很小,每個後台頁面都要讀;後台提醒只在它記著有提醒時才去讀遷移紀錄;沒有 YS CART V3 的站不會遷移,平常後台頁不會多查資料庫)、遷移紀錄ys_admin_menu_moves_log、遷移時的暫時鎖ys_admin_menu_moves_lock(這兩個不自動載入),以及啟用時另存的 YS CART 那份ys_admin_menu_core_copy_pre_activation(不自動載入)。勾了「刪除外掛時一併清除所有設定」時一起刪除;多站網路逐站看那個站自己的勾選。 - 之後的版本如果修了搬家的規則,即使 YS CART 的對照沒變,也會再檢查一次;已經套用的搬家不會重做。
- 「使用者覆寫」的可見清單不會自動修改(自動把新的上層選單加進去,那個人就會看到整組選單),只在提醒裡列出帳號,請自己勾選。可見清單勾了搬家的頁面和它的新分組、但沒勾舊分組的帳號,搬家後會在側欄多看到那幾頁(這些頁面原本直接開網址就能進);勾了搬家的頁面、但沒勾新分組的帳號,側欄會看不到那幾頁(直接開網址仍能進)。
- 「僅限本人」:子選單和原本的上層選單綁了不同帳號時,保留子選單原本綁的帳號、再加上「隱藏」,請到「全部選單」確認誰該看得到。
- 在 YS CART V3 上才第一次存下的設定(已經照新分組設好的),不會替它補隱藏規則。
- YS CART 先升到 V3、本外掛還是 1.4.0 的期間:換到新分組的 6 個選單,原本自訂的順序、名稱、移到主選單與複製到主選單都不會跟過去;原本看不到「購物金」選單的角色或帳號,會在「顧客」與「優惠促銷」底下看到購物金的頁面,看不到「促銷活動」選單的會在「顧客」底下看到「會員等級」,看不到「金物流管理」選單的會在「訂單」底下看到「運輸標籤」;看不到「商店設定」的,會在「顧客」底下看到「會員生日」的連結(點進去仍會被擋)。更新到 1.5.0 後第一次打開後台就會處理這些。更新前請不要在「全部選單」分頁按「儲存設定」:按了只會恢復部分選單的自訂名稱(「購物金設定」會被換成原本「購物金」選單的自訂名稱),移到主選單與複製到主選單不會恢復、還會被排到選單最後,隱藏也不會恢復;之後再更新到 1.5.0,只會補回移到主選單與複製項(要拖回原位),名稱與隱藏要自己重新設定。
- 停用本外掛期間 YS CART 已經升到 V3 的站:YS CART V3 會先照它自己的規則搬一次選單設定。之後啟用本外掛時,只要本外掛自己還沒搬過這一批:
- 帳號設定(「使用者覆寫」的可見清單與「僅允許存取受保護的管理選單」、舊格式的可見清單、舊版只允許受保護選單的帳號清單
hide_for_user_ids)照 YS CART 現在那份帶過來,升級 V3 之後在 YS CART 加的帳號限制照樣有效。 - 選單的順序、名稱、顏色和規則改用 YS CART 搬家前存下的那份,照本外掛的規則重新搬一次,再同步回 YS CART;停用期間、YS CART 升級之前在 YS CART 改過的也會一起帶過來。升級 V3 之後在 YS CART 改的選單設定(包括 V3 的「全部隱藏」等新規則,本外掛看不懂)不會帶過來,要自己重設。
- 換掉之前,YS CART 原本那份會原樣另存在
ys_admin_menu_core_copy_pre_activation(不自動載入;之後再走這條就換成最新的一份),可以用wp option get ys_admin_menu_core_copy_pre_activation查看。後台會提醒一次。YS CART 那份已經不在資料庫裡時(手動刪掉),帳號設定也用搬家前的那份。 - 多站網路「網路啟用」時,只有主站走這段啟用時的處理,其他站照各自留著的本外掛設定遷移。
- 帳號設定(「使用者覆寫」的可見清單與「僅允許存取受保護的管理選單」、舊格式的可見清單、舊版只允許受保護選單的帳號清單
- 本外掛已經搬過這一批(1.5.0 遷移過、停用後由 YS CART 接手),或讀不到 YS CART 的搬家標記與備份時,照 1.4.0 沿用 YS CART 那份設定;其中有 YS CART V3 的新可見規則(全部隱藏、隱藏指定角色、僅限操作本人)時,本外掛看不懂這些規則,後台會提醒一次並列出這些選單,請到「選單與權限」重新設定。全新安裝本外掛、沿用 YS CART 那份設定時也一樣提醒。
- 降回 1.4.0 時:搬家後沒有順序值的子選單,在 1.4.0 會排到那一組最前面;需要時用遷移前的備份還原。YS CART 降回沒有搬家對照的版本時不會自動還原,搬過的設定留在新位置,不會壞。
- 本外掛只認得 YS CART 的搬家版本 b1。YS CART 的搬家版本換成 b1 以外的版本時,本外掛要同時更新,否則啟用時改回 1.4.0 的做法(沿用 YS CART 那份)。
Menu logo, admin bar controls, custom login page and Cloudflare Turnstile login protection
新增
- 白牌:左側選單最上方的 LOGO 區塊:在側欄第一個選單項之前加一塊品牌區,顯示上傳的 LOGO 與可選的站名文字,點了回到控制台。側欄收成圖示列時只留小圖(沒有 LOGO 時顯示名稱的第一個字),不破版。開關
ys_admin_menu_show_menu_logo(預設關),和「LOGO 作為頂層選單圖示」是兩回事、可以並用。 - 白牌:管理 Admin Bar 選單:在白牌設定的「Admin Bar」分頁列出工具列的頂層節點(WordPress 標誌、站點名稱、更新、留言、新增項目、搜尋、你好使用者等,以及外掛加的節點),每一項都可以分別勾「後台隱藏」「前台隱藏」。外掛加的節點會在打開設定頁(後台)與管理員瀏覽前台時自動偵測並列出。
- 白牌:前台 Admin Bar 載入方式:可選「照 WordPress 預設」「完全不載入」「載入並套用前台隱藏清單」,並可限定只有指定角色在前台看得到工具列。只影響前台,後台的工具列不受影響。
- 自訂登入頁(wp-login.php):採 YS CRM 的深藍品牌版面(左側品牌區、右側登入卡片,窄螢幕改單欄)。可設定標題、副標、標語、品牌名稱、登入頁專用 LOGO、背景圖與頁尾文字(可放「由某公司開發與維護」這類說明),並可切換「返回首頁」連結。忘記密碼、註冊、設定新密碼等畫面沿用同一套配色。總開關
ys_admin_menu_login_enabled(預設關)。只改外觀與文字,不改登入流程、不碰帳號密碼的驗證。 - Cloudflare Turnstile 登入防護:在 wp-login.php 的登入(可另外涵蓋註冊、忘記密碼)表單加入 Turnstile 驗證,送出時由伺服器端向 Cloudflare 驗證。Cloudflare 有回應且判定失敗時擋下;連不到 Cloudflare 時依設定處理(寬鬆=放行並記錄,預設;嚴格=擋下)。可設定啟用開關、Site Key、Secret Key、套用範圍。設定頁有「測試設定」可當場確認金鑰正確,並顯示最後一次驗證成功的時間。啟用開關與 Site Key、Secret Key 都填好才會生效,少一個就不顯示、也不會擋登入,避免把自己鎖在外面。只涵蓋 wp-login.php 的表單送出,不含 XML-RPC 與前台自訂登入表單。
修正
- 手機上打開側欄時,選單圖示壓在名稱上(啟用原生選單樣式、視窗寬 782px 以下):每個選單項的圖示和名稱疊在一起。WordPress 在視窗 960px 以下會把選單圖示改成絕對定位(給收合的圖示列用),手機的側欄抽屜也沿用這個設定,靠名稱的左內距讓出位置;原生選單樣式的展開版面把名稱的左內距拿掉、改成圖示與名稱並排,圖示卻沒有回到一般排版。現在展開的側欄(含手機抽屜)圖示一律回到一般排版,和名稱之間留固定間距,與桌機一致。側欄收合成圖示列(按「收合選單」或視窗寬 783–960px)以及停用原生選單樣式時不受影響。這個問題從 1.0.0 就存在,與 WordPress 版本無關。
說明
- 所有新增的開關預設值都讓升級後外觀不變:選單 LOGO 區塊預設關、沒有任何 Admin Bar 節點被隱藏、前台 Admin Bar 照 WordPress 預設、自訂登入頁與 Turnstile 都預設關。
- 新增 option 前綴一律
ys_admin_menu_:白牌show_menu_logo/menu_logo_text/adminbar_hidden/adminbar_seen/frontend_adminbar/frontend_adminbar_roles;登入頁login_enabled/login_brand/login_title/login_subtitle/login_tagline/login_logo_url/login_bg_url/login_footer_text/login_back_link;Turnstileturnstile_enabled/turnstile_site_key/turnstile_secret_key/turnstile_scope/turnstile_mode/turnstile_log/turnstile_health。解除安裝清除時一併涵蓋這些。 - Turnstile 的 Secret Key 以密碼欄位輸入,不會回填、不會顯示在設定頁、不會寫進紀錄或匯出檔;留白=保留已存的值,另有「清除」選項。刪除外掛時一律刪除 Secret Key(不論有沒有勾「刪除外掛時一併清除所有設定」;多站網路逐站刪除;其他設定照勾選保留或清除);重新安裝後要重新填 Secret Key,填好之前 Turnstile 不會生效、也不會擋登入。送往 Cloudflare 的訪客 IP 只採用
REMOTE_ADDR,不信任X-Forwarded-For等標頭(站台在可信任的反向代理後面時,可用ys_admin_menu_turnstile_remote_ipfilter 自行提供)。 - 後端驗證掛在
authenticate,優先序早於 WordPress 的帳號密碼檢查。Cloudflare 有回應且判定失敗時擋下(沒完成驗證、token 無效或用過、Secret Key 錯誤,以及重試後仍是internal-error——寬鬆模式也擋);連不到時依模式處理(寬鬆放行並記錄、嚴格擋下)。擋下時不會因帳號是否存在而給出不同的回應。驗證沒過時,即使其他外掛在驗證過程中自己觸發登入失敗事件、巢狀呼叫wp_authenticate(),或之後由其他驗證外掛回傳使用者,這次登入都不會放行;同一個請求只向 Cloudflare 驗證一次。 - 只涵蓋 wp-login.php 的表單送出(POST);XML-RPC、REST API、WooCommerce「我的帳號」等前台自訂登入表單,以及社群登入/SSO 在 wp-login.php 的 GET 回呼,不在範圍內。
- 站台設定擋住了對 Cloudflare 的連線(
WP_HTTP_BLOCK_EXTERNAL沒放行 challenges.cloudflare.com、主機防火牆、攔截 HTTP 請求的外掛)時,Turnstile 實際上沒有作用:設定頁顯示「目前實際沒有作用」,並在後台對管理員常駐提醒。這種情況不重試;暫時斷線(連線失敗、逾時、HTTP 5xx)才重試一次。事件紀錄同一個原因每分鐘最多寫一次。 - 一個客戶站請用一個 Turnstile widget、在 Cloudflare 設好網域白名單,不要多站共用同一組金鑰。需要額外比對網域時,可用
ys_admin_menu_turnstile_expected_hostnamesfilter 回傳網域清單(預設不比對)。 - 隱私:啟用 Turnstile 後,登入頁與前台使用
wp_login_form()的頁面都會載入 Cloudflare 的腳本(challenges.cloudflare.com)。 - 緊急關閉:在 wp-config.php 定義
YS_ADMIN_MENU_TURNSTILE_DISABLED為 true,或把ys_admin_menu_turnstile_enabled設回no,即可暫停 Turnstile。 - 「隱藏」是整理介面用的,不是權限:隱藏 Admin Bar 節點只是工具列上看不到,功能本身照常可以用。
Copied and moved submenu items become draggable top-level rows
變更
- 「複製到主選單」改成像 Admin Menu Editor 那樣:在「全部選單(含子選單)」分頁按子選單列的「複製到主選單」,會當下就在下方清單裡插入一列完整的頂層選單列(緊接在原父選單那一組之後),不重新整理、不用切分頁。這列可以直接拖拉排到想要的位置,也可以改顯示名稱、換圖示、限制角色、隱藏、刪除複製;按一次「儲存設定」全部存好,重新整理後順序與設定一致,側欄順序也一致。原本把複製項卡在最上方、拖不動、要切到另一個分頁才能排序的「複製區」已移除。
- 「移到主選單」也一致:按子選單列的「移到主選單」會當下把它換成下方清單裡的一列頂層選單列(原位置移除),可直接拖拉定位、改名、換圖示、限制角色、隱藏;按「移回原位」還原。原本的「提升區」已移除。
- 兩者都可以拖到任意頂層選單後面,位置以「接在哪個頂層項後面」記錄(after),所以重新整理與側欄順序一致。「父選單預設頁」(例如「設定 → 一般」)一樣可以複製。
新增
- 設定有未儲存的變更時,離開或重新整理頁面會先提醒。
說明
- 資料沿用
top_copies.items(哪些子選單複製到主選單)與wp_native.items的./代稱列(複製項的位置/名稱/圖示/角色/隱藏);新增after欄位記錄位置。舊版(1.3.0/1.3.1)的複製項升級後照樣出現在原本的位置。複製列的位置由「全部選單」分頁負責;「主選單(頂層)」分頁仍可排序、改名、換圖示。
Fix arrow and triangle positions on the expanded admin menu
修正
- 側欄的小箭頭、小三角形貼著列的右緣(啟用原生選單樣式、側欄展開時):
- 目前所在的選單,右側的展開/收合箭頭貼在列的最右緣,比其他選單的箭頭少了一整段右內距。現在所有狀態(目前所在、展開、收起、滑過)的箭頭都在同一個位置。原因是 WordPress 核心替目前所在選單的連結另外定了一個絕對定位的小三角形,樣式沒有把它取消。
- 點箭頭展開選單、或用鍵盤移到選單上時,列的右緣會多出一個深色小三角形(WordPress 核心用來指向飛出子選單的三角形;這個樣式的子選單是手風琴,沒有飛出子選單)。目前所在的選單若沒有子選單,列的右緣也會有一個淺灰色小三角形。這兩種三角形在展開的側欄裡不再顯示。
- 側欄收成圖示列(按了「收合選單」,或視窗寬 783–960px)以及停用原生選單樣式時沒有變動,維持 WordPress 原生的外觀與飛出子選單。
Copy or move submenu items to the top-level menu
新增
- 子選單「複製到主選單」:「全部選單(含子選單)」分頁的每個子選單列多了「複製到主選單」按鈕,也可以把該列拖到新的「複製區」。原子選單保留在原位,主選單另外多一個連到同一頁的項目,預設排在原父選單正下方。
- 儲存後,複製項在「主選單(頂層)」分頁標示「複製」,可以像其他頂層選單一樣排序、改名、套色、限制角色、隱藏,也可以換圖示(常用圖示一鍵選,或直接貼 dashicons/圖片網址)與刪除。刪除複製項不影響原子選單。
- 連結和「移到主選單」一樣用原生父層組合的網址,頁面、權限、外掛的頁面掛鉤都照舊。
- 同一個子選單只能複製一次(與 Admin Menu Editor「頂層連結不得重複」的規則一致)。
- 誰看得到:原子選單看得到、進得去的帳號才會看到複製項。原子選單被隱藏、限制角色、設了「僅限本人」或不在使用者覆寫的可見清單裡時,複製項也不出現;複製項自己的隱藏、角色、僅限本人只影響複製項,不會擋住頁面。
- 目前所在的高亮:同一頁只標一個。原位置優先(原父選單展開、原子選單標為目前頁);原父選單對這個帳號隱藏時,改標複製項。
- 「父選單預設頁」(例如「設定 → 一般」「文章 → 所有文章」)現在也列在「全部選單」分頁,可以複製;它的排序、隱藏、角色仍由父選單那一列決定。
- 「移到主選單」按鈕:子選單列多了明顯的「移到主選單」按鈕,等同勾選「升頂層」,與勾選框、提升區雙向同步;提升後按鈕變成「移回原位」。
修正
- 子選單拖不進空的提升區:提升區裡只有說明列時,把子選單列拖過去放不進去(拖拉一直被擋下);現在放開就會提升。
- 提升區裡的列按「×」沒有反應:現在可以從清單移除。
- 取消提升時,該列會放回原父選單那一組,不再接到整張表的最後面。
說明
- 設定資料新增
top_copies.items[](每筆只記來源slug、parent_slug);複製項在主選單的設定存在wp_native.items[],slug是./開頭的選單代稱,並新增icon欄位(只在有設定時才存)。舊設定照常運作;匯出、匯入、解除安裝清除都涵蓋這些欄位,儲存時頁面上沒列出的複製項原樣保留。 - 停用本外掛、由 YS CART 內建選單管理接手時,不會顯示複製項(其他設定照常)。
Fix collapsed sidebar, promoted submenu access and user override lockout
修正
- 側欄收成圖示列時破版、圖示點不進去:啟用原生選單樣式後,視窗寬 783–960px(平板直式、把瀏覽器縮成半個螢幕)或按了「收合選單」時,目前所在選單的子選單會被擠進圖示列裡、蓋到內容,有子選單的圖示點了也不會進頁面。現在圖示列交還 WordPress 原生的版面:點圖示進頁面,滑過顯示飛出子選單。
- 停用原生選單樣式後,選單右側點了沒反應、手機上子選單打不開:停用時不再載入收放用的腳本與樣式,後台完全回到 WordPress 原生的操作。
- 子選單「升頂層」後進不去:原本掛在外掛頂層選單底下的子頁(網址是
admin.php?page=…)提升後,所有人點進去都是「沒有存取這個頁面的權限」。現在提升後照常開啟。 - 使用者覆寫:
- 新增使用者時不再預設勾選「僅允許存取受保護的管理選單」。沒有安裝 YS CART 的站上,這個選項會讓該使用者進不了後台的任何頁面;卡片上補了說明。
- 設了可見清單的使用者,現在打得開清單裡各列表頁底下的編輯畫面(文章、頁面、分類項目、媒體)與上傳;以前看得到列表、卻開不了任何一筆。清單裡的頁面送出表單(
admin-post.php)也不再被擋。
- 隱藏的頁面可以用網址繞過:在網址的
page前後多加一個斜線,被隱藏的頁面會照常開啟。現在與 WordPress 用同一個值判斷。 - 儲存設定會刪掉看不到的列:設定頁只列得出目前登入者的側欄裡有的選單。其他管理員設成「僅限本人」的列、暫時停用的外掛的選單、只有其他角色才有的選單,以前按一次儲存就整列消失;現在原樣保留(自己按 × 移除的列仍會移除)。
- 控制台被隱藏的人一登入就看到 404:改成送到他看得到的第一個選單。
- 「原生選單樣式」在預設值下存不了:子選單行高的預設值 1.45 不符合欄位的間距設定,瀏覽器會擋下儲存。行高欄位的間距改為 0.05。
- 分組標籤幾乎看不見、字級設定沒有作用:預設的淡化被套了兩層;字級與粗細只套到外層、沒套到文字。現在預設對比約 6:1,字級與粗細設定會生效。側欄收成圖示列時不再留下空白的標籤列;用鍵盤也不會再聚焦到標籤上。
- 整組選單都看不到時,分組標籤仍然顯示:現在會一併收掉。
- 「顏色」欄對 WordPress 內建選單沒有作用:內建選單(控制台、文章、頁面…)現在會套用顏色;啟用原生選單樣式時文字與圖示也會跟著變色。
- 匯出再匯入後側欄樣式被關掉:從沒存過樣式的站,匯出檔現在帶完整的樣式內容,匯入後外觀與來源站一致。
- 白牌「隱藏 WordPress LOGO」只在後台生效:前台的工具列現在也會隱藏。
- 勾了「刪除外掛時一併清除所有設定」仍有殘留:現在會連同本外掛建立的輔助設定一起刪除(站上沒有 YS CART 時,包含設定副本
ys_ec_menu_config)。
新增
- 工具列跟著選單規則走:選單對某個帳號隱藏時,上方工具列指向同一頁的連結(例如留言圖示、「新增項目」底下的項目)也一併拿掉,不留點了是 404 的入口。
變更
- 設定 API 的權限 filter
ys_admin_menu_rest_capability只能收緊:manage_options一律必須具備。 - 「原生選單樣式」頁的說明改為實際行為:啟用後桌機寬版的側欄寬度是 300px,子選單改為點箭頭收放。
注意
- 「隱藏」是整理介面用的,不是權限:隱藏頂層選單不會擋住它底下的子頁,子頁請到「全部選單(含子選單)」分頁各自設定;真正要禁止的功能請調整角色權限。
v1.2.3 - 修正 Hub Client HPOS 宣告
修正
移除 vendored YS Plugin Hub Client 內無效的 WooCommerce HPOS 相容宣告。
問題
該宣告以自身 vendor 檔路徑呼叫 FeaturesUtil::declare_compatibility( 'custom_order_tables', __FILE__ ),
但 vendor/yangsheep/ys-plugin-hub-client/ys-plugin-hub-client.php 並非已註冊外掛主檔,
WooCommerce FeaturesController 因此在每個 request 記錄一次:
ERROR FeaturesController: Invalid plugin file '.../vendor/yangsheep/ys-plugin-hub-client/ys-plugin-hub-client.php' for feature 'custom_order_tables'.
雜訊會洗掉 plugin-woocommerce log channel、埋沒真正的錯誤訊息,並造成額外磁碟 I/O。
影響範圍
不影響交易、訂單或付款流程。
修法
該宣告因指向非註冊檔而從未生效,移除為零行為變更——不會有任何外掛因此變成「與 HPOS 不相容」;
HPOS 相容性本就應由各外掛主檔自行宣告。
- vendor loader diff:
+0/-13(僅該宣告區塊;activation hook/autoloader/schema fallback/ys_hub_client_loaded全數保留) - bundled Hub Client 版本刻意維持
2.0.2:僅移除死碼,未引入後續版本的中央正名與選單正規化行為
封裝
ys-admin-menu.zip(46 entries)- SHA-256:
7F10F8BE84F7CD25D4DB30D3D7642D1CD0FC0ABB36B9FBEFBB97A4CB4CCDE403