=== 一介資男(Mxp.TW) 開發工具箱 ===
Contributors: mxp
Donate link: https://mxp.tw/lw
Tags: development, snippets, database, migration, security
Requires at least: 5.6
Requires PHP: 7.4
Tested up to: 7.1
Stable tag: 3.6.9
License: GPLv3
License URI: https://www.gnu.org/licenses/gpl-3.0.html

WordPress 開發與維運工具箱，整合外掛安裝、資料庫維護、搬站輔助、安全片段、站點管理與前端問題回報。

== Description ==

一介資男(Mxp.TW) 開發工具箱不是單一功能外掛，而是一個 WordPress 開發、維運、搬站與站點管理工具包。套件內含主要工具箱與四個可獨立啟用的子外掛，讓管理員只啟用目前站台需要的能力。

= 套件架構 =

* `Dev Tools - Mxp.TW`：主要工具箱。提供外掛/主題安裝、打包、取代、資料庫維護、網站設定檢視與檔案異動檢查。
* `Dev Tools: Snippets - Mxp.TW`：常用維運片段。集中處理安全強化、登入/後台調整、媒體上傳政策、報告排程與網域到期檢查。
* `Dev Tools: Site Manager - Mxp.TW`：多站管理輔助。匯出/匯入站台資訊，並以 passkey、加密 token 與 HMAC 提供跨站快速登入。
* `Dev Tools: Hide Login Page - Mxp.TW`：登入路徑防護。將預設登入入口改為自訂路徑，並把原始登入與未登入後台入口導向 404。
* `Dev Tools: Feedback Reporter - Mxp.TW`：登入用戶全站問題回報。前台與後台可擷取目前頁面、錄製短片、標註截圖、填寫描述後由本站安全轉送 webhook。

= Dev Tools - Mxp.TW（主要工具箱） =

主要工具箱面向高權限管理員與開發者，功能集中在「安裝、搬站、檢查、替換」：

* 開發常用外掛清單：從遠端清單與 WordPress.org API 取得外掛資訊，支援安裝、更新與啟用。
* Themeforest List：輸入 Envato 或 MXP 授權碼後，列出可下載的主題、外掛與其他檔案，並支援線上安裝。
* 外掛搜尋工具：在後台嵌入作者整理的外掛搜尋介面，從可信來源帶回下載連結後安裝。
* 外掛/主題打包：可從外掛列表、主題工具、最近異動檔案、`wp-content` 或 `wp-config.php` 產生 ZIP 下載。
* 外掛/主題取代：上傳 ZIP 後解析外掛或主題資訊，比對既有項目，取代前建立備份，失敗時回滾。
* 調整內容作者工具：依 Post Type 批次改寫內容作者。
* 查看網站各項設定：顯示外部網路資訊、`wp-config.php` 常數、使用者定義常數、`.htaccess` 與 `.user.ini`。
* 主機 PHP 設定：在 `phpinfo()` 可用時顯示 PHP/主機設定。
* 資料庫檢視與匯出：列出資料庫與資料表，支援單表、全表、背景 SQL 匯出與 `wp-content` 打包。
* 資料庫關鍵字取代：以 Search Replace DB 類別處理序列化資料安全的預覽與實際取代。
* WP 資料庫最佳化：檢視大型 autoload options，清理 orphan/duplicate meta、未使用 option、使用者 metabox，也提供重置 WordPress 的高風險操作。
* 查看最近變更檔案：掃描並分類近期異動的核心、上傳、主題、外掛與其他檔案。
* Hook 執行時間除錯：登入狀態下加上 `?debug` 時，在 admin bar 顯示 hook 執行時間統計。

= Dev Tools: Snippets - Mxp.TW（常用片段與站台行為） =

Snippets 子外掛會直接接管多個 WordPress hook，適合用 `wp-config.php` 先定義 `MDT_*` 常數後再啟用。

