WordPressME 2.0.7はデフォルトがEUC-JPになっていて、そのままなにも考えずにインストールするとEUC-JPで投稿などのデータを登録し、かつシステムで利用する文字列もすべてEUC-JPでデータベース内に登録される。
EUC-JPが前提になっていながら、管理画面の「オプション」-「表示設定」の注意書きに「RSSフィードの文字コード出力に関してはUTF-8を推奨。MEでは上記設定に関わらずRSSフィードをUTF-8で出力しています。」とあるように、WordPressではRSSに関しては出力もデータベースへの保存もすべてUTF-8が前提になっているようだ。実際にダッシュボードで表示されるRSS関連がUTF-8で取り込まれている。RSS関連も含めてオプションに関するものは「wp_options」テーブルに格納されているが、結果的にwp-optionsテーブルは、UTF-8とEUC-JPが混在する形になっている。
文字コードが混在していながら、文字化けもしないで表示されているのは、MySQL内では、すべてのテーブルが「ENGINE=MyISAM DEFAULT CHARSET=latin1;」と定義されていて、MySQL側で文字コードを変換しながら処理しているためと思われる。
WordPressMEは、2.2.1などではUTF-8が前提になっていて、プラグインなどもUTF-8が前提になっているため、はやめに文字コードをEUC-JPからUTF-8に変換したほうがいいと思われる。
WordPressME 2.0.7で文字コードをEUC-JPからUTF-8に変換するには、ダッシュボードで表示されるRSS関連をすべて破棄し(RSS関連は文字コードを変換後にWordPressに接続したとき、あらためて取得される)、いったんすべてをEUC-JPベースにする。RSS関連のデータはwp_optionsテーブルのoption_idが66、68、70番になっている。
|
# mysql -u root -p wordpress
Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -AWelcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 520 to server version: 4.1.11Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the buffer.mysql> UPDATE `wp_options` SET `option_value` = ” WHERE `option_id` = 66;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql> UPDATE `wp_options` SET `option_value` = ” WHERE `option_id` = 68;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> UPDATE `wp_options` SET `option_value` = ” WHERE `option_id` = 70;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> \q
Bye
#
|
データベースをすべてバックアップする。
|
# mysqldump -u root -p –default-character-set=binary wordpress > wordpress.dump
|
バックアップしたファイルをFTPでダウンロードし、秀丸で文字コードをEUC-JPからUTF-8に変換してから(このとき「ENGINE=MyISAM DEFAULT CHARSET=latin1;」は修正しない)、サーバにFTPでアップロードする。
既存のデータベースを削除し、あらためてデータベースを作成してからリストアする。
|
# mysqladmin -u root -p drop wordpress
Enter password:
Dropping the database is potentially a very bad thing to do.
Any data stored in the database will be destroyed.Do you really want to drop the ‘wordpress’ database [y/N] y
Database “wordpress” dropped# mysqladmin -u root -p create wordpress
Enter password:
# mysql -u root -p wordpress < wordpress.dump
|
この状態でWordPressに接続すると「Warning: Invalid argument supplied for foreach() in /home/sites/www.hyperdyne.co.jp/web/wordpress/wp-includes/capabilities.php on line 19」というエラーが発生して、管理画面のメニューが表示されない。原因は、wp-optionsテーブルの先頭のほうに役割(ロール wp_user_roles)を定義している箇所があり、「s:4:\”name\”;」に続く箇所が役割名になっている。デフォルトでは「s:6:\”管理人\”;」「s:6:\”Editor\”;」「s:6:\”投稿者\”;」「s:11:\”Contributor\”;」「s:10:\”Subscriber\”;」の5つが登録されている。「s:」に続く数値は文字列のバイト数を意味するようで、UTF-8環境で3文字の文字列の場合には「s:6:」でなく「s:9:」と、同じく2文字の場合には「s:6:」とする必要がある。この問題を解決するスクリプト(my_cap.php)が「WordPress標準ガイドブック」(http://www.wordpress-guide.com/2006/11/11/capabilities/)にある。このスクリプトをWordPressのwp-adminディレクトリにFTPでアップロードしてから、「http://www.hyperdyne.co.jp/wordpress/wp-admin/my_cap.php」のようにURLを直接指定して実行する。このときブラウザで文字化けを起こしているときは、「表示」メニューの「エンコード」で「Unicode(UTF-8)」を指定する。
管理画面にログインし、「オプション」-「表示設定」-「ブログの文字コード」で「EUC-JP」となっている箇所を「UTF-8」に修正して、「設定を更新する」ボタンをクリックする。
最後にWordPressディレクトリにあるwp-config.phpファイルの中の「mb_internal_encoding(”EUC-JP”);」を「mb_internal_encoding(”UTF-8″);」に、「define (’WPLANG’, ‘ja_EUC’);」を「define (’WPLANG’, ‘ja_UTF’);」に修正する。
my_cap.phpなど作業用ファイルをすべて削除する。