最近、パーマリンクの構造を数字ベースのものから /%category%/%postname% に変更をしてみた。
ところが1つの記事に対して親・子・孫のカテゴリーを選択しているこのサイトの場合なかなか希望通りにならなかった。
このサイトの場合で、ワイン>ヨーロッパ>イタリア>トスカーナというカテゴリー構造に「ヴィノABC」を置く場合
/wine/europe/italy/toscana/vino-abc
というパーマリンクになってほしいが、
/wine/europe/italy/vino-abc
/wine/europe/vino-abc
/wine/vino-abc
のいずれかになってしまうことがある(パーマリンクには最もカテゴリーIDが小さいカテゴリーが使われるルールのため)
プラグイン等を試してみたけれど、動作が一定でないように見えるうえに他のプラグインとの競合も怖い。
さらに、もしプラグインがwordpress本体バージョンアップについていけなくなった場合、同じ動作をするプラグインが見つかるとも限らない。
というわけで、phpMyAdminを使って比較的簡単にカテゴリーIDを整理する方法を検討してみた。
より上層のカテゴリーを新しく作れば大きな数値のIDが割り振られるので、下層を持つ親側のカテゴリーを新たに作り直して、投稿を付け替えればやりたいことが実現できる。
【phpMyAdminで操作】
まずはSQL全体のバックアップをとる(失敗した時に戻せるように)
【wordpress管理画面で操作】
まず、親子構造になっているカテゴリーの親(最下層を除く)カテゴリーの複製を作る
ex. イタリア(italy)→イタリア2(italy2)
作る順番は孫→子→親の順で(小さいIDが優先されるため深い層を小さいID番号に割り当てさせる必要がある)
イタリアのカテゴリーIDが50、イタリア2のIDが90だったとする
【phpMyAdminで操作】
wp_term_relationships の term_taxonomy_id を 50→90 へ置き換える
SQLのクエリを実行する↓
update wp_term_relationships set term_taxonomy_id=replace(term_taxonomy_id, “50”, “90”);
wp_term_taxonomy の parent を 50→90 へ置き換える
SQLのクエリを実行する↓
update wp_term_taxonomy set parent=replace(parent, “50”, “90”);
wp_term_taxonomy の term_id が 90 の行の count を 50 の行の数値と同じにする
手で変えた方が早いがSQLでするなら
update wp_term_taxonomy set count=1234 where term_taxonomy_id=90;
【wordpress管理画面で操作】
カテゴリー編集画面で
イタリア(italy)→イタリア旧(italyold)へ名称変更
イタリア2(italy2)→イタリア(italy)へ名称変更
イタリア旧(italyold)を削除する(削除前にイタリア旧のカテゴリーに所属する記事がゼロになっていることを確認すると安心かな)
これを下層を持つカテゴリーについて、より下層のカテゴリーから孫→子→親の順番で行えば完了
1500以上投稿数があるこのサイトの場合でも、カテゴリーの数にもよるだろうけど、1時間もあれば十分に作業可能。
※これを見て試してみようと思ったら、くれぐれもSQLのバックアップと書き戻しが問題なく出来ることを確認のうえ、自己責任でお願いします。
コメント