テーマを変える前に今のサイトの状態を記録する|REST APIで記事・メニュー・見出しの数を数える

テーマを変えたあと、「前より表示が崩れていないか」を確かめるには、変える前の状態を数字で記録しておくと、比べやすくなります。この記事では、WordPressのREST APIで記事・固定ページ・メニュー・ウィジェットの数を数え、主要ページのHTMLから見出し・画像・構造化データの数を数える方法を、筆者のサイトで実際に実行した結果とあわせて紹介します。

(確認:筆者のWordPressサイト(WordPress 7.1.3・子テーマを使用)で、2026年10月20日に実行。取得は読み取りだけで、サイトの設定は変えていません)

記録する項目

項目 取り方 テーマを変えた後に見ること
記事・固定ページ・カテゴリー・タグ・メディア・コメントの数 REST APIの X-WP-Total ヘッダー テーマを変えても数は変わらないはず。変わったら異常
メニュー・サイドバー・ウィジェットの数 /menus・/sidebars テーマごとに場所の名前が違い、ウィジェットが外れることがある
主要ページのh1・h2・h3・画像の数 ページのHTML h1が増えていないか(テーマによってh1の付け方が違う)
構造化データ(JSON-LD)の数 HTMLの application/ld+json 減っていたら、SEOプラグインとの連携が切れている可能性
canonical・OGP画像の有無 HTML テーマ側で出力していると、変えた時に消える

コード

# -*- coding: utf-8 -*-
# テーマを変える前の記録:REST APIで件数を数え、主要ページのHTMLから見出し・画像・構造化データの数を数えて JSON に保存する(読み取りのみ)。
# 認証情報は環境変数 WP_SITE / WP_USER / WP_APP_PASSWORD から読む。
import base64, json, os, re, sys, urllib.request
sys.stdout.reconfigure(encoding='utf-8')
SITE = os.environ['WP_SITE'].rstrip('/')
AUTH = 'Basic ' + base64.b64encode(f"{os.environ['WP_USER']}:{os.environ['WP_APP_PASSWORD']}".encode()).decode()

def api(path):
    req = urllib.request.Request(f'{SITE}/wp-json/wp/v2/{path}', headers={'Authorization': AUTH, 'User-Agent': 'theme-snapshot/1.0'})
    with urllib.request.urlopen(req, timeout=30) as r:
        return r.headers.get('X-WP-Total'), json.loads(r.read().decode())

def html(url):
    with urllib.request.urlopen(urllib.request.Request(url, headers={'User-Agent': 'theme-snapshot/1.0'}), timeout=30) as r:
        return r.read().decode('utf-8', 'replace')

snap = {'counts': {}, 'pages': {}}
for name in ('posts', 'pages', 'categories', 'tags', 'media', 'comments'):
    total, _ = api(f'{name}?per_page=1')
    snap['counts'][name] = int(total)
snap['counts']['menus'] = len(api('menus?per_page=100')[1])
sidebars = api('sidebars?per_page=100')[1]
snap['counts']['sidebars'] = len(sidebars)
snap['counts']['widgets'] = sum(len(s.get('widgets', [])) for s in sidebars)
snap['active_theme'] = [t['stylesheet'] for t in api('themes?status=active')[1]]
# 主要ページ(トップ+新しい記事3本)の構成を数える
urls = [SITE + '/'] + [p['link'] for p in api('posts?per_page=3&_fields=link')[1]]
for u in urls:
    h = html(u)
    snap['pages'][u] = {
        'title': re.findall(r'<title>([^<]*)</title>', h)[:1],
        'h1': len(re.findall(r'<h1[ >]', h)), 'h2': len(re.findall(r'<h2[ >]', h)), 'h3': len(re.findall(r'<h3[ >]', h)),
        'img': len(re.findall(r'<img\b', h)), 'jsonld': len(re.findall(r'application/ld\+json', h)),
        'canonical': bool(re.search(r'rel="canonical"', h)), 'og_image': bool(re.search(r'og:image', h)),
        'bytes': len(h.encode('utf-8')),
    }
json.dump(snap, open('theme_snapshot.json', 'w', encoding='utf-8'), ensure_ascii=False, indent=1)
print(json.dumps(snap['counts'], ensure_ascii=False))
for u, v in snap['pages'].items():
    print({k: v[k] for k in ('h1', 'h2', 'h3', 'img', 'jsonld', 'canonical', 'og_image', 'bytes')})

上のコードは、筆者が実際に実行したものです。件数はREST APIから、見出し・画像・構造化データの数は主要ページ(トップと新しい記事3本)のHTMLから数え、theme_snapshot.json に保存します。テーマを変えた後に同じコードを実行して差を見ます。認証情報は環境変数(WP_SITE・WP_USER・WP_APP_PASSWORD)に入れ、コードには書きません。

筆者のサイトの結果(変更前の記録)

項目 値
記事 270
固定ページ 10
カテゴリー 11
タグ 0
メディア 308
コメント 0
メニュー 2
サイドバー(ウィジェット領域) 15
実際に置かれているウィジェット 6

トップページと、新しい記事3本のHTMLを数えたところ、記事ページはh1が1つ、構造化データが1つ、canonicalとOGP画像ありでした。一方、トップページはh1が2つでした。変更前の記録に「トップページはh1が2つ」と残るので、変更後に2つのままでも、テーマを変えたせいで増えたわけではないと判断できます。

記録の使い方

  1. テーマを変える前に、コードを実行してJSONに保存する
  2. テーマを変えたあと(またはステージング環境で)、同じコードを実行して比べる
  3. 数が変わった項目だけ、画面を開いて原因を確かめる(メニューの場所の割り当て、ウィジェットの配置、SEOプラグインの出力)

ステージング環境のあるサーバーなら、本番に反映する前にこの比較ができます(ステージング環境のあるサーバーの比較)。テーマを変えると何が変わるかの全体像はブロックテーマかクラシックテーマかの見分け方、子テーマが有効かどうかの確認は子テーマの確認方法が参考になります。

この方法で分からないこと

  • 見た目(色・余白・フォント)の変化。数字では表せないので、スクリーンショットを別に取る
  • テーマ固有のショートコードやブロックが、変更後に正しく表示されるか
  • 表示速度の変化(ChromeでLCPとCLSを測る方法で別に測る)

まとめ

  • テーマを変える前に、件数(記事・メニュー・ウィジェットなど)と主要ページの構成(h1・h2・画像・構造化データ)をJSONに保存しておく
  • 筆者のサイトでは、記事270・メニュー2・ウィジェット6を記録し、トップページのh1が2つであることも分かった
  • 変更後に同じコードで比べれば、数が変わった項目だけを調べればよい

本記事は読み取りの方法の説明です。テーマの変更や設定の変更は含みません。実際にテーマを変える前には、バックアップを取ってください。