* 安全強化：停用 XML-RPC、隱藏 REST 使用者資料、移除多種前端 metadata/oEmbed/shortlink 輸出、隱藏作者資訊與頭像、停用 self-ping。
* HTTP 標頭：可輸出 frame-options、XSS protection、content type options、cross-domain policy 與 HSTS 類型標頭。
* 檔案修改保護：預設啟用 `DISALLOW_FILE_MODS` / `DISALLOW_FILE_EDIT`，並保護指定管理員不被一般後台列表、編輯、刪除或降權流程影響。
* 登入與後台調整：登入頁 Logo、登入後導向、管理信箱同步、註冊開關、封鎖使用者登入、顯示內容/分類/使用者 ID、使用者註冊時間欄位、隱藏非管理員更新提示與 Customize 選單。
* 媒體與上傳政策：可停用縮圖產生、停用大圖縮放、上傳圖片大小限制、自動填入圖片標題/alt/content，並對特權管理員與一般使用者套用不同的檔案大小與 MIME 規則。
* Bot/垃圾防護：登入、註冊、WooCommerce 與留言表單加入 honeypot 與時間戳檢查。
* 前台 Basic Auth：可啟用簡易前台驗證，並以指定 query key/cookie 暫時略過。
* 外部 HTTP 請求管控：可封鎖指定網域，或啟用全域封鎖後只允許白名單。
* 站台健康回報與自動更新排程：可透過排程回報站台資訊，也可在排程內更新指定外掛。
* 網域到期檢查：Dashboard widget 顯示 `home_url()`、`site_url()`、多站、額外指定網域與 filter 網域的 RDAP/WHOIS 結果，包含到期日、註冊商、狀態、DNSSEC、Name Server、原始資料與通知狀態。

網域到期檢查常用設定：

* `MDT_DOMAIN_EXPIRY_CHECK`：是否啟用網域到期檢查，預設 `true`。
* `MDT_DOMAIN_EXPIRY_NOTICE_DAYS`：到期通知門檻，預設 `90, 60, 30, 14, 7, 3, 1` 天。
* `MDT_DOMAIN_EXPIRY_EXTRA_DOMAINS`：額外指定檢查網域，支援陣列或逗號分隔字串。
* `MDT_DOMAIN_EXPIRY_OBSERVE_HOSTS`：是否自動記錄非設定來源的 HTTP_HOST，預設 `false`。
* `MDT_DOMAIN_EXPIRY_OBSERVED_HOST_RETENTION_DAYS`：觀察到的 HTTP_HOST 紀錄保留天數，預設 `180`。
* `MDT_DOMAIN_EXPIRY_MAX_DOMAINS_PER_RUN`：單次排程最多查詢數量，預設 `20`。
* `MDT_DOMAIN_EXPIRY_STORE_RAW_DATA`：是否儲存 RDAP/WHOIS 原始資料，預設 `true`。

= Dev Tools: Site Manager - Mxp.TW（多站管理） =

Site Manager 用來把多個 WordPress 站台整理成一張管理表。

* 匯出目前站台資訊：包含站台 URL、站名、管理員信箱、IPv4、IPv6、DNS A/NS 記錄與 Whois/網域到期資訊。
* 匯入其他站台匯出的設定字串，儲存在 `mxp_dev_sites_info_db` 站台選項。
* 管理表以 DataTables 顯示站台 URL、站名、信箱、IP、DNS、網域到期日與操作。
* 快速登入：對已匯入站台產生加密 token 與 HMAC，POST 到目標站後由目標站驗證 passkey 與 15 秒時間窗，再登入最高權限管理員。
* 重置站台密鑰：刪除本機 passkey 並在下次使用時重建；既有匯出字串會因此失效。
* 支援單站 Tools 頁面與 multisite Network Admin 頁面。

匯出的字串包含 passkey。請只在可信任管理員與可信任傳輸渠道中保存或分享。

= Dev Tools: Hide Login Page - Mxp.TW（登入路徑防護） =

Hide Login Page 沒有設定頁，透過常數控制：

* `MDT_LOGIN_PATH`：預設 `admin-staff`，登入網址會變成 `/admin-staff/`；未啟用 pretty permalink 時使用 `/?admin-staff`。
* `MDT_LOGIN_PATH_DISPLAY`：預設 `true`；設為 `false` 時可在外掛列表隱藏此子外掛。

啟用後，`wp-login.php`、`/login`、`wp-register`、`wp-activate` 與非 multisite 的 `wp-signup` 會走 404 流程；未登入的 `/wp-admin/` 請求也會被導到 `/404`。此外掛也會改寫 WordPress 產生的登入 URL、redirect URL、welcome email 中的登入連結，以及 WooCommerce 密碼重設連結。

= Dev Tools: Feedback Reporter - Mxp.TW（全站問題回報） =

