テーマ固有のショートコードを数える|ブロックの名前空間も、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で、テーマを変えても本文の書き換えは不要という結果だった

本記事は読み取りの方法の説明です。テーマの変更や記事の書き換えは含みません。