トラブルシューティング
よくある問題の原因と対処法、そして技術仕様(DB スキーマ/REST API/nonce/フック一覧)を実装ベースで詳細にまとめています。
よくある問題と解決策
著者パネルが何も表示されない
原因: ID 指定が空、すべて無効値、指定 ID のエンティティが存在しない、またはブロック配置後に参照先エンティティが削除されたケース。
管理画面の Person / Corporation / Organization タブでエンティティが存在することを確認します。ID は一覧表示の「ID」列で確認できます。
ショートコード指定値をチェックします。parse_ids() は absint() を適用し array_filter で 0 や不正値を捨てるため、persons="abc" や persons="0" は空と同じ扱いになります。正しくは整数 ID をカンマ区切りで persons="1,3,5"。
Gutenberg ブロックで配置した場合、ブロックを選択して右サイドバーのエンティティチェック状態を確認してください。削除済みエンティティを参照していると空出力になります(エラー表示は出ません)。
KAPM_Shortcode::render() は、persons/corporations/organizations の 3 属性がすべて空配列 (または DB 照合後に全件見つからない) になった場合、空文字 '' を返します。ブロックの場合も同様に HTML 出力がゼロになります。
Custom モードの JSON-LD が出力されない
原因: ほぼ必ず以下のいずれかです。
| 原因 | 確認方法 |
|---|---|
target_schema_id(ブロックでは targetSchemaId)が空 |
Custom モードでこれが空だと、Custom JSON-LD は一切出力されません(HTML パネルは出ます)。 |
ページが is_singular() でない |
preparse_custom_mode() はホーム/アーカイブ/検索結果/404 では動作しません。個別投稿・固定ページ・個別 CPT でのみ出力されます。 |
他プラグインのスキーマ @id と不一致 |
Yoast SEO 等が出している @id(https://example.com/post/#article など)を完全一致でコピーする必要があります。クエリ文字列の有無、末尾スラッシュの有無も区別されます。 |
ブラウザ(AMP/キャッシュ系)が <head> を書き換え |
ページ HTML のソースを直接確認してください(ブラウザ DevTools の Elements ではなく「ページのソースを表示」)。 |
Custom モードの JSON-LD は <head> 内に wp_head の priority 99 で出力されます。ページソースで <!-- Kashiwazaki SEO Author Panel Manager - Custom Mode JSON-LD --> というコメントを検索すると、本プラグインが出力した JSON-LD 部分を特定できます。Standard モード側のコメントは Standard Mode JSON-LD です。
ブロックエディタに登録済みエンティティが表示されない
原因: REST API の権限不足、または nonce の有効期限切れ。
ログイン中のユーザーが edit_posts 権限を持つか確認します(投稿者・寄稿者・編集者・管理者ロールでは持っています)。購読者ロールでは不足します。
ブラウザ DevTools の Network タブで /wp-json/kapm/v1/persons へのリクエストを確認します。401/403 が返っていれば権限/nonce の問題、空配列 [] が返っていればエンティティ未登録です。
ブラウザで直接 /wp-json/kapm/v1/persons を開くと(ログイン中なら)JSON 配列が確認できます。ここで空であれば管理画面 Person タブからの新規追加が必要です。
使用中の記事セクションに表示されない
原因: KAPM_Database::get_posts_using_entity() の検出対象には制約があります。以下に該当する場合、参照されていても表示されません。
post_statusがpublish以外(下書き/非公開/予約投稿/ゴミ箱/revision)- ショートコード
[author_panel persons="..."]で配置した場合(ブロック属性の JSON 形式とパターンが一致しないため検出されない) - ブロック属性の ID 文字列フォーマットが変則的な場合(通常の
"persons":"1,2"以外)
なお v1.0.1 から、Group / Columns / Row / Reusable ブロック内にネストされた kapm/author-panel も検出されるようになりました(v1.0.0 は top-level ブロックのみ走査)。
この制約はセキュリティや性能面の意図的な設計です。下書き投稿まで検索対象にすると LIKE 検索が重くなるため、post_status='publish' でフィルタしています。ショートコード経由の参照を検出したい場合は、本文内を SELECT で手動検索するか、該当箇所を Gutenberg ブロックに置き換えてください。
パネルのスタイルが壊れる・テーマと衝突する
原因: テーマ側の a タグや .wp-block-* への広範な CSS リセットが、パネル内のリンクやアイコンに波及しているケース。
ブラウザ DevTools で .kapm-author-panel、.kapm-author-card、.kapm-icon のスタイルを確認します。`!important` で上書きされているルールがあれば、テーマ側 CSS か別プラグインが原因です。
一時的に Twenty Twenty-Four など WordPress 標準テーマに切り替えて再現するか確認します。標準テーマで崩れない場合、問題は使用中のテーマ CSS にあります。
テーマの style.css や Customizer の追加 CSS で、.kapm-author-panel 配下のセレクタを明示的に override して調整してください。
sameAs のアイコンが汎用 Web アイコンになる
原因: 入力された URL のホスト名が 44 ドメインのマッピングのどれにも一致していないか、URL が FILTER_VALIDATE_URL を通過していない。
URL が http:// または https:// から始まる完全な形式であることを確認します。ホスト名のみ(x.com/username)は無効です。
マッピングに含まれるドメインは ショートコード&ブロックページの sameAs 44 ドメイン一覧で確認できます。該当しないサービスの場合、汎用 dashicons-admin-site(地球儀アイコン)にフォールバックするのが仕様です。
技術仕様: データベーススキーマ
プラグイン有効化時に KAPM_Database::create_tables() が dbDelta() で 3 テーブルを生成します。以下は class-database.php の実定義に基づく完全なカラム一覧です。{prefix} は WordPress の $wpdb->prefix(通常 wp_)に置換されます。
{prefix}apm_persons テーブル
| カラム名 | 型 | NULL 許可 | 既定値 | 備考 |
|---|---|---|---|---|
id | bigint(20) unsigned | NOT NULL | AUTO_INCREMENT | PRIMARY KEY |
name | varchar(255) | NOT NULL | '' | 表示名(必須) |
name_en | varchar(255) | NOT NULL | '' | 英語名 |
role | varchar(255) | NOT NULL | 'Author' | Role 文字列(自由入力) |
job_title | varchar(255) | NOT NULL | '' | 肩書き |
bio | text | NOT NULL | (空文字) | 自己紹介 |
image_url | varchar(2083) | NOT NULL | '' | プロフィール画像 URL |
url | varchar(2083) | NOT NULL | '' | 個人サイト URL |
same_as | text | NOT NULL | (空文字) | sameAs URL 群(1 行 1 URL) |
panel_style | varchar(50) | NOT NULL | 'default' | パネルデザイン識別子 |
created_at | datetime | NOT NULL | CURRENT_TIMESTAMP | 作成日時 |
{prefix}apm_corporations テーブル
| カラム名 | 型 | NULL 許可 | 既定値 | 備考 |
|---|---|---|---|---|
id | bigint(20) unsigned | NOT NULL | AUTO_INCREMENT | PRIMARY KEY |
name | varchar(255) | NOT NULL | '' | 企業名(必須) |
name_en | varchar(255) | NOT NULL | '' | 英語名 |
role | varchar(255) | NOT NULL | 'Publisher' | Role 文字列(Person と既定値が異なる) |
description | text | NOT NULL | (空文字) | 企業説明 |
url | varchar(2083) | NOT NULL | '' | 公式サイト URL |
logo_url | varchar(2083) | NOT NULL | '' | ロゴ画像 URL |
same_as | text | NOT NULL | (空文字) | sameAs URL 群 |
panel_style | varchar(50) | NOT NULL | 'default' | パネルデザイン識別子 |
created_at | datetime | NOT NULL | CURRENT_TIMESTAMP | 作成日時 |
{prefix}apm_organizations テーブル
カラム構成は apm_corporations と完全同一(同じ 10 カラム)ですが、別テーブルに保存されます。JSON-LD では Organization 型、apm_corporations は Corporation 型として出力される点だけが異なります。
3 つのテーブルとも PRIMARY KEY (id) のみで、name や url 等に対する追加インデックスはありません。エンティティ件数は通常数十件程度を想定しており、LIKE 検索も含め現状のテーブル設計で性能問題は発生しない想定です。大量エンティティ(数千件以上)を扱う場合は、利用パターンに応じて追加インデックスを検討してください。
技術仕様: REST API
ブロックエディタのサイドバーがエンティティ一覧を取得するための読み取り専用エンドポイントです。管理画面のリストは PHP 直接呼び出しで取得するため、REST API には依存しません。
| エンドポイント | メソッド | 権限 | レスポンス |
|---|---|---|---|
/wp-json/kapm/v1/persons |
GET | edit_posts |
{prefix}apm_persons 全行を id 昇順で配列返却。各行は id, name, name_en, role, job_title, bio, image_url, url, same_as, panel_style, created_at の 11 キー。 |
/wp-json/kapm/v1/corporations |
GET | edit_posts |
{prefix}apm_corporations 全行。各行は id, name, name_en, role, description, url, logo_url, same_as, panel_style, created_at の 10 キー。 |
/wp-json/kapm/v1/organizations |
GET | edit_posts |
{prefix}apm_organizations 全行。Corporation と同じキー構成。 |
エディタからの呼び出しでは、リクエストに X-WP-Nonce: {wp_rest nonce} ヘッダーを付与することで WordPress の Cookie 認証が適用されます。nonce は enqueue_block_editor_assets フックで wp_create_nonce('wp_rest') を使って kapmData.nonce に注入されています。権限チェックは各ルートの permission_callback で current_user_can('edit_posts') を実行。
技術仕様: nonce アクション名一覧
管理画面側の保存・削除処理は、すべて nonce 検証 + capability チェックで保護されています。以下が 6 種類の nonce アクション名とフィールド名です(トラブル切り分け時に URL や POST データを確認する際に使えます)。
| 操作 | nonce アクション名 | nonce 送信元 |
|---|---|---|
| Person 保存 (新規/更新) | kapm_save_person | POST: kapm_person_nonce フィールド |
| Person 削除 | kapm_delete_person | GET: _wpnonce (URL) |
| Corporation 保存 | kapm_save_corporation | POST: kapm_corporation_nonce フィールド |
| Corporation 削除 | kapm_delete_corporation | GET: _wpnonce (URL) |
| Organization 保存 | kapm_save_organization | POST: kapm_organization_nonce フィールド |
| Organization 削除 | kapm_delete_organization | GET: _wpnonce (URL) |
これらに加え、管理画面全体は current_user_can('manage_options')(管理者権限)でガードされ、入力値は sanitize_text_field() / sanitize_textarea_field() / esc_url_raw() で保存時に無害化、出力時は esc_html() / esc_attr() / esc_url() でエスケープされます。
技術仕様: 登録フック一覧
本プラグインが登録している WordPress アクション/フィルタは以下のとおりです。トラブル時は WP_DEBUG + Query Monitor 等でフック実行順を確認してください。
| フック名 | 種類 | 優先度 | コールバック(概要) |
|---|---|---|---|
init | action | 10 | KAPM_Gutenberg::register_block(ブロック登録) |
enqueue_block_editor_assets | action | 10 | KAPM_Gutenberg::enqueue_editor_assets(エディタ JS 読み込み + kapmData 注入) |
rest_api_init | action | 10 | KAPM_Gutenberg::register_rest_routes(3 エンドポイント登録) |
add_shortcode('author_panel') | shortcode | - | KAPM_Shortcode::render |
wp_enqueue_scripts | action | 10 | KAPM_Shortcode::enqueue_styles(panel-style.css の register) |
template_redirect | action | 10 | KAPM_Shortcode::preparse_custom_mode(Custom モードの先行パース) |
wp_head | action | 99 | KAPM_Shortcode::output_custom_json_ld(Custom JSON-LD 出力) |
admin_menu | action | 10 | KAPM_Admin::add_menus(position 81) |
admin_enqueue_scripts | action | 10 | KAPM_Admin::enqueue_styles(管理画面 CSS + media.js) |
plugin_action_links_{basename} | filter | 10 | プラグイン一覧に「設定」リンクを追加 |
register_activation_hook | activation | - | KAPM_Database::create_tables |
技術仕様: フロントエンド資産
| 項目 | 内容 |
|---|---|
| CSS ファイル | public/css/panel-style.css(実測 4,629 バイト) |
| JavaScript | フロントエンドでは一切使用しません(エディタ / 管理画面を除く) |
| CSS の読み込み条件 | ショートコード / ブロックが実際に render() された時のみ wp_enqueue_style() |
| Standard JSON-LD の出力位置 | ショートコードの戻り値 HTML 末尾(本文内) |
| Custom JSON-LD の出力位置 | wp_head priority 99(</head> 直前付近) |
| 依存スタイル | dashicons(WP コア同梱) |
技術仕様: アンインストール挙動
WordPress 管理画面でプラグインを「削除」すると、uninstall.php が自動実行され、以下の SQL が走ります。復元は不可能なので、データが必要なら事前にバックアップを取ってください。
DROP TABLE IF EXISTS {prefix}apm_persons;
DROP TABLE IF EXISTS {prefix}apm_corporations;
DROP TABLE IF EXISTS {prefix}apm_organizations;
なお、「無効化 (deactivate)」ではテーブルは削除されません。一時的にプラグインを止めたい場合は「無効化」を使ってください。
技術仕様: 他プラグイン・テーマとの互換性
本プラグインは構造化データを「追加出力」する設計で、既存の投稿データ・タクソノミー・ユーザー情報には一切触りません。既知の互換性上の注意点は以下のとおりです。
| 対象 | 互換性上の挙動 |
|---|---|
| Yoast SEO / Rank Math / SEO SIMPLE PACK など SEO プラグイン | Custom モードは、これら SEO プラグインが <head> に出す Article / WebPage スキーマの @id と突合するために設計されています。Standard モードは独立ノードを追加するだけなので、他プラグインの JSON-LD と重複はしますが衝突はしません。 |
| キャッシュプラグイン (WP Rocket, W3 Total Cache 等) | フロントへの出力は静的 HTML + CSS と JSON-LD のみで、既存ページデータを書き換えないため衝突リスクは小さい設計です。ただし各キャッシュ・CSS 最適化・minify・遅延読み込み・AMP 変換との相性は各プラグイン側の設定に依存するため、導入時にソース確認(panel-style.css が読み込まれているか、<head> 内の Custom モード JSON-LD が除外・圧縮されていないか)を推奨します。 |
| AMP プラグイン | AMP の専用 <head> を別途構築する実装では、本プラグインの wp_head 出力が AMP 側で拾われるかはプラグインの動作次第です。本プラグインは AMP 対応を明示的にはチェックしていません。 |
| Gutenberg エディタ / Classic Editor | Gutenberg ブロックとショートコードの両方を提供するため、Classic Editor 環境でもショートコード [author_panel] でフル機能を利用できます。 |
| 他のカスタム投稿タイプ | ブロック/ショートコードは投稿タイプを問わず使えます。ただし「使用中の記事」逆引き機能は wp_posts から検出するため、カスタムテーブルにコンテンツを保存する投稿タイプは検出対象外です。 |
| マルチサイト | テーブルはサイトごとの $wpdb->prefix(例: wp_2_apm_persons)で作成され、サイト間でデータは独立します。Network 一括管理機能は提供していません。 |
技術仕様: パフォーマンス計測の観点
本プラグインの性能影響を確認する際は、以下の観点で計測してください。
フロントエンド CSS の読み込み: ブラウザ DevTools の Network タブで panel-style.css(約 4.5KB)が読み込まれていることを確認します。パネルを挿入していないページでは読み込まれないことも確認してください。
JSON-LD 出力サイズ: 「ページのソースを表示」で application/ld+json を検索し、Standard / Custom の JSON-LD サイズを確認します。エンティティ数が多い(数十件)場合でも通常は数 KB に収まります。
DB クエリ数: Query Monitor プラグインで、パネル 1 つの表示に何クエリ発生するかを確認します。fetch_entities() はエンティティごとに SELECT を発行するため、同じページで多数のエンティティを表示する場合はクエリ数が線形に増加します。
Core Web Vitals 実測: PageSpeed Insights や Search Console の Core Web Vitals レポートで、パネル挿入前後の LCP / FID / CLS / INP を比較計測できます。本プラグインはフロント JS を使わないため、通常は INP / FID への影響は観測されません。
Custom モードで他プラグインの @id と紐付けた場合、Google リッチリザルトテストや Schema Markup Validator で、Article ノードと Person / Corporation / Organization ノードが正しく解決されているかを確認してください。
動作要件と対応環境
| 項目 | 要件 |
|---|---|
| WordPress | 6.0 以上(parse_blocks()、register_block_type() が安定版である必要) |
| PHP | 8.0 以上(コード内で match 式、int|false Union 戻り値型を使用) |
| 対応ブラウザ | Chrome / Firefox / Safari / Edge の各最新版 |
| 管理画面権限 | manage_options(通常は管理者ロール) |
| ブロックエディタからの REST 参照権限 | edit_posts(投稿者以上) |
| 必須 WP 標準機能 | wp_enqueue_media()(メディアライブラリ連携)、dashicons(sameAs アイコン)、parse_blocks()(Custom モード検出) |