Skip to content

Releases: Ya19880104/ys-admin-menu

Login attempt limits, visitor IP detection, login page styles and login entrance switches, all off by default

Choose a tag to compare

@Ya19880104 Ya19880104 released this 21 Oct 11:34

這一版的新功能全部預設關閉。 更新到 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

Choose a tag to compare

@Ya19880104 Ya19880104 released this 20 Oct 03:28

變更

  • 自訂登入頁的卡片裡不再放品牌小字:卡片裡「登入」標題上面那一行品牌小字跟左側的大標重複(手機上,卡片上方本來就有一行品牌名稱,有 LOGO 時連 LOGO),所以拿掉,卡片直接從「登入」標題開始。
    • 已經打開自訂登入頁的站,更新後卡片裡就沒有這行小字,不用改設定。
    • 左側大標、標語、頁尾文字、左上的 LOGO 或字標、手機上卡片上方那一行品牌名稱,以及「登入」標題、副標、保持登入、忘記密碼、錯誤與提示訊息、設定新密碼、註冊畫面都不變。後台登入逾時跳出的小視窗一樣只剩標題與副標。
    • 白牌設定「登入頁」分頁的「品牌名稱」照舊用在左側大標(手機上是卡片上方那一行),說明文字改成現在的用法;設定的存法與預設值不變。

Saved menu settings now apply to encoded links, refreshed login page and Hub Client 2.0.7

Choose a tag to compare

@Ya19880104 Ya19880104 released this 20 Oct 01:44

修正

  • 網址帶 %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

Choose a tag to compare

@Ya19880104 Ya19880104 released this 18 Oct 05:35

新增

  • 配合 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

Choose a tag to compare

@Ya19880104 Ya19880104 released this 16 Oct 03:51

新增

  • 白牌:左側選單最上方的 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;Turnstile turnstile_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_ip filter 自行提供)。
  • 後端驗證掛在 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_hostnames filter 回傳網域清單(預設不比對)。
  • 隱私:啟用 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

Choose a tag to compare

@Ya19880104 Ya19880104 released this 15 Oct 10:55

變更

  • 「複製到主選單」改成像 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

Choose a tag to compare

@Ya19880104 Ya19880104 released this 14 Oct 15:03

修正

  • 側欄的小箭頭、小三角形貼著列的右緣(啟用原生選單樣式、側欄展開時):
    • 目前所在的選單,右側的展開/收合箭頭貼在列的最右緣,比其他選單的箭頭少了一整段右內距。現在所有狀態(目前所在、展開、收起、滑過)的箭頭都在同一個位置。原因是 WordPress 核心替目前所在選單的連結另外定了一個絕對定位的小三角形,樣式沒有把它取消。
    • 點箭頭展開選單、或用鍵盤移到選單上時,列的右緣會多出一個深色小三角形(WordPress 核心用來指向飛出子選單的三角形;這個樣式的子選單是手風琴,沒有飛出子選單)。目前所在的選單若沒有子選單,列的右緣也會有一個淺灰色小三角形。這兩種三角形在展開的側欄裡不再顯示。
    • 側欄收成圖示列(按了「收合選單」,或視窗寬 783–960px)以及停用原生選單樣式時沒有變動,維持 WordPress 原生的外觀與飛出子選單。

Copy or move submenu items to the top-level menu

Choose a tag to compare

@Ya19880104 Ya19880104 released this 14 Oct 13:57

新增

  • 子選單「複製到主選單」:「全部選單(含子選單)」分頁的每個子選單列多了「複製到主選單」按鈕,也可以把該列拖到新的「複製區」。原子選單保留在原位,主選單另外多一個連到同一頁的項目,預設排在原父選單正下方。
    • 儲存後,複製項在「主選單(頂層)」分頁標示「複製」,可以像其他頂層選單一樣排序、改名、套色、限制角色、隱藏,也可以換圖示(常用圖示一鍵選,或直接貼 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

Choose a tag to compare

@Ya19880104 Ya19880104 released this 06 Oct 18:33

修正

  • 側欄收成圖示列時破版、圖示點不進去:啟用原生選單樣式後,視窗寬 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 宣告

Choose a tag to compare

@Ya19880104 Ya19880104 released this 28 Jul 06:07

修正

移除 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