Life is Really Short, Have Your Life!!

ござ先輩の主に技術的なメモ

WordPressの記事カテゴリを一括置換するSQL

プラグインとか入れるの面倒じゃないですか。

WordPressには「wp_terms」(wp_はご自身のWordPressプレフィックスに読み替えて下さい)というテーブルがあります。ここに記事のカテゴリ等が全て格納されています。

記事のカテゴリと記事の紐付けは「wp_term_relationships」というテーブルにあります。「object_id」カラムがwp_postsの記事のIDです。「term_taxonomy_id」が「wp_terms」のterm_idと同じです。

なので、wp_termsテーブルのterm_idをメモしておいて、以下のSQLを投げると一括で記事のカテゴリを置換することができます。

UPDATE wp_term_relationships 
SET term_taxonomy_id = <変更後のカテゴリID> 
WHERE term_taxonomy_id =  <変更前のカテゴリID>

IDベースではなくカテゴリ名称やスラッグベースで更新したい場合は以下のとおりです。

UPDATE 
  wp_term_relationships AS tr 
  JOIN wp_terms AS t ON t.term_id = tr.term_taxonomy_id 
SET 
  term_taxonomy_id = (
    SELECT 
      term_id 
    FROM 
      wp_terms AS t2 
    WHERE 
      t2.slug = 'after'
  ) 
WHERE 
  t.slug = 'before';

beforeを置換前のカテゴリのスラッグ名称、afterを置換後のカテゴリのスラッグ名称にして下さい。

また、記事を置換しただけでは、wp_term_taxonomyのcountカラムが更新されません。置換前の件数が残ってしまうので、適宜UPDATEしてください。