テーマ固有のショートコードを数える|ブロックの名前空間も、REST APIで本文から集計
WordPressのテーマを変えると、デザインだけでなく、テーマが用意していたショートコードやブロックが使えなくなることがあります。記事の本文には [名前] や <!-- wp:名前空間/ブロック --> の形で残るため、テーマを変える前に、本文にどれだけ使われているかを数えておくと、変えた後に直す量が分かります。この記事では、REST APIで全記事・固定ページの本文を読み、ショートコードとブロックの名前空間を数える方法を、筆者のサイトで実行した結果とあわせて紹介します。
(確認:筆者のWordPressサイト(WordPress 7.1.3・テーマはLightningの子テーマ)で、2026年10月21日に実行。取得は読み取りだけで、サイトの設定や記事は変えていません)
テーマを変えると、なぜ残るのか
ショートコードは、登録した側(テーマやプラグイン)が有効な間だけ、表示の時に中身に置き換えられます。WordPressの公式リファレンス(do_shortcode)には、ショートコードのタグが登録されていない場合、本文は処理されずにそのまま返され、プラグインを止めた時にショートコードが記事にそのまま表示される問題が起きうる、と書かれています。テーマが登録したショートコードも同じで、テーマを変えると、本文に [名前] の文字がそのまま見える可能性があります。
ブロックは、本文にHTMLのコメント(<!-- wp:… -->)と中身のHTMLで保存されます。名前空間(/ の前の部分)が core ならWordPress本体のブロックで、それ以外はテーマやプラグインが追加したブロックです。追加した側が無くなると、エディタでは対応していないブロックとして扱われ、編集や表示に影響します(表示される文言は、この記事では確かめていません)。
なお、WordPress.orgのテーマディレクトリに載せるテーマは、審査の必須要件で、ショートコードやカスタムブロックを含めてはいけない(プラグインの領域)とされています。テーマディレクトリに無い有料テーマは、この要件の対象外のため、テーマ自体や専用のプラグインで、独自のショートコード・ブロックを持っている場合があります。どれを持っているかは、テーマごとに公式の説明で確かめてください。
コード
次のコードは、公開済みの記事と固定ページの本文(編集用の生データ)を取得して、ショートコードの名前と、ブロックの名前空間を数えます。記事の中に載せたコード例(arr[i] など)をショートコードと数えないように、pre・code・script・style の中は除いています。
# テーマ固有のショートコードとブロックを数える:全記事・固定ページの本文(編集用の生データ)から、
# [名前 ...] 形式のショートコードと、<!-- wp:名前空間/ブロック --> のブロックを集計する(読み取りのみ)。
import os, re, json, base64, urllib.request
from collections import Counter
SITE = os.environ["WP_SITE"].rstrip("/")
AUTH = "Basic " + base64.b64encode(f'{os.environ["WP_USER"]}:{os.environ["WP_APP_PASSWORD"]}'.encode()).decode()
def get_all(kind):
items, page = [], 1
while True:
url = f"{SITE}/wp-json/wp/v2/{kind}?status=publish&per_page=100&page={page}&context=edit&_fields=id,content"
req = urllib.request.Request(url, headers={"Authorization": AUTH})
try:
with urllib.request.urlopen(req, timeout=60) as r:
batch = json.load(r)
except urllib.error.HTTPError as e:
if e.code == 400: # ページの範囲外
break
raise
items += batch
if len(batch) < 100:
break
page += 1
return items
shortcodes, blocks, used_in = Counter(), Counter(), Counter()
docs = get_all("posts") + get_all("pages")
for d in docs:
raw = d["content"]["raw"]
text = re.sub(r"(?is)<(pre|code|script|style)[^>]*>.*?</\1>", "", raw) # コード例や埋め込みのスクリプト(arr[i] など)は数えない
found = set()
for name in re.findall(r"\[([a-zA-Z][\w-]*)[\s\]/]", text): # [name] [name attr] [name/]
shortcodes[name] += 1; found.add("sc:" + name)
for name in re.findall(r"<!-- wp:([a-z0-9-]+/[a-z0-9-]+|[a-z0-9-]+)", raw):
ns = name.split("/")[0] if "/" in name else "core"
blocks[ns] += 1; found.add("ns:" + ns)
for f in found:
used_in[f] += 1
print("本文の数:", len(docs))
print("ショートコード(名前・回数・使っている本文の数)")
for name, c in shortcodes.most_common(15):
print(f" [{name}] {c} 回 / {used_in['sc:' + name]} 本")
print("ブロックの名前空間(回数・使っている本文の数)")
for ns, c in blocks.most_common(15):
print(f" {ns} {c} 回 / {used_in['ns:' + ns]} 本")
認証情報は環境変数(WP_SITE・WP_USER・WP_APP_PASSWORD)に入れ、コードには書きません。context=edit で生データを読むには、編集の権限があるユーザーのアプリケーションパスワードが必要です。
筆者のサイトの結果
本文の数: 288
ショートコード(名前・回数・使っている本文の数)
ログイン
1 回 / 1 本
1 回 / 1 本
ブロックの名前空間(回数・使っている本文の数)
core 156 回 / 57 本
woocommerce 47 回 / 2 本
最初に実行した時は、コード例を除く処理を入れておらず、[i](59回)・[index](17回)などが上位に並びました。これは、MQL5やJavaScriptの記事に載せたコードの配列の書き方で、ショートコードではありません。除いた後に残ったのは、WooCommerce(プラグイン)の2つだけでした。
| 項目 | 結果 | テーマを変えた時の影響 |
|---|---|---|
| ショートコード | WooCommerceの2つ(各1本) | プラグインのものなので、テーマを変えても残る |
| ブロック(core) | 156回・57本 | WordPress本体のブロックなので、テーマに関係なく使える |
| ブロック(woocommerce) | 47回・2本 | プラグインのもの |
| テーマ固有のショートコード・ブロック | 0 | 本文の書き換えは不要 |
288本のうち、ブロックの形で保存されているのは57〜59本(coreの57本と、woocommerceの2本が重なっているかは数えていません)で、残りはHTMLのまま書かれた本文です。筆者のサイトは、記事の多くをREST APIから投稿しているため、ブロックの形になっていない本文が多いと考えられます。
結果の読み方
- 名前空間がテーマ名やテーマの会社名のブロック:テーマを変えると、そのブロックが使えなくなる可能性が高い。使っている本の数が、直す量の目安
- テーマの説明書に載っているショートコード:テーマを変えると、文字のまま表示される可能性がある
- プラグインのもの:プラグインを止めない限り、テーマを変えても残る
どの名前がテーマのものかは、名前だけでは判断できない場合があります。テーマの説明書やエディタのブロック一覧で、提供元を確かめてください。有料テーマを買う前に、デモサイトや無料版で、どんなショートコード・ブロックを使う作りかを見ておくと、将来テーマを変える時の手間を見積もれます。
この方法で分からないこと
- ウィジェットや、テーマのカスタマイザーに入れたショートコード(本文以外の場所)
- 予約中・下書きの記事(このコードは公開済みだけを数えています。
statusを変えれば数えられます) - 置き換え先のテーマで、同じ見た目を作るのにかかる時間
テーマを変える前の全体の記録はテーマを変える前に今のサイトの状態を記録する方法に、有料テーマ3つ(LIQUID PRESS・Emanon・SWALLOW)の違いは有料WordPressテーマの選び方にまとめています。
まとめ
- テーマやプラグインが登録したショートコードは、登録した側が無くなると、本文にそのまま表示される可能性がある
- REST APIで本文の生データを読み、コード例を除いてから、ショートコードとブロックの名前空間を数える
- 筆者のサイトは288本中、テーマ固有のものは0で、テーマを変えても本文の書き換えは不要という結果だった
本記事は読み取りの方法の説明です。テーマの変更や記事の書き換えは含みません。