Feedback Reporter 沒有設定頁，透過 `MDT_FEEDBACK_REPORTER_*` 常數控制。啟用外掛後預設啟用回報功能；只允許登入並符合 role / user ID 規則的使用者在前台與後台看到回報入口。若要關閉，可在 `wp-config.php` 將 `MDT_FEEDBACK_REPORTER_ENABLE` 定義為 `false`。

* 前台使用明確的「回報問題」浮動按鈕；後台使用低干擾的小型「回報」入口，避免遮住主要操作或一直提醒使用者回報。
* 使用者點擊後才啟動回報流程，可選擇擷取目前頁面「當下捲動視野」，或開啟獨立錄影控制器錄製最長 60 秒短片；控制器留在獨立視窗中，原頁跳轉或重新整理不會中斷錄影，錄影中會顯示倒數與停止按鈕，不必錄滿一分鐘。
* 截圖模式可在截圖上畫框、箭頭、文字、自由畫筆與馬賽克；錄影模式會送出錄影檔與自動產生的封面截圖。若自動 DOM 截圖無法呈現互動畫面，可上傳 PNG/JPEG/WebP 或從剪貼簿貼上外部截圖取代，再填寫問題描述。
* 前端只送到本站 REST endpoint；webhook URL 與 secret 不會輸出到瀏覽器。
* WordPress server-side 驗證登入、nonce、role/user ID、rate limit、截圖與錄影 MIME，並在 webhook 前重新檢查與壓縮截圖大小；未設定 webhook 時仍會保存本機 log/截圖/錄影，設定 webhook 後才送出外部通知；匿名回報也會保存解析後的回報 IP 與 IP hash，方便追蹤濫用來源。
* 回報 IP 會優先使用可信任反向代理還原出的真實用戶 IP：預設會從 Cloudflare 官方 `ips-v4` / `ips-v6` 清單取得並快取可信 edge CIDR，抓取失敗時才回退到內建 Cloudflare 範圍；只有當 `REMOTE_ADDR` 落在可信代理 CIDR 內才讀取 `CF-Connecting-IP`、`CF-Connecting-IPv6`、`True-Client-IP`、`X-Real-IP`、`Forwarded` 或 `X-Forwarded-For`，避免直接打到 origin 的請求偽造 client IP header。若 origin 已由防火牆限制只能經 Cloudflare 進站，也仍建議保留此閘門作為防呆；不建議無條件信任 header。
* log 目錄預設在 `wp-content/uploads/mxp-dev-tools/feedback-reporter/`，每次回報會寫入不可預測的隨機子目錄與隨機檔名；Apache/LiteSpeed 會透過 `.htaccess` 關閉目錄列表並拒絕 JSON log 直連，但允許圖片/影片媒體檔讓內部 webhook 連結可直接開啟，nginx 需由站台自行決定是否加上等效規則；再依保留天數與檔案數上限自動清理，移除 Feedback Reporter 子外掛時預設會刪除 log/截圖/錄影。
* Discord webhook 會以附件方式上傳截圖並在訊息中預覽；Slack incoming webhook 只送出 JSON + Block Kit 文字欄位與 Log / 檔案連結，不使用 image block，避免站台圖片 URL 被主機資安策略阻擋時造成整包通知失敗。

常用常數：

