=== 一介資男(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.5
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`。

* 前台使用明確的「回報問題」浮動按鈕；後台使用低干擾的小型「回報」入口，避免遮住主要操作或一直提醒使用者回報。
* 使用者點擊後才啟動回報流程，擷取目前頁面「當下捲動視野」並開啟截圖標註工具。
* 使用者可在截圖上畫框、箭頭、文字、自由畫筆與馬賽克；若自動 DOM 截圖無法呈現互動畫面，可上傳 PNG/JPEG/WebP 或從剪貼簿貼上外部截圖取代，再填寫問題描述。
* 前端只送到本站 REST endpoint；webhook URL 與 secret 不會輸出到瀏覽器。
* WordPress server-side 驗證登入、nonce、role/user ID、rate limit、截圖 MIME，並在 webhook 前重新檢查與壓縮截圖大小；未設定 webhook 時仍會保存本機 log/截圖，設定 webhook 後才送出外部通知。
* Discord webhook 會自動使用 `payload_json` + `files[0]`，讓文字、SEO 資訊與截圖可直接進 Discord；Slack incoming webhook 會自動使用 JSON + Block Kit 送出文字摘要與本機 log/截圖路徑。
* log 目錄預設在 `wp-content/uploads/mxp-dev-tools/feedback-reporter/`，每次回報會寫入不可預測的隨機子目錄與隨機檔名，並建立 `index.html` 與 `.htaccess` 阻擋直接瀏覽，再依保留天數與檔案數上限自動清理；移除 Feedback Reporter 子外掛時預設會刪除 log。

常用常數：

* `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_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 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.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.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 =

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

