ググってみたら意外にも日本語での情報がない!ということで、情報源(英語)を補足するかたちでまとめてみました。黒い画面(WP-CLI)でやる方法も書いたですよ。無保証の技術情報につき、ご利用は計画的に。
なんでリネームする羽目になったのか
カスタム投稿・カスタム分類(カスタムタクソノミー)を使う上での留意点を中途半端に見落としたまま register_post_type(), register_taxonomy() で投稿タイプやタクソノミーを作ってしまったからです。
しかも大量にデータを登録した後で
という現象に遭遇。調べてみたところ
- カスタム分類名にうっかり予約語を使っていた
関連記事 » 関数リファレンス/register taxonomy – WordPress Codex 日本語版 - カスタム投稿とカスタム分類で同じ名前を使っていた
というチョンボをしでかしていたことが分かりました。
予約語を使っちゃいかんのは分かるんですが、カスタム投稿とカスタム分類の名前が重なると記事をうまく引いてこれないとは。ちなみに、トラブルを起こしたカスタム投稿・カスタム分類の関係はこんなふうでした。
- カスタム投稿名 …… 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)
コメントを残す