* `MDT_FEEDBACK_REPORTER_ENABLE`：是否啟用全站回報，預設 `true`；可設為 `false` 關閉。
* `MDT_FEEDBACK_REPORTER_ADMIN_ENABLE`：是否在 `wp-admin` 輸出低干擾後台回報入口，預設 `true`。
* `MDT_FEEDBACK_REPORTER_ADMIN_BUTTON_MODE`：後台入口樣式，預設 `subtle-tab`，另可用 `compact-pill`。
* `MDT_FEEDBACK_REPORTER_WEBHOOK_URL`：接收回報的 webhook URL；預設要求 HTTPS，未設定時仍可回報並保存本機 log/截圖/錄影，但不送出外部通知。
* `MDT_FEEDBACK_REPORTER_WEBHOOK_FORMAT`：webhook payload 格式，預設 `auto`；Discord 與 Slack incoming webhook URL 會自動送出相容格式，也可設為 `generic`、`discord` 或 `slack`。
* `MDT_FEEDBACK_REPORTER_WEBHOOK_SECRET`：webhook HMAC 簽章 secret，預設空字串。
* `MDT_FEEDBACK_REPORTER_WEBHOOK_REQUIRE_HTTPS`：是否要求 webhook URL 使用 HTTPS，預設 `true`；設為 `false` 時可接受 HTTP，但仍會拒絕 private/reserved IP。
* `MDT_FEEDBACK_REPORTER_WEBHOOK_SSL_VERIFY`：是否驗證 HTTPS 憑證，預設 `true`；設為 `false` 時可接受自簽憑證。
* `MDT_FEEDBACK_REPORTER_ALLOWED_ROLES`：允許回報的角色，預設 `administrator`。
* `MDT_FEEDBACK_REPORTER_ALLOWED_USER_IDS`：額外允許回報的使用者 ID。
* `MDT_FEEDBACK_REPORTER_DENIED_USER_IDS`：禁止回報的使用者 ID，優先權最高。
* `MDT_FEEDBACK_REPORTER_DENIED_PATHS`：不輸出回報入口的 path prefix，預設只排除 `/wp-login.php`。
* `MDT_FEEDBACK_REPORTER_LOG_RETENTION_DAYS`：本機 log/截圖/錄影保留天數，預設 `30`。
* `MDT_FEEDBACK_REPORTER_MAX_LOG_FILES`：本機 log/截圖/錄影檔案數上限，預設 `500`。
* `MDT_FEEDBACK_REPORTER_TRUST_PROXY_HEADERS`：是否在可信反向代理後方解析真實用戶 IP，預設 `true`。
* `MDT_FEEDBACK_REPORTER_TRUSTED_PROXY_CIDRS`：Cloudflare 官方清單抓取失敗時使用的 fallback Cloudflare 代理 CIDR；此閘門是為了防止繞過 CDN 直打 origin 時偽造 `CF-Connecting-IP` / `X-Forwarded-For`。
* `MDT_FEEDBACK_REPORTER_ADDITIONAL_TRUSTED_PROXY_CIDRS`：額外信任的自家 proxy / load balancer CIDR，會與 Cloudflare 官方清單合併；為相容舊設定，若 `MDT_FEEDBACK_REPORTER_TRUSTED_PROXY_CIDRS` 內含不屬於內建 Cloudflare fallback 的 CIDR，也會視為額外可信代理。
* `MDT_FEEDBACK_REPORTER_CLOUDFLARE_IPS_AUTO_UPDATE`：是否自動抓取 Cloudflare 官方 IP 清單更新可信代理 CIDR，預設 `true`。
* `MDT_FEEDBACK_REPORTER_CLOUDFLARE_IPS_CACHE_TTL`：Cloudflare IP 清單快取秒數，預設 7 天；抓取失敗時使用上一份有效 transient 或 `MDT_FEEDBACK_REPORTER_TRUSTED_PROXY_CIDRS` fallback。
* `MDT_FEEDBACK_REPORTER_CLOUDFLARE_IPS_V4_URL` / `MDT_FEEDBACK_REPORTER_CLOUDFLARE_IPS_V6_URL`：Cloudflare IP 文字清單來源，預設 `https://www.cloudflare.com/ips-v4` 與 `https://www.cloudflare.com/ips-v6`。
* `MDT_FEEDBACK_REPORTER_MAX_VIDEO_SECONDS`：錄影模式最長秒數，預設 `60`。
* `MDT_FEEDBACK_REPORTER_MAX_VIDEO_BYTES`：錄影檔案大小上限，預設 `50 MiB`。
* `MDT_FEEDBACK_REPORTER_DELETE_LOGS_ON_UNINSTALL`：移除 Feedback Reporter 子外掛時是否刪除 log/截圖/錄影，預設 `true`。

= 使用風險 =

* 此套件設計給可信任管理員、開發者與站台維護者使用，不適合開放給一般後台使用者。
* 搜尋取代、資料庫最佳化、WordPress 重置、批次改作者、外掛/主題取代都會改寫資料或檔案；操作前請先確認備份可還原。
* 主要工具箱會讀取並顯示 `wp-config.php`、`.htaccess`、`.user.ini`、PHP 設定與資料庫資訊。
* `ZipArchive`、網路連線、檔案系統權限與主機 PHP 限制會影響打包、匯出、安裝、替換與前端回報轉送功能。

== Installation ==

