てっきんの具。

「てっきん」と呼ばれて40年のおっさんが書くブログ

[WordPress] カスタム投稿・カスタム分類のリネーム方法

ググってみたら意外にも日本語での情報がない!ということで、情報源(英語)を補足するかたちでまとめてみました。黒い画面(WP-CLI)でやる方法も書いたですよ。無保証の技術情報につき、ご利用は計画的に。

なんでリネームする羽目になったのか

カスタム投稿・カスタム分類(カスタムタクソノミー)を使う上での留意点を中途半端に見落としたまま register_post_type(), register_taxonomy() で投稿タイプやタクソノミーを作ってしまったからです。

しかも大量にデータを登録した後で

制作中のサイトでモザイク多くてスミマセン……
タームの一覧ではカウントが出てるのに(制作中のサイトでモザイク多くてスミマセン……)
クリックしてみると「なかったこと」にされる
クリックしてみると「なかったこと」にされる

という現象に遭遇。調べてみたところ

というチョンボをしでかしていたことが分かりました。

予約語を使っちゃいかんのは分かるんですが、カスタム投稿とカスタム分類の名前が重なると記事をうまく引いてこれないとは。ちなみに、トラブルを起こしたカスタム投稿・カスタム分類の関係はこんなふうでした。

  • カスタム投稿名 …… foo
    foo に紐づくカスタム分類名 …… bar
  • カスタム投稿名 …… baz
    baz に紐付くカスタム分類名 …… foo

foo が重なってエラーを引き起こしてました。エラーといっても特にエラーメッセージを出すわけでないので、「なんで記事を引いてこないんだろう」と不思議だったのですよ。

で、どうやってリネームすんの?(phpMyAdmin編)

ちゃちゃっとカスタム投稿・カスタム分類を実装できるプラグインでなく、ベタに泥くさく functions.php で実装してると想定します。

まずは、WordPressサイトのデータベースに『phpMyAdmin』を使いアクセスします。作業に入る前に、あとあと泣かないようにデータベースをエクスポートしておきましょう。

次に functions.php に書いてあるであろう register_post_type() の第1引数(=カスタム投稿名)を新しいものにリネーム。

改めて『phpMyAdmin』でデータベースにアクセスして

「SQL」タブをクリックし、下のようにSQL文(コマンド)を書きます。new_post_type は新しいカスタム投稿名 old_post_type は古いカスタム投稿名です。

UPDATE `wp_posts` SET `post_type` = 'new_post_type' WHERE `post_type` = 'old_post_type';

SQL文を書いたら[実行]をクリック。「うまくいったよー」的な実行結果が返ってきたらバッチリです。エラーが出たときには

  • 文末に ; (セミコロン)があるか
  • wp_posts, post_type が ` (バッククオート ※JISキーボードなら Shift+@ で入力)でくくられているか
  • ポストタイプ名が ‘ (シングルクオート ※JISキーボードなら Shift+7 で入力)でくくられているか

といった点をチェックしてみてください。

カスタム分類名を変えるときは

  • register_taxonomy() の第1引数にあるカスタム分類名を新しいものにリネーム
  • カスタム投稿同様『phpMyAdmin』の「SQL」タブで下記のSQL文を実行
    UPDATE `wp_term_taxonomy` SET `taxonomy` = 'new_taxonomy' WHERE `taxonomy` = 'old_taxonomy';
    

という手順で進めます。

で、どうやってリネームすんの?(WP-CLI編)

黒い画面でWordPressの設定・管理ができるツール『WP-CLI』には、データベース操作のできる db というコマンドが用意されています。

WordPressのインストールディレクトリに入り、まずは

wp db export

とデータベースのエクスポートをしておきます。泣かないように。

泣かない準備ができたら db のサブコマンド cli でデータベースに接続しましょう。

wp db cli

こんなプロンプトが返ってきたらデータベースに接続できてます。

Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 562265
Server version: 5.5.41-log MySQL Community Server (GPL) by Remi

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

念のため、別のデータベースに接続してるようなことがないか \s コマンドで確認しておきましょう。

mysql> \s
--------------
mysql  Ver 14.14 Distrib 5.5.41, for Linux (i686) using readline 5.1

Connection id:          1656
Current database:       foo
Current user:           bar@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         5.5.41-log MySQL Community Server (GPL) by Remi
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:            /var/lib/mysql/mysql.sock
Uptime:                 7 days 1 hour 29 min 27 sec

Threads: 1  Questions: 84682  Slow queries: 0  Opens: 365  Flush tables: 1  Open tables: 124  Queries per second avg: 0.138
--------------

mysql>

間違いなく、目指すデータベースに接続しているのを確認できたら『phpMyAdmin』のときと同様にSQL文を実行します。

mysql> UPDATE `wp_posts` SET `post_type` = 'new_post_type' WHERE `post_type` = 'old_post_type';
Query OK, 31 rows affected (0.01 sec)
Rows matched: 31  Changed: 31  Warnings: 0

mysql> \q
Bye

大事なことなので二度言いますが、くれぐれも作業前のデータベースエクスポートをお忘れなく。

photo by Tiberiu Ana (CC BY)

カテゴリー:

タグ:

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください