プラグイン

【完全解説】All in One SEOからWING(Affinger5)へ乗り換える際のデータ移行

0
(0)

All in One SEOは優秀なプラグインですが、WING(Affinger5)はSEO機能も付いていますので動作が重い(と言われている)All in One SEOの利用を停止したいと思います。しかし、以前から設定していたタイトル、メタディスクリプションや、キーワードなどのデータ移行をしないと大切なメタデータが失われることになってしまいます。

今回はそのやり方をご紹介します。

注意ポイント

WordPressのデータベースMySQLを直接操作する必要がありますので最低限の知識が必要です。また、データ移行は自己責任で行ってください。ご自身の環境に合わせて一部変更が必要な場合もあります。

以下のサイトを参考にさせて頂きました。ありがとうございました。

All in one SEO PACKのデータをCocoon・Simplicityに移行する方法
All in one SEO PACKのタイトル、メタディスクリプション、キーワードをWordPressテーマ「Cocoon」、「Simplicity」のSEO設定に移行する方法についてご紹介します。SQLを使って移行するため、WordPressのテーブル構造についてもご説明します。meta_keyやmeta_valueをうまく使ってデータベースを移行します。…
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
Manages your WordPress database.
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の両方がすでに入っている記事についてさらに追加してしまうことになります。以下のような例です。

 

オリジナルデータ wp_postmeta
post_id meta_key meta_value
1 _aioseop_title 記事のタイトル1
2 st_titlewords 記事のタイトル2
2 _aioseop_title 記事のタイトル2

この場合、以下の結果になると思います。

実行後のwp_postmeta
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を流すことで

オリジナルデータ wp_postmeta (実際)
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を作っています。ここで他のプラグインが使っている情報は除外した上で使いやすい形にしています。

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は自動採番です。以下のようになるはずです。

実行後のwp_postmeta
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件更新されてる(笑)

結果確認

データの移行確認

では実際に記事投稿画面からデータが移行されているか見てみることにします。

WP記事作成画面

All-In-One SEO PackのデータがAffingerに移行されたことを確認

バッチり移行できています。せっかくなので重い重いと言われていたAll-In-One-SEO-Packを外すとどれぐらいサイトの性能が上がるんでしょうか?

性能面での向上

プラグインを外す前は以下の通りです。

改善前GoogleInsight結果

以前性能改善したのに、なんということでしょう…。気を取り直してAll-In-One-SEO-Packを外してみます。

移行後GoogleInsight結果

あんまり変わらないですね…(笑)でもこれですっきりしました。

記事は以上!

 

Affinger4,5と利用中ですが、オススメです。

WordPressテーマ「WING(AFFINGER5)」-販売ページ
デザイン簡単、SEO対策と広告収入UPの機能が標準装備。 さらに美しく、パワフルに。「稼ぐ」に特化したWING - AFFINGER5 お問い合わせについて 「実績」と「信頼」。検証と改善を重ねた唯一
WordPressテーマ「WING(AFFINGER5)」-販売ページ

 

この記事は役に立ちましたか? | Is this article useful for you?

評価をお願いします | Please leave your rating.

平均 | Av.: 0 / 5. 投票数 | Votes: 0

最初の評価を下さい | Please vote for the first rating.

-プラグイン
-, , , , , ,

Copyright© 蒲田ネット , 2000-2020 All Rights Reserved.