1. Upload the plugin files to the `/wp-content/plugins/mxp-dev-tools/` directory, or install the plugin from the WordPress Plugins screen.
2. Activate the main `Dev Tools - Mxp.TW` plugin through the **Plugins** screen in WordPress.
3. Activate optional sub-plugins only when needed: `Dev Tools: Snippets - Mxp.TW`, `Dev Tools: Site Manager - Mxp.TW`, `Dev Tools: Hide Login Page - Mxp.TW`, or `Dev Tools: Feedback Reporter - Mxp.TW`.
4. Open 「開發工具箱」 or the relevant sub-plugin admin page in the WordPress admin menu.
5. For advanced behavior, define the documented `MDT_*` constants in `wp-config.php` before WordPress loads.

== Frequently Asked Questions ==

= Why are there multiple plugin entries after installation? =

The package intentionally contains a main plugin plus optional sub-plugins. This lets a site enable only the tools it needs while keeping one shared release package and update path.

= Should I activate every sub-plugin? =

No. Activate the main toolbox for development and maintenance tools. Activate Snippets, Site Manager, or Hide Login Page only when the site needs those behaviors, because each sub-plugin changes runtime hooks.

= Where are Snippets settings configured? =

Most Snippets behavior is controlled with `MDT_*` constants defined before WordPress loads, usually in `wp-config.php`. Some behavior also has filters documented in the source.

= Will observed HTTP_HOST domains be shown on the domain expiry dashboard? =

No by default. Since 3.5.9, `MDT_DOMAIN_EXPIRY_OBSERVE_HOSTS` defaults to `false`, and observed-only hosts are kept behind a separate detail page instead of the main dashboard list.

= How do I add extra domains to the expiry check? =

Define `MDT_DOMAIN_EXPIRY_EXTRA_DOMAINS` in `wp-config.php` as an array or comma-separated string.

= How do I change the hidden login URL? =

Define `MDT_LOGIN_PATH` before WordPress loads. The default slug is `admin-staff`.

= Is Site Manager passwordless login safe to share? =

No. The exported site string includes the passkey used to create login tokens. Treat it like an administrator credential and share it only through trusted channels.

= How do I configure Feedback Reporter? =

Activate the Feedback Reporter sub-plugin. The reporter is enabled by default after activation and can save local logs/screenshots/recordings even before a webhook is configured; define `MDT_FEEDBACK_REPORTER_ENABLE` as `false` to disable it. Set `MDT_FEEDBACK_REPORTER_WEBHOOK_URL` before WordPress loads when you want external notifications. `auto` detects Discord and Slack incoming webhook URLs; set `MDT_FEEDBACK_REPORTER_WEBHOOK_FORMAT` to `generic`, `discord`, or `slack` only when you need to force a payload type. By default the webhook must be HTTPS with a valid certificate; set `MDT_FEEDBACK_REPORTER_WEBHOOK_REQUIRE_HTTPS` or `MDT_FEEDBACK_REPORTER_WEBHOOK_SSL_VERIFY` to `false` only for trusted internal/self-signed receivers. Use `MDT_FEEDBACK_REPORTER_ALLOWED_ROLES`, `MDT_FEEDBACK_REPORTER_ALLOWED_USER_IDS`, and `MDT_FEEDBACK_REPORTER_DENIED_USER_IDS` to limit who can submit reports.

= Does Feedback Reporter expose my webhook secret to visitors? =

No. The browser only receives the local REST endpoint and nonce. WordPress sends the webhook server-side and signs it with `MDT_FEEDBACK_REPORTER_WEBHOOK_SECRET` when configured.

= Do I need to back up before using database or replacement tools? =

Yes. Database search/replace, optimization, cleanup, reset, bulk author changes, and file replacement tools can modify production data or files. Always keep a verified backup before running destructive actions.

== Screenshots ==

1. ** 常用外掛操作列表 ** - 作者常用外掛安裝、啟用批次操作區域。

2. ** Themeforest 外掛、主題下載 ** -  輸入 Themeforest 建立的授權碼取得帳號下購買的主題或外掛，線上安裝。

3. ** 批次修改全站內容作者 ** - 指定內容類型全站調整作者權限，讓客戶帳號方便作業。

4. ** 超快速搜尋外掛工具 ** - 作者自行整理的官方外掛庫，每日更新，用來快速找對外掛資源。

5. ** 主題打包工具 ** - 網站主題一鍵打包下載功能。

6. ** 外掛列表頁面打包工具 ** - 網站外掛一鍵打包下載功能。

