管理者だけが見る一時的な調査用コードです。
非公開の固定ページに設置し、共有キャッシュの対象から外して使います。
投稿・固定ページの本文が対象で、ウィジェット、テンプレート、再利用パターン内部の参照先を再帰的に調べるものではありません。
本文をID順に200件ずつ取得しますが、全体を走査する処理なので、大規模サイトでは本番で実行せずコピー環境で調べてください。
クラシックエディタからブロックエディタのテーマ(SWELL)に変更したいという要望が最近多いのですが、
テーマ独自のショートコードだったり、プラグインのショートコードだったりを変換する必要がでてしまうので、
投稿・固定ページの本文にある記法を調べるコードを紹介します。
WordPressで本文で使われているショートコードを洗い出す方法
やり方は簡単です。
管理者だけが見る非公開の調査用固定ページを用意します。
ショートコードを貼り付ける
下記のコード欄からタグをコピーし、管理者用の非公開の調査用固定ページへ角かっこ一組で設置します。
コード欄の見本自体は、本文処理を繰り返しても調査を実行しない形にしています。
[[shortcode_list]]あとはコードをfunctions.phpに記載するだけです。
functions.php
下記のコードをfunctions.phpに記載しましょう。
PHPスニペットの管理にCode Snippetsを使う場合は、子テーマへ同じコードを追加せず、一方だけで登録します。停止するときに戻せるよう、変更前のコードを保存してください。
/**
* 投稿・固定ページ内で使われているショートコードを重複なく集計
*
* @param bool $only_valid true = 登録タグの候補 / false = 未登録・不完全な記法も含む
* @return array shortcode_name => 使用回数
*/
function mtk_collect_shortcodes( $only_valid = false ) {
if ( ! current_user_can( 'manage_options' ) ) { return array(); }
global $wpdb;
$found = [];
$last_id = 0;
do {
$posts = $wpdb->get_results($wpdb->prepare(
"SELECT ID, post_content FROM {$wpdb->posts}
WHERE post_type IN ('post','page')
AND post_status NOT IN ('auto-draft','trash')
AND ID > %d ORDER BY ID ASC LIMIT 200", $last_id
));
if (!is_array($posts)) return []; // SQLの結果が取得できない場合は中断する。
foreach ($posts as $post) {
$last_id = (int) $post->ID;
$content = $post->post_content;
// かけらも拾う
if ( ! $only_valid &&
preg_match_all( '/\[([a-zA-Z0-9_-]+)/', $content, $m2 ) ) {
foreach ( $m2[1] as $tag ) {
$found[ $tag ] = isset( $found[ $tag ] ) ? $found[ $tag ] + 1 : 1;
}
}
if ( ! $only_valid ) { continue; }
// 登録済みショートコード
mtk_scan_registered_shortcodes($content, $found);
}
} while (count($posts) === 200);
ksort( $found, SORT_NATURAL | SORT_FLAG_CASE );
return $found;
}
// 登録タグの記法を調べる。ショートコードは実行しない。
function mtk_scan_registered_shortcodes($content, &$found, $depth = 0) {
global $shortcode_tags;
if (empty($shortcode_tags)) return;
if ($depth >= 8) return;
if (!preg_match_all('/' . get_shortcode_regex() . '/s', $content, $matches, PREG_SET_ORDER)) return;
foreach ($matches as $match) {
// 二重角かっこの表示用記法は候補から外す。
if ($match[1] === '[' && $match[6] === ']') continue;
$tag = $match[2];
$found[$tag] = ($found[$tag] ?? 0) + 1;
if ($match[5] !== '') mtk_scan_registered_shortcodes($match[5], $found, $depth + 1);
}
}
/* ---------- ショートコード用ラッパー ---------- */
add_shortcode( 'shortcode_list', function () {
if ( ! current_user_can( 'manage_options' ) ) { return ''; }
// 必要なら true にして「登録タグの候補だけ」表示
$list = mtk_collect_shortcodes( true );
$html = '<ul>';
foreach ( $list as $name => $cnt ) {
$html .= sprintf(
'<li><code>[%s]</code> … %d 件</li>',
esc_html( $name ),
$cnt
);
}
$html .= '</ul>';
return $html;
} );
以上です。
あとはショートコードを貼り付けた記事を確認するだけです。
trueは現在登録されているショートコードの一致数、falseは角括弧に続く名前の候補数です。候補には普通の文章や表示用コードも混ざり、無効化済みプラグインの名前を探す手がかりになります。数値は記事数ではなく出現数で、入れ子を完全に解析するものではありません。
子テーマのfunctions.phpをバックアップして既存コードと置き換えます。
調査後は固定ページのショートコードと追加した関数・登録処理を外してください。
集計結果から移行対象を決める
| 見つかった名前 | 次に確認すること |
|---|---|
| trueで見つかった登録済みタグ | そのタグを使う本文と、移行後も同じプラグインが使えるか |
| falseだけで見つかった候補 | 停止済みタグ・表示用の見本・普通の文章のどれかを本文で確認 |
| 複数回現れるタグ | 利用記事数とは分けて、各本文の置き換えが必要かを判断 |
たとえば、記事Aに同じタグが2回、記事Bに1回あれば出現数は3です。利用記事数は2です。この集計だけで「3記事の修正が必要」とは判断しません。実WordPressに専用の2投稿を作り、この違いと、集計中にタグのコールバックが実行されないことを確認しました。
候補が見つかっても、その名前だけを理由にプラグインを停止しないでください。見つかった本文を開き、移行先に同等の表示があるかを確認してから検証用サイトで置き換えます。このコードは本文を一括変換する機能を持ちません。
調査ページを非公開で保存して結果を開く
調査用の固定ページを作り、本文に表示用ショートコードを置きます。クラシックエディターなら「コード」タブ、ブロックエディターならショートコードブロックを使います。ページの公開範囲を「非公開」にして保存し、管理者でページを開いてください。コードを紹介する記事のコード欄へ置くだけでは、調査結果は表示されません。
隔離環境でクラシックエディターの本文を保存し、非公開の固定ページを開く操作を確認しました。登録済みの検証タグは1件と表示され、未登録タグと二重角括弧で表示用に記載したタグは登録済みの集計に含まれませんでした。集計の前後で、検証タグのコールバックが実行されていないことも確認しました。
非公開ページで結果を照合したら、移行対象のタグ名を控え、調査ページとスニペットを不要なまま残さないようにします。共有キャッシュを使う本番環境では、非公開ページの結果が他の閲覧者に配信されないことを別途確認してください。

