[Simplicity]All in One SEO Pack をやめて Simplicity のSEO設定に移行する

背景

ケチってロリポップのライトプランのため、WordPressの表示が遅いと常々感じていた。

とりあえず簡単にできる速度効率化から始めようと思いプラグインを見直してみると、
噂によると、All in One SEO PackというSEO用のプラグインは遅いことで有名らしい。
このブログはSimplicityを利用していて、
このテーマにはデフォルトで似たようなSEO対策機能があるようなので、
All in One SEO Packは削除してみることにした。

目標

All in One SEO Packに入力済みの値をSimplicityのSEO設定欄に移行する。

現状、投稿のDescription(Google検索結果でページタイトルの下に表示される説明文)を、
All in One SEO Packの欄:青枠にのみ入力している。
SimplicityのほうのSEO設定入力欄:赤枠は空。

公式では非対応

All in One SEO Packからの切り替えについて
Simplicityの特徴 › フォーラム › Simplicity2に関する話題何でも › All in One SEO Packからの切り替えについて このトピックには6件の返信が含

「All in One SEO Packのデータを引き継ぐ」作業を一括でできる設定があるのでしょうか?
記事ひとつひとつ、入力しなおす方法しかないのでしょうか?

Simplicityにはそのような機能はないです。
これまでAll in One SEO Packを利用してきて、既に多数の記事のメタディスクリプションなどを入力している場合は、そのままプラグインを利用するのが最も手っ取り早いかと思います。

ということなので、機能がないなら自分でやるしかないっ!

解決策

下記SQLを実行して、meta_descriptionに_aioseop_descriptionの値を挿入する。

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 = "meta_description"

wp_postmetaはそれぞれご自身の環境に合わせてください

解説

WordPressは使うけどSQLはあまり使わない人向け解説。

1~2行目

「wp_postmetaというテーブルと、wp_postmetaテーブルからmeta_keyが_aioseop_descriptionのもののみ抜き出したaioseopというテーブルを使って、更新」

UPDATE wp_postmeta,
(SELECT post_id, meta_value as aioseop_meta_value FROM wp_postmeta WHERE meta_key = "_aioseop_description") AS aioseop

wp_postmetaテーブルでmeta_keyが_aioseop_descriptionのものを抜き出したサブクエリ (※1)に
aioseopテーブルと名付ける(※2)。

※1 既存のテーブルから必要なもののみを抽出して、今回のSQLの実行時だけ使う仮想テーブルをつくるイメージ

※2 同じテーブルを2度参照する際は別名をつける必要がある。

[MySQL] テーブル結合で同じテーブルを2度参照する
問題 商品テーブル 商品名 生産地ID 販売地ID りんご 1 2 ぶどう 3 3 みかん 10 12 … … … 都道府県テーブル 都道府県ID 都道府県名 1 北海道 2 青森県 3 ...

元は同じテーブルを参照していますが、別名をつけることで、下記の名前でそれぞれテーブルを扱えます。

  • wp_postmetaテーブル…転記先
  • aioseopテーブル…転記元
4~5行目

「meta_descriptionという列だけが更新の対象で、2つのテーブルはpost_idが一緒」

WHERE wp_postmeta.post_id = aioseop.post_id
AND wp_postmeta.meta_key = "meta_description"

転記先テーブルと転記元テーブルでそれぞれ同じpost_idを持つ行を紐づけ、
meta_keyがdescriptionのもののみ対象にする。

3行目

「wp_postmetaのmeta_valueにaioseopの値をセットして」

SET wp_postmeta.meta_value = aioseop.aioseop_meta_value

4行目で行の紐づけを行い必要な行のみを対象にしたので、
転記元のmeta_value列を、転記先のmeta_valueにSet(=値を挿入)する。

確認

下記のSQLを実行して目でちらちらーっと確認した限りでは、正しく移せてそう。
(それ以上の確認はしていないので、同じことを試される場合はあくまで自己責任で)

SELECT * FROM `wp_postmeta` WHERE meta_key = "meta_description" OR meta_key = "_aioseop_description" ORDER BY `wp_postmeta`.`post_id` ASC

メモ

メタタグのデータは、データベースのwp_postmetaに入っている。

Discriptionにかかわらず、メタタグはすべてここに格納されていて、
meta_keyで、メタタグの種類を指定している。

  • wp_postmetaテーブルのカラム
    • meta_id
    • post_id
    • meta_key
    • meta_value
データベース構造 - WordPress Codex 日本語版

All in One SEO Packのディスクリプションも、SimplictyのSEO設定のメタディスクリプションも、例に倣って上記テーブルに格納されている。
meta_keyはそれぞれ下記の通り。

  • All in One SEO Pack – _aioseop_description
  • Simplicity – meta_description

※ meta_descriptionは、現在有効となっている投稿すべてで存在しているが、
_aioseop_descriptionは、入力があった投稿のみINSERTされている

各記事を更新するたびにPOST IDが新しくなるが、
wp_postmetaテーブルに保存されているpost_idは、最新のものっぽいので、過去のPOST IDのメタタグがそれぞれ保存されているわけではないらしい

注意事項

  • くれぐれもデータベースはバックアップとってから。
  • 今回はディスクリプション欄のみ移行しましたが、タイトルも同じ方法でできる(と思います)。
  • SEOのデータを移行したら、プラグインの設定でちゃんとSimplicityのDescriptionを使うように設定
    • 外観 > カスタマイズ > SEO > 投稿ページにメタディスクリプションを挿入 にチェック