7. ** 資料庫與資料表檢視與匯出工具 ** - 查看資料庫與資料表設定，並提供匯出備份功能。

8. ** 資料庫關鍵字搜尋與取代工具 ** - 指定或全站資料表掃描固定字眼並取代的功能，搬家時換網域常用。

== Upgrade Notice ==

= 3.6.9 =
Feedback Reporter 強化真實用戶 IP 紀錄：可信 Cloudflare 代理範圍會自官方清單快取更新，匿名回報也會保存解析後 IP；同版修正回報介面樣式隔離與 Feedback Logs 長字串欄位溢出。

= 3.6.8 =
Feedback Reporter 調整 Slack incoming webhook 通知：截圖改以文字連結與後台 Log 入口呈現，不再送出 Slack image block，避免站台圖片 URL 被主機資安策略阻擋時造成整包 webhook 回報失敗。

= 3.6.7 =
Feedback Reporter 新增可選的匿名前台回報第二路徑（預設關閉），開啟後未登入訪客可沿用同一套截圖/錄影流程送出回報；同版修正前台與後台在捲動位置點「回報」時被瀏覽器重設到頁面頂端的問題。

= 3.6.6 =
Feedback Reporter 在支援的桌機瀏覽器會優先使用 Browser Screen Capture API 的螢幕/視窗/分頁分享選擇器擷取目前畫面，並新增最長預設 60 秒的獨立視窗錄影控制器；原頁跳轉不會中斷錄影，錄影中會顯示倒數與停止按鈕，可提前結束；同時保留較高解析度的標註輸出，不再因預覽縮放降低實際截圖像素。

= 3.6.5 =
Feedback Reporter Logs 後台頁面現在會直接顯示截圖縮圖與詳細預覽，不再只列出本機檔案路徑；同版修正 WordPress Playground Test Preview 藍圖安裝順序。

= 3.6.4 =
修正 Feedback Reporter 捲動後的 viewport 截圖，避免 fixed/sticky 底部操作列在桌機與手機截圖中位置錯亂；同時移除不穩定的「貼上截圖」按鈕，保留 Ctrl/⌘+V 貼上與檔案上傳。

= 3.6.3 =
修正 Feedback Reporter 截圖對應目前捲動視野，並新增上傳或貼上圖片取代自動截圖，避免互動畫面無法由 DOM 截圖呈現時無法回報。

= 3.6.2 =
Feedback Reporter 啟用後預設可保存本機回報；log 頁面會提示 webhook 設定狀態，並新增 Slack incoming webhook 與 WordPress Playground 即時預覽支援。

= 3.6.1 =
更新 Feedback Reporter 使用的 SnapDOM 至 3.2.0，並確認截圖、遮罩、SEO 資訊、後台 log 檢視、webhook 補送與 RWD 介面相容。

= 3.6.0 =
新增 Feedback Reporter 子外掛：登入用戶可在前台與後台擷取並標註目前頁面，填寫問題描述後由 WordPress server-side 安全轉送指定 webhook，並以檔案型 log/截圖做薄紀錄與自動清理。


== Changelog ==

= 3.6.9 =

* Feedback Reporter 儲存 log、webhook 與匿名 IP hash/rate limit 時，改為只在 `REMOTE_ADDR` 符合可信代理 CIDR 後解析 Cloudflare / reverse proxy client IP header；可信 Cloudflare CIDR 會從官方 `ips-v4` / `ips-v6` 文字清單抓取並以 transient 快取，抓取失敗時回退內建清單；預設支援 Cloudflare `CF-Connecting-IP`，並在 Cloudflare Pseudo IPv4 overwrite 模式下改用 `CF-Connecting-IPv6` 保留真實 IPv6，避免直接請求偽造 `X-Forwarded-For`；匿名回報現在也會保存解析後的完整 IP 供濫用追蹤，且該 IP 會隨已設定的第三方 webhook 一併送出。
* Feedback Reporter 前台回報 modal / editor / controls 強化 CSS 隔離，避免站台主題覆寫按鈕、標題 pseudo element、表單控制項與回報卡片樣式。
* Feedback Logs 後台列表修正長 Trace ID、URL、檔案路徑與 webhook 文字撐破欄位的問題，改用固定表格寬度、水平捲動與欄內斷行。

= 3.6.8 =