200件を超える本文を分けて集計する
| 確認項目 | 検証用データの結果 |
|---|---|
| 対象の投稿・固定ページ | 452件を200・200・52件の3回で取得 |
| 405本文に2回ずつ記述 | 使用回数810件 |
| 表示用に二重角括弧で記述 | 使用回数へ加算しない |
| 集計中のタグのコールバック | 呼び出し0回 |
このコードは、対象の投稿と固定ページをIDの順に200件ずつ取得します。
200件を超えても最後のまとまりまで読み、本文中の登録済みタグを数えます。
2026年10月3日の隔離したWordPress 7.1.2 / SWELL 2.19.0では、対象452件を3回の取得で処理しました。
検証用405本文に2回ずつ置いたタグは810件と表示されました。
同じ本文に置いた二重角括弧の表示用記述は加算せず、集計中にそのタグのコールバックも実行していません。
使用回数は記事数と異なり、1本文の複数回の使用も数えます。
大量の本文を扱うときは、先にバックアップと少数の記事で結果を確かめてください。
この1回の検証から、本番の所要時間やメモリ使用量を保証することはできません。
集計画面は管理者が確認する非公開ページへ設置します。
作業後はページのショートコードを外し、集計用の登録を無効にして公開画面に残らないことを確認します。

同期パターン内のショートコードを別に調べる
この集計は投稿・固定ページに直接保存された本文を読みます。
同期パターンの参照ブロックだけが本文にある場合、パターン本体に保存されたショートコードは集計されません。
結果が0件でも、画面で使われていないと判断できない場合があります。
移行前に対象ページの編集画面で同期パターンの参照を確認し、参照元のパターンを開いて、そこに保存されたタグも別に控えます。
同じパターンを複数ページで使う場合は、パターン本体の変更が参照先へ反映されるため、代表ページだけでなく参照先も確認します。
ウィジェットやテンプレート、プラグインが生成する内容も、この本文集計の対象外です。
隔離したWordPress 7.1.2で、wp_blockの同期パターン内だけに置いた検証タグは本文集計に出ず、参照ブロックの描画時には実行されました。
投稿本文へ直接移した同じタグは1件として集計され、集計時にコールバックは実行されませんでした。
パターン編集画面での変更・再保存は今回の確認に含めていません。
集計の対象と確認した境界
trueで登録タグを調べる場合は、外側の本文を8階層まで調べ、入れ子の内側のタグも数えます。
二重角かっこの表示用記法はtrueでは除外し、falseの候補検索では含めます。
件数はタグの記法の候補数で、実行回数や利用記事数とは異なります。
同名タグの複雑な入れ子や属性内の角かっこは、WordPressの正規表現だけでは完全に解析できないため、該当本文を手で確認してください。
2026年10月2日、実WordPressのデータベースで、入れ子2件・表示用記法の除外、未完の候補、非公開本文・ゴミ箱の境界、匿名からの非表示を確認しました。
専用の205投稿を作成し、200件の取得境界をまたいでも重複や欠落なく集計することを確認しました。
クラシックエディターでの調査ページ保存と、管理者による非公開ページの結果表示は確認済みです。共有キャッシュ、スマホ表示、本番規模での処理時間は未検証です。
調査後は、まず固定ページに置いたショートコードを取り除き、次に追加したコードのスニペットを停止します。子テーマへ追加した場合は今回の関数と登録処理を外します。
登録済みのタグが空なら、登録タグの集計をせずに戻ります。
登録タグがない状態では、本文の空の角かっこを登録済みの使用回数へ加算しません。日本語・ドットを含む登録タグ、表示用記法、似た名前の未登録タグも隔離したWordPressで照合しました。
多件数の再集計で確認した範囲
| 条件 | 結果 |
|---|---|
| 200件を超えるID分割 | 登録した検証タグを3回のSQL取得で集計 |
| 対象記事の本文を変更して再集計 | 新しい使用回数へ更新 |
| ログアウト状態 | 一覧と集計結果を返さない |
2026年10月3日、隔離したWordPress 7.1.2の実データベースで、検証用投稿503件と後から追加した1件を使用しました。
1件をゴミ箱へ移した後の対象503件から検証タグ503回を集計し、さらに1記事の記法を2回へ変更すると再集計は504回になりました。
ショートコードのコールバックは実行されませんでした。
この結果は記事内のPHPとデータベースの再取得を確認したものです。
複数の取得中に内容が変わると、一時点の全件数にはなりません。
共有ページキャッシュが管理者向け一覧を他の閲覧者へ返さないことや、大規模な本番DBの処理時間は今回未確認です。
ログイン状態を含むキャッシュ設定と、公開PC・スマホの表示を別に照合してください。
一覧の表示用タグが再処理で実行されるのを防ぐ
一覧に出すタグ名は調査結果です。
一覧には角かっこを16進の文字参照へ変えて表示します。
WordPressのunescape_invalid_shortcodes()は、ショートコード処理の最後に一部の10進文字参照を角かっこへ戻します。
その形式だけで囲む対策では再処理時の実行を防げなかったため、掲載コードは16進の文字参照を使っています。
2026年10月4日、隔離したWordPress 7.1.2で検証用タグ一件を集計し、一覧HTMLを再びショートコード処理へ渡しても、そのタグのコールバックが実行されず件数が変わらないことを確認しました。
匿名閲覧者への非表示も維持しています。
文字参照を先にHTMLデコードしてから再処理する独自実装や共有キャッシュ、今回の変更後のスマホ表示は未検証です。
同じ関数やフックを重複登録せず、管理者の非公開ページでタグ名と件数を照合してください。
調査が終わったらページのショートコードを外し、集計用スニペットを停止します。



