ご注意下さい
この記事は3年以上前に書かれた記事ですので、内容が古い可能性があります。
今回はWordPressの機能である記事の「抜粋」に、SEO対策の一つであるメタディスクリプションのデータを移行する手順についてご紹介します。
注意ポイント
WordPressのデータベース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
移行用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件になりました。
WING(Affinger5)について
このサイトはWINGで構築しています。パーツが豊富で非常に使いやすいのでむしろ初心者にお薦めです。このテーマを使えばコンテンツの作成に集中できると思います。
記事は以上!