* Feedback Reporter 的 Slack incoming webhook 不再送出 Block Kit image block；截圖與錄影仍保留在文字欄位與「開啟 Log」入口，避免 WordPress.com、Cloudflare、WAF、登入保護或靜態檔案策略阻擋圖片 URL 時造成 Slack 回 `invalid_blocks` 並讓整包通知失敗。
* Discord webhook 維持 multipart attachment 上傳截圖檔案的既有行為，不受此調整影響。

= 3.6.7 =

* Feedback Reporter 新增可選匿名前台回報：設定 `MDT_FEEDBACK_REPORTER_ALLOW_ANONYMOUS=true` 後，未登入訪客可使用同一套截圖、標註與錄影流程送出回報；匿名路徑使用短效 challenge、同站 Origin/Referer 驗證、honeypot、IP/UA/path rate limit、較小的預設檔案上限，且後台不對匿名訪客顯示。
* 匿名模式第一版即支援錄影回報（`MDT_FEEDBACK_REPORTER_ANON_ALLOW_VIDEO` 預設 true），預設限制為 20 秒 / 15 MiB，截圖預設 2 MiB；log 會標記 `anonymous` 使用者並保存 IP hash，不在匿名 log 中保存完整 IP。
* Feedback Reporter 修正前台與後台回報入口的捲軸鎖定：開啟回報模式視窗時改用可還原的 scroll lock 保留原視覺位置，避免 WordPress 後台因 `overflow:hidden` 被瀏覽器重設到頁面頂端。
* 所有 modal、錄影 popup 與送出完成流程改用 prevent-scroll focus，關閉或選擇截圖時會還原原始 scroll position，確保後續 Browser Screen Capture / SnapDOM fallback 都從使用者當下的 viewport 進行。

= 3.6.6 =

* Feedback Reporter 在支援且安全的瀏覽器環境中優先使用 Browser Screen Capture API，並採用接近線上會議的螢幕/視窗/分頁分享選擇器；需要包含 DevTools 或瀏覽器外框時可選整個螢幕或視窗，使用者取消或瀏覽器不支援時才回落到 SnapDOM/DOM 截圖。
* 新增錄製短片回報模式：支援 MediaRecorder 的安全桌機瀏覽器會開啟獨立錄影控制器，可選擇分頁、視窗或螢幕錄影，預設最長 60 秒；原頁跳轉不會中斷錄影，錄影中顯示倒數與停止按鈕，使用者可提前結束；送出時會附上錄影檔與封面截圖，後台 Feedback Logs 可預覽影片。不支援或彈窗被阻擋時會回落到頁內錄影/截圖流程。
* Discord / Slack webhook 會盡量使用一致的詳細資訊：使用者描述、頁面、SEO、回報者、角色、裝置、請求資訊、Console errors、Log、Screenshot、Video；Slack 使用 Block Kit + mrkdwn 欄位與可用時的截圖 image block，Video 欄位使用錄影檔案的站點完整 URL，方便內部通知直接點開；Apache/LiteSpeed `.htaccess` 會配合允許圖片/影片媒體檔直連並保留 JSON log 阻擋。
* 標註編輯器改成只縮放 CSS 預覽，實際 canvas 保留原始截圖像素；預設截圖上限提高到 3840×8192、檔案上限提高到 5 MiB，改善文字與細節模糊問題。
* Feedback Reporter viewport 截圖保留 client-side 資源 URL 正規化：對同站台的 www/non-www 圖片、`srcset`、inline style 與 computed background/mask image，改用目前頁面的 origin 讓 SnapDOM 直接讀取，避免常見跨 host alias 的 CORS/dataURL 失敗與截圖破碎。
* 保持不走預設後端圖片 proxy；真正第三方且未提供 CORS 的資源在 SnapDOM fallback 仍受瀏覽器安全模型限制，可用 Browser Screen Capture、來源端 CORS、上傳或貼上截圖 fallback。

= 3.6.5 =

* Feedback Reporter Logs 列表新增截圖縮圖，詳細頁新增大型截圖預覽；圖片透過後台權限與 nonce 保護的 `admin-post.php` endpoint 讀取，保留既有私有 log 目錄保護。
* 修正 WordPress.org Test Preview 藍圖：先安裝並啟用 `mxp-dev-tools`，再啟用 Feedback Reporter 子外掛，避免 Playground 在外掛尚未安裝時執行 `activatePlugin` 造成 `Plugin file does not exist`。

= 3.6.4 =

