テーマを変える前に今のサイトの状態を記録する|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つのままでも、テーマを変えたせいで増えたわけではないと判断できます。
記録の使い方
- テーマを変える前に、コードを実行してJSONに保存する
- テーマを変えたあと(またはステージング環境で)、同じコードを実行して比べる
- 数が変わった項目だけ、画面を開いて原因を確かめる(メニューの場所の割り当て、ウィジェットの配置、SEOプラグインの出力)
ステージング環境のあるサーバーなら、本番に反映する前にこの比較ができます(ステージング環境のあるサーバーの比較)。テーマを変えると何が変わるかの全体像はブロックテーマかクラシックテーマかの見分け方、子テーマが有効かどうかの確認は子テーマの確認方法が参考になります。
この方法で分からないこと
- 見た目(色・余白・フォント)の変化。数字では表せないので、スクリーンショットを別に取る
- テーマ固有のショートコードやブロックが、変更後に正しく表示されるか
- 表示速度の変化(ChromeでLCPとCLSを測る方法で別に測る)
まとめ
- テーマを変える前に、件数(記事・メニュー・ウィジェットなど)と主要ページの構成(h1・h2・画像・構造化データ)をJSONに保存しておく
- 筆者のサイトでは、記事270・メニュー2・ウィジェット6を記録し、トップページのh1が2つであることも分かった
- 変更後に同じコードで比べれば、数が変わった項目だけを調べればよい
本記事は読み取りの方法の説明です。テーマの変更や設定の変更は含みません。実際にテーマを変える前には、バックアップを取ってください。


