當 WordPress 站點文章、評論、用戶達到成百上千時,後台逐筆編輯不僅低效、易出錯。直接操作 MySQL 資料庫配合精準 SQL,能在秒級完成批量修改。本文整理實戰高頻 SQL,**務必先完整備份資料庫**再執行。
mysqldump、備份外掛(UpdraftPlus、WPvivid)或主機面板匯出 .sqlwp_,實際請查 wp-config.php 中 $table_prefix-- 為所有文章/頁面新增自訂欄位(避免重複)
INSERT INTO wp_postmeta (post_id, meta_key, meta_value)
SELECT ID, 'custom_field_key', 'custom_value'
FROM wp_posts
WHERE ID NOT IN (SELECT post_id FROM wp_postmeta WHERE meta_key = 'custom_field_key')
AND post_type IN ('post','page'); -- 或只針對 'post' / 'page'
-- 刪除特定 meta_key(如移除外掛殘留資料)
DELETE FROM wp_postmeta WHERE meta_key = 'obsolete_plugin_key';
-- 批量刪除垃圾評論
DELETE FROM wp_comments WHERE comment_approved = 'spam';
-- 批量刪除待審評論
DELETE FROM wp_comments WHERE comment_approved = '0';
-- 刪除含特定網址的評論(垃圾鏈接清理)
DELETE FROM wp_comments WHERE comment_author_url LIKE '%spamdomain.com%';
-- 關舊文章評論(指定日期前)
UPDATE wp_posts SET comment_status = 'closed'
WHERE post_date < '2023-01-01' AND post_status = 'publish';
-- 全站啟用/停用
UPDATE wp_posts SET ping_status = 'open'; -- 或 'closed'
-- 指定日期前停用
UPDATE wp_posts SET ping_status = 'closed'
WHERE post_date < '2023-01-01' AND post_status = 'publish';
-- 文章 → 頁面
UPDATE wp_posts SET post_type = 'page' WHERE post_type = 'post';
-- 頁面 → 文章
UPDATE wp_posts SET post_type = 'post' WHERE post_type = 'page';
-- 先查詢用戶 ID
SELECT ID, display_name FROM wp_users;
-- 批量變更作者(NEW_ID 為新作者,OLD_ID 為舊作者)
UPDATE wp_posts SET post_author = NEW_ID WHERE post_author = OLD_ID;
-- 刪除所有修訂版
DELETE FROM wp_posts WHERE post_type = 'revision';
-- 進階:保留最近 N 版,刪除較舊修訂(需子查詢或程式碼迭代)
-- 移除廢棄短代碼 [tweet]
UPDATE wp_posts SET post_content = REPLACE(post_content, '[tweet]', '');
-- 通用搜尋替換(網址遷移、圖片 CDN 域名變更等)
UPDATE wp_posts SET post_content = REPLACE(post_content, 'https://old-domain.com', 'https://new-domain.com');
-- 修正圖片 src 路徑
UPDATE wp_posts SET post_content = REPLACE(post_content, 'src="https://old.com', 'src="https://new.com');
-- 1. 站點設定
UPDATE wp_options
SET option_value = REPLACE(option_value, 'https://old-site.com', 'https://new-site.com')
WHERE option_name IN ('home','siteurl');
-- 2. GUID(永久連結識別符,通常不建議改,除非全新站點)
UPDATE wp_posts SET guid = REPLACE(guid, 'https://old-site.com', 'https://new-site.com');
-- 3. 文章內容內部連結/圖片
UPDATE wp_posts SET post_content = REPLACE(post_content, 'https://old-site.com', 'https://new-site.com');
-- 修改預設管理員用戶名(防暴力破解)
UPDATE wp_users SET user_login = 'NewAdminName' WHERE user_login = 'admin';
-- 重設密碼(MD5,WP 登入時會自動升級為 phpass)
UPDATE wp_users SET user_pass = MD5('NewStrongPassword123!') WHERE user_login = 'YourUserName';
-- 查找無文章關聯的標籤
SELECT * FROM wp_terms wt
INNER JOIN wp_term_taxonomy wtt ON wt.term_id = wtt.term_id
WHERE wtt.taxonomy = 'post_tag' AND wtt.count = 0;
-- 刪除(謹慎,建議先備份)
DELETE wt, wtt, tr FROM wp_terms wt
INNER JOIN wp_term_taxonomy wtt ON wt.term_id = wtt.term_id
LEFT JOIN wp_term_relationships tr ON wtt.term_taxonomy_id = tr.term_taxonomy_id
WHERE wtt.taxonomy = 'post_tag' AND wtt.count = 0;
UPDATE wp_options SET option_value = 'a:0:{}' WHERE option_name = 'active_plugins';
| 操作 | 風險 | 緩解 |
|---|---|---|
| REPLACE 內容替換 | 誤替換非目標字串(如域名片段出現在非連結處) | 先 SELECT 驗證,或用正則/程式碼精準處理 |
| 刪除修訂版 | 無法復原歷史內容 | 確認不需版本控制才刪;或保留最近 N 版 |
| 修改 GUID | RSS 讀者視為新文章、重複推送 | 僅全新站點遷移時修改,運行中站點勿動 |
| 批量改作者 | 關聯的作者封存頁、權限異動 | 同步檢查 capabilities、封存頁重導 |
wp search-replace、wp post delete、wp user update 等指令比手寫 SQL 更安全、支援序列化資料處理掌握這些 SQL,配合備份與驗證習慣,能讓 WordPress 站點維護效率提升數十倍。記住:**資料庫無悔藥,備份是最大的底氣。**