* 修正 Feedback Reporter 捲動頁面的 viewport 截圖：以暫存 viewport 舞台擷取目前畫面，並把 fixed/sticky 元素依實際視窗座標重疊，避免 DDEV 固定底部操作列在桌機與手機截圖中位移或遮蓋錯誤。
* 移除標註視窗中的「貼上截圖」按鈕；保留 Ctrl/⌘+V paste 事件與「上傳截圖」fallback，避開瀏覽器 Clipboard API 權限不一致造成的空按鈕體驗。

= 3.6.3 =

* 修正 Feedback Reporter 自動截圖範圍：截圖前不再先鎖定頁面捲動，並以目前 viewport 捲動位置裁切，避免回報內容誤抓頁面頂端。
* 新增截圖取代功能：標註視窗可上傳 PNG/JPEG/WebP，或在支援的瀏覽器按 Ctrl/⌘+V 從剪貼簿貼上圖片。
* 強化替代截圖流程的 RWD 介面、圖片尺寸壓縮、格式檢查與錯誤提示，讓桌機、手機與不同瀏覽器都有檔案上傳 fallback。

= 3.6.2 =

* Feedback Reporter 啟用子外掛後預設可直接回報並保存本機 log/截圖；`MDT_FEEDBACK_REPORTER_ENABLE=false` 仍可覆寫關閉。
* Feedback Logs 頁面新增 webhook 設定提醒：未設定時顯示通知，已設定時顯示目前通知類型與 host。
* 新增 Slack incoming webhook 自動偵測與 `MDT_FEEDBACK_REPORTER_WEBHOOK_FORMAT=slack`，使用 JSON + Block Kit 送出摘要與本機 log/截圖路徑。
* 新增 WordPress Playground `assets/blueprints/blueprint.json`，支援 WordPress.org 外掛頁即時預覽。
* 移除外部服務依賴說明段落。

= 3.6.1 =

* 更新 Feedback Reporter vendored SnapDOM 至 `3.2.0`。
* 確認 SnapDOM 3.2.0 與現有截圖流程相容：新增 ESM 動態載入 fallback，維持 `snapdom(target, options)`、`toBlob()`、viewport clip、ignore selector 與遮罩流程可正常運作。
* 強化 Feedback Logs 後台檢視頁：重要資訊分卡片顯示、webhook 狀態 badge、補送/刪除操作、Raw JSON 與手機版 RWD 呈現。

= 3.6.0 =

* 新增 `Dev Tools: Feedback Reporter - Mxp.TW` 子外掛，支援前台與後台登入用戶截圖、標註、填寫描述與 webhook 回報。
* 新增 `MDT_FEEDBACK_REPORTER_*` 常數設定：啟用狀態、後台低干擾入口、webhook、HTTPS/憑證嚴格度、role/user ID 限制、截圖大小、遮罩 selector、rate limit、log 保留天數與檔案數上限。
* 新增本機 JSON log + screenshot 檔案薄紀錄與每日清理機制；管理員可從「工具 → Feedback Logs」讀取檔案型回報紀錄、檢查 webhook 送出狀態、手動補送 webhook，並刪除紀錄；移除子外掛時預設刪除 log。
* 強化 Feedback Reporter 送出流程：後端在 webhook 前重新壓縮超限截圖，並將截圖頁面的 SEO meta/canonical/Open Graph/Twitter/H1/JSON-LD 型別摘要一併寫入 log 與 webhook。

= 3.5.9 =

* 調整網域到期檢查的 observed host 行為：預設不再自動記錄 HTTP_HOST，可用 `MDT_DOMAIN_EXPIRY_OBSERVE_HOSTS` 啟用。
* 新增 observed host 180 天保留規則、獨立檢視頁與刪除操作，避免非主要網域直接出現在控制台。

= 3.5.8 =

* 新增網域到期檢查資訊的註冊商、註冊日期、網域狀態、DNSSEC 與 Name Server 等基本細節。
* 調整網域到期通知文案，改用「已進入到期前提醒」並加入註冊商資訊，方便確認續約平台。

= 3.5.7 =

* 調整網域到期檢查資訊顯示完整主機名稱，避免子網域被簡化為主網域。
* 調整網域到期通知規則，僅通知 home_url / site_url 類型來源，純 observed_host 不寄送通知。

= 3.5.6 =

* 調整網域到期檢查資訊的後台文案，移除不易理解的英文術語。

