やりたいこと
- 投稿した全記事のカテゴリーを整理したいため、一括で変更をしたい。
- カテゴリーは現在の使われている名前ではなく、新しいカテゴリー名になる(古いものは消す)
- Aカテゴリーを全てBカテゴリーに変更するとかではなく、Aカテゴリーだった記事を、BカテゴリーにしたりCカテゴリーにしたりするので、単純な置き換えでは無い。
対応方法
プラグインでは対応できなそうなので、SQLでDBのデータを書き換える方法で対応します。
- DBのバックアップを取得してあり、万が一失敗した時は元に戻せる知識がある。
- DBにアクセスしてSQLのクエリを操作できる状態になっている。
①現在設定されているカテゴリーを削除する
まず、操作をしやすくするため、現在設定されているカテゴリーは全て削除します。
管理画面の「カテゴリー」から削除。
削除すると記事のカテゴリーは自動的に未分類(id=1)になります。
※元々あるカテゴリーを使うので消したく無い場合はこの作業は飛ばします。
②新しいカテゴリーを追加する
新しく設定するカテゴリーを管理画面の新規追加から追加します。
この時に、それぞれのカテゴリーIDを控えておきます。
③カテゴリーIDを置き換える
①で未分類にしたカテゴリーをそれぞれ設定したい新しいカテゴリーIDに置き換えます。
カテゴリーと記事の紐付けはwp_term_relationships
テーブルにありますので、ここにあるterm_taxonomy_id
カラムの中身を置き換えれば、記事にカテゴリーが設定できます。
カラム名 | 内容 |
---|---|
term_taxonomy_id | カテゴリーのID |
object_id | 記事のID |
DBで以下のUPDATE文をたたきます。
①の操作で現在のカテゴリーは未分類になっているのでWHERE句はterm_taxonomy_id = 1
となります。
ちなみにwp_term_relationships
テーブルはカテゴリーだけではなく、タグもこのテーブルで紐付けをしているため、WHERE句でterm_taxonomy_id = 1
にしないと、該当記事のタグIDも置き換わってしまうので必ず設定します。
(タグが一切ない記事なら入れなくてもいいかも)
UPDATE
wp_term_relationships
SET
term_taxonomy_id = 新しいカテゴリーのID
WHERE
object_id = 設定したい記事のID
AND
term_taxonomy_id = 1 -- 現在のカテゴリーID
;
ちなみに①の操作でカテゴリーを消さなかった場合は、現在のIDをORで設定すればOK。
例:未分類(id=1)とカテゴリーA(id=2)の記事が現在ある場合は以下のようになります。
UPDATE
wp_term_relationships
SET
term_taxonomy_id = 新しいカテゴリーのID
WHERE
object_id = 設定したい記事のID
AND
( term_taxonomy_id = 1 OR term_taxonomy_id = 2) -- 現在のカテゴリーID
;
これで記事に新しいカテゴリーが設定されました。管理画面やサイトから新しいカテゴリーになっていることが確認できます。
④記事数のカウントを更新する
これだけではカテゴリーごとの記事数が更新されないので、こちらも直します。
ここが0になっていると、get_categories()
などのカテゴリーを取得する関数で取れない模様。
記事数はwp_term_taxonomy
テーブルのcount
カラムにあるので、ここを更新します。
UPDATE
wp_term_taxonomy
SET
count = 新しい記事数
WHERE
term_taxonomy_id = 設定したいカテゴリーのID
;
以上で、記事のカテゴリーが新しいものに置き換わりましたので完了です。
おまけ:全記事の取得・SQLクエリの作成方法
この方法を行うには、全記事のIDを取得しないとになります。
WordPressのデフォルトのエクスポート機能だとXML形式でしか記事データを取れず不便でしたので、以下のCSVデータで取れるプラグインを使いました。(余談ですが、なんと一度イベントでお会いしたことあるエンジニアの方が作者でした!)
私はこのプラグインで公開されている全記事をCSV形式でダウンロードし、googleスプレッドシートで読み込み、それぞれの記事に設定したいカテゴリーを選択し、カテゴリーIDと紐付けて、整形して最終的にSQLのクエリを作成。
あとはこれを全文コピーしてDBに投げれば完了です。