ご注意下さい
この記事は3年以上前に書かれた記事ですので、内容が古い可能性があります。
All in One SEOは優秀なプラグインですが、WING(Affinger5)はSEO機能も付いていますので動作が重い(と言われている)All in One SEOの利用を停止したいと思います。しかし、以前から設定していたタイトル、メタディスクリプションや、キーワードなどのデータ移行をしないと大切なメタデータが失われることになってしまいます。
今回はそのやり方をご紹介します。
注意ポイント
WordPressのデータベースMySQLを直接操作する必要がありますので最低限の知識が必要です。また、データ移行は自己責任で行ってください。ご自身の環境に合わせて一部変更が必要な場合もあります。
この記事のもくじ
以下のサイトを参考にさせて頂きました。ありがとうございました。
All in one SEO PACKのデータをCocoon・Simplicityに移行する方法
All in One SEOとAffinger5の対応表
何のデータをどこに移行しなければならないのか、ですが、All in One SEOパックとStinger5の対応表は以下の通りです。
項目 | All in One SEO Packでのmeta_key | Stinger5でのmeta_key |
タイトル | _aioseop_title | st_titlewords |
キーワード | _aioseop_keywords | st_keywords |
メタディスクリプション | _aioseop_description | st_description |
ご参考までに私の環境で対応関係を調べた際のログを以下に掲載しておきます。
mysql> select * from wp_postmeta where post_id = '9366'; +---------+---------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | meta_id | post_id | meta_key | meta_value | +---------+---------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | 362801 | 9366 | amp_is_enabled | 0 | | 362802 | 9366 | _wpcom_is_markdown | 1 | | 362803 | 9366 | _edit_lock | 1579301779:2 | | 362805 | 9366 | _thumbnail_id | 9374 | | 362806 | 9366 | _edit_last | 2 | | 362807 | 9366 | wppda_is_display_alert | 1 | | 362808 | 9366 | _jd_tweet_this | yes | | 362809 | 9366 | stmeta_robots | index, follow | | 365768 | 9366 | _aioseop_description | お子さんのiPhoneに設定したスクリーンタイム・機能制限パスコードを忘れてしまった場合のパスコードのリセット・変更の 仕方について解説します。ファミリー共有している場合には設定箇所が通常と違います。 | | 365769 | 9366 | _aioseop_title | 機能制限パスコードの変更方法【ペアレンタルコントロール】 | | 362837 | 9366 | st_keywords | 機能制限パスコード,忘れた,変更したい,設定箇所,ファミリー共有 | | 362838 | 9366 | st_description | お子さんのiPhoneに設定したスクリーンタイム・機能制限パスコードを忘れてしまった場合のパスコードのリセット・変更の 仕方について解説します。ファミリー共有している場合には設定箇所が通常と違います。 | | 365767 | 9366 | _aioseop_keywords | 機能制限パスコード,忘れた,変更したい,設定箇所,ファミリー共有 | | 365766 | 9366 | st_titlewords | 機能制限パスコードの変更方法【ペアレンタルコントロール】 | +---------+---------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 14 rows in set (0.00 sec) mysql>
データベースのバックアップ
さて、今からデータの移行をしますのでしっかりバックアップを取得しておきましょう。
WP-DBManager
使い方の詳細は割愛しますが、上記のプラグインがデファクトスタンダードなので、もし導入済みでない方は上記プラグインで簡単にバックアップできます。
実はもっと簡単な方法が以下のようにデータファイルが格納されているディレクトリのコピーです。私はこのやり方でリストアしたこともありますが、くれぐれも自己責任でお願いします!注意点としてはMySQLサーバーを停止してからディレクトリのコピーをしましょう。
# grep datadir /etc/my.cnf datadir=/var/lib/mysql # cd /var/lib/mysql # systemctl stop mysqld # cp -pr wordpress wordpress.20200118 # systemctl start mysqld
ちなみにリストアの方法はmysqlサーバを停止し、バックアップディレクトリを戻し、mysqlサーバを起動するだけです。
データ移行
さて、いよいよデータ移行に入ります。以下のUPDATE文を流しましょう。
UPDATE
wp_postmeta,
(
SELECT
post_id,
meta_value AS aioseop_meta_value
FROM
wp_postmeta
WHERE
meta_key = "_aioseop_title"
) AS aioseop
SET
wp_postmeta.meta_value = aioseop.aioseop_meta_value
WHERE
wp_postmeta.post_id = aioseop.post_id AND wp_postmeta.meta_key = "st_titlewords"
ちょっと待った!
念のためデータの件数の確認をしておきましょう。
mysql> SELECT COUNT(*) FROM wp_postmeta WHERE meta_key = "_aioseop_title"; +----------+ | COUNT(*) | +----------+ | 81 | +----------+ 1 row in set (0.01 sec) mysql> SELECT COUNT(*) FROM wp_postmeta WHERE meta_key = "st_titlewords"; +----------+ | COUNT(*) | +----------+ | 1 | +----------+ 1 row in set (0.00 sec) mysql>
はて?wp_postmetaテーブルに入っている件数が全然違いますね。上記のSQL文はUPDATE文なので条件に合致するレコードのカラムは書き換えますが、そもそもStinger側のレコードが1件しかないのでは…。UPDATEでは最大では1件しか更新されませんね。
参考にさせて頂いた記事はAll-in-One-SEO-PackとAffingerを同時に使い始めた人にしか有効ではないのでは!?
私の場合ブログ歴だけは長かったので、他のテーマと一緒にAll-in-One-SEO-Packを使い始めて、その後にAffinger4、5と乗り換えて並行利用していたという経緯があります。SEO関連はAffinger4ではあまり気にしていなかったので(だったらなんでAll-in-One-SEO-Packを導入したんだ!というツッコミはさておき)、Affinger4のSEO関連の情報は設定していませんでした。設定していないとそもそもレコードも作らないんですね。ということで、このままでは1件しか更新されません!SQL文の見直しが必要です。
2回に分けることになりますが、まずは新規レコードを差し込んでからアップデートすることにします。
操作対象テーブルの仕様を確認する
mysql> show columns from wp_postmeta; +------------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+---------------------+------+-----+---------+----------------+ | meta_id | bigint(20) unsigned | NO | PRI | NULL | auto_increment | | post_id | bigint(20) unsigned | NO | MUL | 0 | | | meta_key | varchar(255) | YES | MUL | NULL | | | meta_value | longtext | YES | | NULL | | +------------+---------------------+------+-----+---------+----------------+ 4 rows in set (0.00 sec) mysql>
この仕様通りキーであるmeta_idは自動採番されるので、気にする必要はないようです。他のテーブルと紐付いていたらちょっと諦めていたかもしれません。
移行用SQL(ボツ)
で、あれば以下のSQLで行けそうな気がします。
INSERT INTO
wp_postmeta(post_id, meta_key, meta_value)
SELECT
post_id,
'st_titlewords',
meta_value
FROM wp_postmeta
WHERE
meta_key = "_aioseop_title"
動作の内容としては、meta_keyが_aioseop_titleの場合は post_id, 'st_titlewords', meta_valueを挿し込みなさい、という意味になります。
が、これだと_sioseop_titleとst_titlewordsの両方がすでに入っている記事についてさらに追加してしまうことになります。以下のような例です。
post_id | meta_key | meta_value |
1 | _aioseop_title | 記事のタイトル1 |
2 | st_titlewords | 記事のタイトル2 |
2 | _aioseop_title | 記事のタイトル2 |
この場合、以下の結果になると思います。
post_id | meta_key | meta_value |
1 | _aioseop_title | 記事のタイトル1 |
1 | st_titlewords | 記事のタイトル1 <- これはOK |
2 | st_titlewords | 記事のタイトル2 |
2 | _aioseop_title | 記事のタイトル2 |
2 | st_titlewords | 記事のタイトル2 <- これが余分 |
なのでもう一ひねり必要です。とりあえず重複させておいて後から消去することでもいいんですが、WPの動作が不安定になる可能性もありますので、もう少し考えます。
All-In-One SEOのみに存在するデータの移行用SQL(改良版)
すでにst_titlewordsを持っているpost_idに対しては何も操作をしない対応が必要です。
INSERT INTO
wp_postmeta(post_id, meta_key, meta_value)
SELECT
J.post_id,
'st_titlewords',
J.meta_value
FROM
(
SELECT * FROM
(
SELECT * FROM wp_postmeta WHERE meta_key = "_aioseop_title"
) AS L
LEFT JOIN
(
SELECT
meta_id AS r_meta_id,
post_id AS r_post_id,
meta_key AS r_meta_key,
meta_value AS r_meta_value
FROM wp_postmeta WHERE meta_key = "st_titlewords"
) AS R
ON
L.post_id = R.r_post_id
) AS J
WHERE
J.r_meta_key IS NULL;
ちょこっと解説
最初にLEFT JOINでwp_postmeta同士をくっつけます。
SELECT * FROM
(
SELECT * FROM wp_postmeta WHERE meta_key = "_aioseop_title"
) AS L
LEFT JOIN
(
SELECT
meta_id AS r_meta_id,
post_id AS r_post_id,
meta_key AS r_meta_key,
meta_value AS r_meta_value
FROM wp_postmeta WHERE meta_key = "st_titlewords"
) AS R
ON
L.post_id = R.r_post_id
イメージ的には、以下のようなwp_postmeta(meta_idは除いています)テーブルにについて上記SQLを流すことで
post_id | meta_key | meta_value |
1 | _aioseop_title | 記事のタイトル1 |
2 | st_titlewords | 記事のタイトル2 |
2 | _aioseop_title | 記事のタイトル2 |
2 | wordtwit_post_info | 0:8:"tweet_times"............ 他のプラグインが使っている情報 |
2 | _wpas_done_all | 1 これも他のプラグインが使っている情報 |
以下のJOINテーブルJを作っています。ここで他のプラグインが使っている情報は除外した上で使いやすい形にしています。
post_id | meta_key | meta_value | r_post_id | r_meta_key | r_meta_value |
1 | _aioseop_title | 記事のタイトル1 | NULL | NULL | NULL |
2 | _aioseop_title | 記事のタイトル2 | 2 | st_titlewords | 記事のタイトル2 |
これで、r_meta_keyがNULLであれば、meta_keyをst_titlewordsにセットし、meta_valueをインサートすればいいことになります。
INSERT INTO
wp_postmeta(post_id, meta_key, meta_value)
SELECT
J.post_id,
'st_titlewords',
J.meta_value
FROM
J
WHERE
J.r_meta_key IS NULL;
仮想でJOINして作ったテーブルJに対するSELECT文の結果をwp_postmetaに挿し込みます。繰り返しになりますがmeta_idは自動採番です。以下のようになるはずです。
post_id | meta_key | meta_value |
1 | _aioseop_title | 記事のタイトル1 |
2 | st_titlewords | 記事のタイトル2 |
2 | _aioseop_title | 記事のタイトル2 |
1 | st_titlewords | 記事のタイトル1 |
実行ログも付けておきます。
mysql> SELECT COUNT(*) FROM wp_postmeta WHERE meta_key = "_aioseop_title"; +----------+ | COUNT(*) | +----------+ | 81 | +----------+ 1 row in set (0.00 sec) mysql> SELECT COUNT(*) FROM wp_postmeta WHERE meta_key = "st_titlewords"; +----------+ | COUNT(*) | +----------+ | 1 | +----------+ 1 row in set (0.00 sec) mysql> mysql> INSERT INTO -> wp_postmeta(post_id, meta_key, meta_value) -> -> -> -> SELECT -> J.post_id, -> 'st_titlewords', -> J.meta_value -> FROM -> ( -> SELECT * FROM -> ( -> SELECT * FROM wp_postmeta WHERE meta_key = "_aioseop_title" -> ) AS L -> LEFT JOIN -> ( -> SELECT -> meta_id AS r_meta_id, -> post_id AS r_post_id, -> meta_key AS r_meta_key, -> meta_value AS r_meta_value -> FROM wp_postmeta WHERE meta_key = "st_titlewords" -> -> ) AS R -> ON -> L.post_id = R.r_post_id -> -> ) AS J -> WHERE -> J.r_meta_key IS NULL; Query OK, 80 rows affected (0.04 sec) Records: 80 Duplicates: 0 Warnings: 0 mysql> mysql> mysql> SELECT COUNT(*) FROM wp_postmeta WHERE meta_key = "st_titlewords"; +----------+ | COUNT(*) | +----------+ | 81 | +----------+ 1 row in set (0.01 sec) mysql>
st_keywords, st_description 用移行SQL(ご参考)
ご参考までにwt_keyword、st_description用の移行SQLもご参考までに付けておきます。
INSERT INTO wp_postmeta(post_id, meta_key, meta_value) SELECT J.post_id, 'st_keywords', J.meta_value FROM ( SELECT * FROM ( SELECT * FROM wp_postmeta WHERE meta_key = "_aioseop_keywords" ) AS L LEFT JOIN ( SELECT meta_id AS r_meta_id, post_id AS r_post_id, meta_key AS r_meta_key, meta_value AS r_meta_value FROM wp_postmeta WHERE meta_key = "st_keywords" ) AS R ON L.post_id = R.r_post_id ) AS J WHERE J.r_meta_key IS NULL
INSERT INTO wp_postmeta(post_id, meta_key, meta_value) SELECT J.post_id, 'st_description', J.meta_value FROM ( SELECT * FROM ( SELECT * FROM wp_postmeta WHERE meta_key = "_aioseop_description" ) AS L LEFT JOIN ( SELECT meta_id AS r_meta_id, post_id AS r_post_id, meta_key AS r_meta_key, meta_value AS r_meta_value FROM wp_postmeta WHERE meta_key = "st_description" ) AS R ON L.post_id = R.r_post_id ) AS J WHERE J.r_meta_key IS NULL
All-In-One SEOのデータで上書きするデータ移行用SQL
次に、All-In-One-SEO-Packに入っていたデータを完全に移行します。先ほどのINSERT文で
移行が完了したデータ
- All-In-One-SEO-Packのみで管理していたデータ、つまりAffinger5用のレコードが存在しなかった時
についてデータ移行が完了しました。私の場合は上記でほぼすべてのデータ移行は完了なのですが、以下のデータについても移行します。
今回移行するデータ
- All-In-One-SEO-PackとAffinger4,5両方で管理していたデータを移行
- 優先度としては、All-In-One-SEO-Packのデータを優先し、Affinger5で設定していたものを上書き
という方針でデータ移行を実施します。Affingerで設定したデータを活かしたい場合にはこの作業は不要です。
こちらは、先に挙げた参考にさせて頂いたサイトの通り実施しています。(一部Affinger5に合わせて項目名を変更しています)
UPDATE
wp_postmeta,
(
SELECT
post_id,
meta_value AS aioseop_meta_value
FROM
wp_postmeta
WHERE
meta_key = "_aioseop_title"
) AS aioseop
SET
wp_postmeta.meta_value = aioseop.aioseop_meta_value
WHERE
wp_postmeta.post_id = aioseop.post_id AND wp_postmeta.meta_key = "st_titlewords"
mysql> mysql> UPDATE -> wp_postmeta, -> ( -> SELECT -> post_id, -> meta_value AS aioseop_meta_value -> FROM -> wp_postmeta -> WHERE -> meta_key = "_aioseop_title" -> ) AS aioseop -> SET -> wp_postmeta.meta_value = aioseop.aioseop_meta_value -> WHERE -> wp_postmeta.post_id = aioseop.post_id AND wp_postmeta.meta_key = "st_titlewords" -> ; Query OK, 0 rows affected (0.05 sec) Rows matched: 81 Changed: 0 Warnings: 0 mysql>
UPDATE wp_postmeta, ( SELECT post_id, meta_value AS aioseop_meta_value FROM wp_postmeta WHERE meta_key = "_aioseop_keywords" ) AS aioseop SET wp_postmeta.meta_value = aioseop.aioseop_meta_value WHERE wp_postmeta.post_id = aioseop.post_id AND wp_postmeta.meta_key = "st_keywords"
UPDATE wp_postmeta, ( SELECT post_id, meta_value AS aioseop_meta_value FROM wp_postmeta WHERE meta_key = "_aioseop_description" ) AS aioseop SET wp_postmeta.meta_value = aioseop.aioseop_meta_value WHERE wp_postmeta.post_id = aioseop.post_id AND wp_postmeta.meta_key = "st_description"
mysql> UPDATE -> wp_postmeta, -> ( -> SELECT -> post_id, -> meta_value AS aioseop_meta_value -> FROM -> wp_postmeta -> WHERE -> meta_key = "_aioseop_description" -> ) AS aioseop -> SET -> wp_postmeta.meta_value = aioseop.aioseop_meta_value -> WHERE -> wp_postmeta.post_id = aioseop.post_id AND wp_postmeta.meta_key = "st_description"; Query OK, 1 row affected (0.04 sec) Rows matched: 47 Changed: 1 Warnings: 0 mysql>
あれ?1件更新されてる(笑)
結果確認
データの移行確認
では実際に記事投稿画面からデータが移行されているか見てみることにします。
バッチり移行できています。せっかくなので重い重いと言われていたAll-In-One-SEO-Packを外すとどれぐらいサイトの性能が上がるんでしょうか?
性能面での向上
プラグインを外す前は以下の通りです。
以前性能改善したのに、なんということでしょう…。気を取り直してAll-In-One-SEO-Packを外してみます。
あんまり変わらないですね…(笑)でもこれですっきりしました。
記事は以上!
Affinger4,5と利用中ですが、オススメです。
WordPressテーマ「WING(AFFINGER5)」-販売ページ