MySQL 更新資料庫(新增文章標籤、密碼提示)

利用 MySQL 的命令列來幫文章批次增加 Tag、Hint。

註:密碼提示這個外掛(Post Password Hint)因為 WordPress 有文章版本(Revision)控制的關係,常常會失效,所以請先關閉 Revision 的功能。

關閉 Revision:

編輯在 WordPress 安裝的資料夾的 wp-config.php(要加在宣告 ABSPATH之前):

/* Close Revision save */ define('WP_POST_REVISIONS',false); 
/* That's all, stop editing! Happy blogging. */
/** WordPress absolute path to the WordPress directory. */
if ( !defined('ABSPATH') )
define('ABSPATH', dirname(__FILE__) . '/');
/** Sets up WordPress vars and included files. */
require_once(ABSPATH . 'wp-settings.php');

◎新增文章標籤:

先查出要新增的文章標籤他的 term_taxonomy_id(要先新增標籤,之後從 wp_terms 資料表找出對應的 term_id,再到 wp_term_taxonomy 資料表找出 term_taxonomy_id,最後 wp_term_relationships 這個資料表內的 object_id 就是文章的 id,所以一個 object_id 可能會有很多 term_taxonomy_id)

新增 term_taxonomy_id=1825 (就是我要新增的文章標籤代碼)到文章保護密碼是 "123456" 的文章。(term_taxonomy_id, term_order 就固定是 "1825" 和 "0")
INSERT INTO wp_term_relationships (object_id, term_taxonomy_id, term_order) select id, 1825, 0 FROM `wp_posts` WHERE `post_password` LIKE '123456'

◎更新 hint 欄位:

因為之前 hint 的內容因為 Revision 的關係,所以有些欄位是空的,所以要更新成想要提示的字。不過因為我 MySQL 語法不熟,多走了點冤枉路。

UPDATE `wp_postmeta` SET `wp_postmeta.meta_value` = '密碼提示' WHERE `wp_postmeta.post_id` = (SELECT `wp_posts.id` FROM `wp_posts` WHERE `wp_posts.post_password` LIKE '123456')

他會顯示錯誤, where 的結果多於一個(#1054 – Unknown column ‘wp_postmeta.post_id’ in ‘where clause’

用這個語法應該就可以了(不過我沒試過,因為後來才知道可以用 ANY)

UPDATE `wp_postmeta` SET `wp_postmeta.meta_value` = '密碼提示' WHERE `wp_postmeta.post_id` = ANY (SELECT `wp_posts.id` FROM `wp_posts` WHERE `wp_posts.post_password` LIKE '123456')

後來用土法煉鋼,先刪掉所有有密碼保護文章的 meta_value,在加入密碼提示的欄位:

DELETE from wp_postmeta WHERE meta_value='密碼提示'
INSERT INTO wp_postmeta (post_id, meta_key, meta_value) select id,  'hint', '密碼提示' FROM `wp_posts` WHERE `post_password` LIKE '123456'

不過這樣會有重複的 hint(因為有的密碼保護文章的 hint 就是空的,上面的 MySQL 並不會刪除,所以會造成一篇文章有兩個 hint 欄位),所以需要把重複的找出來。(不過我 MySQL 還是很爛,所以我是找出來之後,手動刪除 hint 是空的資料)。找出 meta_key 是 hint,而且 post_id 重複的資料:

SELECT * FROM `wp_postmeta` WHERE `meta_key` LIKE 'hint' and `post_id` = ANY (SELECT `post_id` FROM `wp_postmeta` WHERE `meta_key` LIKE 'hint' group by `post_id` having count(`post_id`) > 1)

更新欄位,值為其他兩欄的運算結果:

UPDATE table SET column3 = `column2`-`column1` WHERE id > 2

更新欄位,值為查詢其他表的結果:

UPDATE table1 SET column1 = (SELECT column2 FROM table2 WHERE column3=`column1`) WHERE id > 2

更新字串,用另外一個字串取代:

UPDATE `wp_posts` SET `post_content` = REPLACE( post_content, "old/pic", "pic" ) WHERE `post_content` REGEXP 'old\\/pic'
將 post_content 內含有 old/pic 的字串用 pic 來取代

發表迴響