WPチューニング

メタディスクリプションと記事抜粋の違いとデータ移行方法(SQL付き)

0
(0)

今回はWordPressの機能である記事の「抜粋」に、SEO対策の一つであるメタディスクリプションのデータを移行する手順についてご紹介します。

注意ポイント

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

記事抜粋とメタディスクリプションの違い

まずは両者の違いについて押さえておきたいと思いますが、この記事に辿り着いた、ということは(本来は分けたほうがいいですが)手っ取り早く今まで(気にもせず)書いてきたメタディスクリプションの値を抜粋にコピーしたい、というニーズの読者だと思います。なので基本は押さえているはず、ということでさらっとご紹介すると、

記事抜粋
  • WordPressの機能。WordPress内のみで有効
  • 記事一覧でタイトルの下に表示される記事の概要
  • WordPress4までは記事作成画面の表示設定で「抜粋」にチェックを入れておかないと表示されなかったため見落としがち
メタディスクリプション
  • SEO対策の為検索エンジンに渡す記事抜粋
  • 検索結果の記事の説明として表示される

ということになります。

さて、私はいままで両者の違いを全く気にせず運用してきましたので「抜粋」は空欄のまま、メタディスクリプションはテキトーに書いてきました(が、一応書いてきています)。

なので、今回はメタデスクリプションから抜粋に一律コピーしたいと思います。記事も多いので手でコピーするのは大変ですので。

データベースのバックアップ

さて、今からデータの移行をしますのでしっかりバックアップを取得しておきましょう。

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

移行用SQL

バックアップを取得したら、移行用のSQLを流します。SQLは以下の通りです。

UPDATE
    wp_posts,
    (
        SELECT 
            post_id, meta_value 
        FROM 
            wp_postmeta
        WHERE
            meta_key = "st_description"
    ) AS stinger
SET
    wp_posts.post_excerpt = stinger.meta_value
WHERE
    wp_posts.ID = stinger.post_id

移行対象テーブル

軽くこのSQLについて説明していきます。まずは移行対象のテーブルをよく見ておきます。

mysql> show columns from wp_posts;
+-----------------------+---------------------+------+-----+---------------------+----------------+
| Field                 | Type                | Null | Key | Default             | Extra          |
+-----------------------+---------------------+------+-----+---------------------+----------------+
| ID                    | bigint(20) unsigned | NO   | PRI | NULL                | auto_increment |
| post_author           | bigint(20) unsigned | NO   | MUL | 0                   |                |
| post_date             | datetime            | NO   |     | 0000-00-00 00:00:00 |                |
| post_date_gmt         | datetime            | NO   |     | 0000-00-00 00:00:00 |                |
| post_content          | longtext            | NO   | MUL | NULL                |                |
| post_title            | text                | NO   | MUL | NULL                |                |
| post_excerpt          | text                | NO   |     | NULL                |                |
| post_status           | varchar(20)         | NO   |     | publish             |                |
| comment_status        | varchar(20)         | NO   |     | open                |                |
| ping_status           | varchar(20)         | NO   |     | open                |                |
| post_password         | varchar(255)        | NO   |     |                     |                |
| post_name             | varchar(200)        | NO   | MUL |                     |                |
| to_ping               | text                | NO   |     | NULL                |                |
| pinged                | text                | NO   |     | NULL                |                |
| post_modified         | datetime            | NO   |     | 0000-00-00 00:00:00 |                |
| post_modified_gmt     | datetime            | NO   |     | 0000-00-00 00:00:00 |                |
| post_content_filtered | longtext            | NO   |     | NULL                |                |
| post_parent           | bigint(20) unsigned | NO   | MUL | 0                   |                |
| guid                  | varchar(255)        | NO   |     |                     |                |
| menu_order            | int(11)             | NO   |     | 0                   |                |
| post_type             | varchar(20)         | NO   | MUL | post                |                |
| post_mime_type        | varchar(100)        | NO   |     |                     |                |
| comment_count         | bigint(20)          | NO   |     | 0                   |                |
+-----------------------+---------------------+------+-----+---------------------+----------------+
23 rows in set (0.00 sec)

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> 
移行種別 対象テーブル 対象カラム キー
移行元 wp_postmeta meta_value
ただしmeta_key="st_description"の時のみ
post_id
移行先 wp_posts post_excerpt ID

これを踏まえてSQLを解説していきます。

移行用SQL解説

    (
        SELECT 
            post_id, meta_value 
        FROM 
            wp_postmeta
        WHERE
            meta_key = "st_description"
    ) AS stinger

まずはこちらですが、移行元となるAffingerのテーブルからメタデスクリプションを取り出すSQLです。meta_keyがst_descriptionと一致するレコードからpost_idとmeta_value(メタデスクリプション本文)を抜いてくるSQLです。

UPDATE
    wp_posts
SET
    wp_posts.post_excerpt = stinger.meta_value
WHERE
    wp_posts.ID = stinger.post_id

先程抜いてきたデータの移行先テーブルのwp_postsにデータを移していきますが、

  • IDとpost_idが一致する時
  • post_excerptにmeta_valueをセット

する、という割と簡単なSQLです。

実行結果

実行結果は以下の通り。

mysql> select count(*) from wp_posts where post_excerpt != "";
+----------+
| count(*) |
+----------+
|       16 |
+----------+
1 row in set (0.00 sec)

mysql> UPDATE
    ->     wp_posts,
    ->     (
    ->         SELECT
    ->             post_id, meta_value
    ->         FROM
    ->             wp_postmeta
    ->         WHERE
    ->             meta_key = "st_description"
    ->     ) AS stinger
    -> SET
    ->     wp_posts.post_excerpt = stinger.meta_value
    -> WHERE
    ->     wp_posts.ID = stinger.post_id;
Query OK, 48 rows affected (0.02 sec)
Rows matched: 54  Changed: 48  Warnings: 0

mysql> select count(*) from wp_posts where post_excerpt != "";
+----------+
| count(*) |
+----------+
|       64 |
+----------+
1 row in set (0.01 sec)

mysql> select count(*) from wp_postmeta where meta_key = "st_description";
+----------+
| count(*) |
+----------+
|       54 |
+----------+
1 row in set (0.00 sec)

mysql>

もともと抜粋に16件あったようですが、Affingerのメタデスクリプションからデータをお引越しして64件になりました。

記事は以上!

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

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

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

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

-WPチューニング
-, , , , , ,

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