Kashiwazaki SEO Link Card
URLを記述するだけで、ページの情報を取得してカード形式で表示するWordPressプラグインです。OGPデータの自動取得、内部リンク最適化、クリックトラッキング、カスタマイズ可能なデザインなど、豊富な機能を搭載しています。
主要機能
1. 自動OGPデータ取得
- 外部サイトからOGP(Open Graph Protocol)データを自動取得
- タイトル、ディスクリプション、サムネイル画像を美しいカードで表示
- OGP画像がない場合の高度なフォールバック機能
- Twitter Card、meta タグ、favicon の自動検索
- ヘッダー・ロゴエリアの画像を優先的に取得
- 本文画像をサイズで判定して最適なものを選択
2. 内部リンク最適化
- WordPressデータベースから直接データ取得(高速・正確)
- SEOプラグイン対応(Yoast SEO、All in One SEO)
- アイキャッチ画像の自動取得
- カスタム抜粋・自動生成抜粋の対応
3. インテリジェントキャッシュシステム
- 外部リンク・内部リンクで異なるキャッシュ期間
- 外部リンク:デフォルト 6時間
- 内部リンク:デフォルト 72時間
- 管理画面からキャッシュ期間のカスタマイズ可能
- ワンクリックでキャッシュクリア機能
4. クリックトラッキング&アナリティクス
- JavaScriptによる非侵襲的なクリック追跡
- データベースへのクリックログ保存
- 管理画面でのアナリティクス表示
- リンクごとのクリック数
- ページごとの集計
- 期間絞り込み機能
5. 柔軟なデザインカスタマイズ
カラーテーマ
- 8種類のプリセットテーマ:赤、青、緑、紫、オレンジ、灰色、白、黒
- カスタムカラー機能:カラーピッカーで自由に色を設定
- 外部リンク・内部リンクで個別設定可能
サムネイル設定
- 表示/非表示の切り替え
- 位置設定(左/右)
- サイズのカスタマイズ(幅・高さ)
- 外部リンク・内部リンクで個別設定可能
バッジ機能
- 「外部リンク」「内部リンク」バッジの自動表示
- 表示/非表示の切り替え可能
- サムネイル上への配置で視認性向上
6. SEO対策
<blockquote cite="URL">タグで引用を明示- 適切なセマンティックHTML構造
- target="_blank" には自動的に rel="noopener" を追加
- サムネイル画像に
loading="lazy"・decoding="async"と、設定サイズに合わせたwidth/height属性を付与(レイアウトシフト抑制)
7. 転送先への自動追随
- リンク先が恒久的に移転(301 / 308)していたら、リダイレクト後の最終 URL をカードのリンク先(
hrefとcite)に使用 - 302 / 307 などの一時的な転送(アフィリエイトの計測 URL・短縮 URL・同意画面・地域振り分けなど)には追随せず、元の URL のまま(経路に 1 つでも一時的な転送があれば追随しない)
- 計測用の URL・短縮 URL・扉ページのように、301 / 308 で飛ばされても書いた URL のまま使いたいリンク先は、管理画面「リンク先の扱い」の「切り替えないリンク先」に 1 行に 1 つ(ドメインか URL の前方一致)書くと、追随しない。誤りのある行があれば欄ごと保存しない。カードにも
[linktext]にも効く - 転送後の URL に
#fragmentが無ければ、ショートコードの URL の#見出しを引き継ぐ(ブラウザの転送処理と同じ扱い。RFC 9110 §10.2.2) - 内部リンクは
get_permalink()の正規 URL に正規化(末尾スラッシュ抜け、http/https の揺れ、旧スラッグ)。#見出しと?パラメータはそのまま保ち、/page/2/などパスが投稿のパーマリンクと異なる URL は変更しない - 最終 URL は OGP 取得時に取得し、キャッシュに一緒に保存(追加のリクエストは発生しない)
- 追随は最大 5 回。超過やループは打ち切って簡易カードで表示
- ショートコードに書いた URL は変更しない(出力時にだけ差し替え)。管理画面で ON/OFF 可能(既定 ON)
8. リンク切れの検知
- OGP 取得時に 404 / 410 / サーバーエラー / 接続失敗を記録。
post_id指定の投稿が削除されていた場合も記録 - WP-Cron による定期チェック(既定 1 日 1 回、1〜720 時間で設定可能)。公開済み投稿の本文からリンクカードの URL を集めて確認
- 管理画面「リンク切れ一覧」で URL・掲載ページ・ステータス・最終確認日時を確認。「今すぐチェック」「一覧をクリア」も可能
post_id指定のカードは公開状態にかかわらず?p=ID形式で一覧に載る(表示時の記録と定期チェックの記録が同じキーになる)- 復旧したリンクと本文から消したカードの記録は、定期チェックが全件を確認し終えたときに一覧から外れる(外した件数は「前回の完了」に表示)
- 401 / 403 / 429(ボット対策で返ることが多い)は記録しない
- 同作者の Kashiwazaki SEO Link Doctor(ページ内の全リンクを手動で検査)とは役割が異なるため併用可能。Link Doctor が有効な場合は一覧画面で案内を表示
9. rel の自動付与(リンク先ごと)
- 管理画面に 1 行ずつ「リンク先 値」を書くと、当たるリンク(カード・
[linktext]・ブロックエディターの「SEO文字リンク」)にrelを自動付与amazon.co.jp sponsored px.a8.net sponsored nofollow https://example.com/forum/ ugc example.com nofollow - リンク先は 2 通り
- ドメイン(例:
example.com): サブドメインにも一致。www.の有無は問わない - URL の前方一致(
/か?を含む行):http/httpsとwww.の有無は同一視、ドメインは完全一致、パス以降は文字どおりの前方一致
- ドメイン(例:
- リンク先と値は空白で区切る(全角スペースでも可)。値は
sponsored・nofollow・ugcとその組み合わせ(スペースかカンマ区切り)だけ。それ以外・読めないリンク先・同じリンク先の重複が 1 行でもあれば保存せず、誤りの行を表示(前の設定のまま) - 優先: 手で書いた
rel(ショートコード・リンク)→ URL の前方一致(ドメインとパスを合わせた長さが長い行ほど優先)→ ドメイン(細かいドメインほど優先)→ 付けない - 転送先への自動追随で URL が変わったカードは、元の URL と転送後の URL の両方で照らして、いちばん細かい行を使う(同じ細かさなら元の URL の行)
target="_blank"のときのnoopenerは従来どおり別に付ける- 旧設定(ドメイン一覧 + 1 つの値)は更新時に「ドメイン 値」の行へ自動で移す(付く rel は変わらない)
- 根拠: Google の「発リンクの修飾」(広告・有料リンクは
sponsored、ユーザー作成コンテンツはugc、それ以外で関連付けたくない場合はnofollow。複数の値はスペースかカンマで組み合わせられる)
10. 開発者向け機能
REST API
- カスタムエンドポイント
/kslc/v1/all-posts、/kslc/v1/post/{id}、/kslc/v1/search-by-url、/kslc/v1/post-types(いずれもedit_posts権限が必要) - 投稿タイプフィルター、検索機能
- エディタ統合用のデータ取得
ブロックパターン
- Gutenbergブロックパターンの登録
- ブロックエディタでの簡単挿入
インストール
手動インストール
- このリポジトリをダウンロード
git clone https://github.com/TsuyoshiKashiwazaki/wp-plugin-kashiwazaki-seo-link-card.git- WordPressの
/wp-content/plugins/ディレクトリにアップロード
cd wp-content/plugins/
mv /path/to/wp-plugin-kashiwazaki-seo-link-card kashiwazaki-seo-link-card-
WordPress管理画面のプラグインメニューから有効化
-
設定メニュー「Kashiwazaki SEO Link Card」から設定を調整
使い方
基本的なショートコード
外部リンク
[linkcard url="https://example.com"]
内部リンク(投稿ID指定)
[linkcard post_id="123"]
カスタムタイトル
[linkcard url="https://example.com" title="カスタムタイトル"]
target と rel 属性のカスタマイズ
[linkcard url="https://example.com" target="_blank" rel="nofollow"]
利用可能なショートコード
[linkcard]- 推奨[kashiwazaki_seo_link_card]- 正式名[nlink]- 短縮版
文中の文字リンク([linktext])
カードではなく、文章の途中に普通の文字リンクを置くときに使います。出力は段落を壊さないインラインの <a> だけです(div・blockquote は出しません)。転送先への自動追随・rel の自動付与・リンク切れの検知・クリック計測はカードと同じ処理を通ります。
詳しい手順は[linktext url="https://example.com/guide/" text="公式ガイド"]をご覧ください。
出力例:
<p>詳しい手順は<a href="https://example.com/guide/" target="_blank" rel="noopener" class="kslc-text-link kslc-text-link-external">公式ガイド</a>をご覧ください。</p>- 閉じタグ(
[/linktext])は使いません。念のため閉じタグ付きで書かれても壊れないようにしてあり、中身があればtextの代わりにリンク文字として使います。閉じタグなしの[linktext]と閉じタグ付きが同じ記事に混ざっても、文章が消えたり別のリンクに吸い込まれたりしません textを省くと、リンク文字はリンク先のタイトル(外部は OGP のタイトル、内部は記事タイトル)- 正式名は
[kashiwazaki_seo_link_text] - ブロックエディターでは、段落などのツールバーの ▼ にある「SEO文字リンク」から、選んだ文字を文字リンクにできます(カードのブロック「SEOリンクカード」とは別)。本文には目印付きの普通のリンク
<a class="kslc-textlink" href="…">として保存され、エディター上でもリンクとして見えます。リンクの中をクリックするとリンク先を示す小窓が開き、「編集」で URL と新しいタブを変えたり、「リンク解除」で外したりできます。表示時に転送先への自動追随・rel の自動付与・クリック計測のクラスが加わり、リンク切れの定期チェックの対象にもなります。プラグインを止めても普通のリンクとして残ります - リンク先が決まらない(削除済みの投稿・不正な URL)ときはリンクを外して文字だけを残します
| 属性 | 説明 | デフォルト | 例 |
|---|---|---|---|
url |
リンク先URL | - | url="https://example.com" |
post_id |
投稿ID(内部リンク用) | 0 | post_id="123" |
text |
リンク文字 | リンク先のタイトル | text="詳細はこちら" |
target |
リンクターゲット | 外部:_blank内部:なし |
target="_blank" |
rel |
rel属性 | 外部:noopener |
rel="nofollow" |
ショートコード属性
| 属性 | 説明 | デフォルト | 例 |
|---|---|---|---|
url |
リンク先URL(外部リンク用) | - | url="https://example.com" |
post_id |
投稿ID(内部リンク用) | 0 | post_id="123" |
title |
カスタムタイトル | OGPから取得 | title="記事タイトル" |
target |
リンクターゲット | 外部:_blank内部:なし |
target="_blank" |
rel |
rel属性 | 外部:noopener |
rel="nofollow" |
管理画面での設定
WordPress 管理画面のメニュー「Kashiwazaki SEO Link Card」を開くと、1 つの画面内でタブ(デザイン/キャッシュ/リンク先の扱い/リンク切れ一覧/リンク統計/使い方)を切り替えて設定します。サブメニューはありません。
デザイン
外部リンクのカードと内部リンクのカードを左右に並べて設定します。
外部リンクのカード / 内部リンクのカード(それぞれ)
- カラーテーマ:8種類のプリセット + カスタムカラー
- サムネイル画像:表示する / しない
- 画像の位置:左 or 右
- 外部リンクバッジ / 内部リンクバッジ:表示する / しない
サムネイルの大きさ(共通)
- 幅:デフォルト 200px
- 高さ:デフォルト 140px
キャッシュ
- キャッシュの保持期間:外部リンク(デフォルト 6時間)・内部リンク(デフォルト 72時間)・共通(予備、上の 2 つが未設定のときに使う値)
- キャッシュのクリア:ワンクリックで全キャッシュをクリア
リンク先の扱い
- 転送先への自動追随:ON/OFF(既定 ON)。移転したリンク先はリダイレクト後の最終 URL、内部リンクは正規パーマリンクを使用
- rel の自動付与(リンク先ごと):1 行に「リンク先 値」。リンク先はドメインか URL の前方一致、値は
sponsored/nofollow/ugcの組み合わせ(詳しくは「9. rel の自動付与」)
リンク切れの検知
- 定期チェック:ON/OFF(既定 ON)。WP-Cron でリンクカードのリンク先を確認
- チェック間隔:時間単位(既定 24 時間、1〜720 時間)。次回の実行予定を表示
リンク切れ一覧
「リンク切れ一覧」タブで以下を確認できます:
- リンク先 URL、掲載ページ(編集リンク付き)、ステータス(404 / 410 / 5xx / 接続失敗)、最終確認日時
- 「今すぐチェック」(20 秒の時間予算で確認し、残りはバックグラウンドで継続)
- 「一覧をクリア」
アナリティクス
「リンク統計」タブから以下の情報を確認できます:
- 掲載ページごとの集計(ページ名から詳細へ移れます)
- ページ内のリンク 1 つずつのクリック数(位置 = 上から何番目か、種類 = カード / 文字リンク、リンク文字、リンク先 URL)。同じリンク先へのカードと文字リンクも分けて数えます
- クリック日時の詳細ログ
- 期間フィルタリング
技術仕様
動作環境
- WordPress: 5.5以上(ブロックパターン機能を使用)
- PHP: 7.0以上(推奨)、5.4以上で動作可能
技術的詳細
- PHP 5.4以上で動作(短配列構文使用)
- セキュリティサポートのためPHP 7.0以上を推奨
- WordPress 5.5のブロックパターンAPI使用
- REST API対応
使用技術
- フロントエンド:jQuery、Vanilla JavaScript
- バックエンド:PHP、WordPress API
- データベース:カスタムテーブル(
wp_kslc_analytics) - キャッシュ:WordPress Transients API
- HTTP:WordPress HTTP API
データベーステーブル
プラグイン有効化時に自動作成されます:
wp_kslc_analytics
├── id (bigint) - 主キー
├── url (varchar) - リンク先URL
├── page_url (varchar) - 掲載ページURL
├── ip_address (varchar) - アクセス元IP
├── user_agent (text) - ユーザーエージェント
├── title (varchar) - リンクタイトル(カードはタイトル、文字リンクはリンク文字)
├── link_type (varchar) - 種類(card / text、記録前のクリックは空)
├── link_pos (smallint) - ページ内の位置(上から何番目か、記録前のクリックは 0)
└── clicked_at (datetime) - クリック日時プラグインを更新したときは、表の版(kslc_db_version)を見て足りない列を自動で追加します(既存の記録は残ります)。
カスタマイズ
定数によるカスタマイズ
wp-config.php または テーマの functions.php で以下の定数を定義できます:
// 外部サイト取得時の User-Agent(プラグイン読み込み前に定義した場合のみ有効)
define('KSLC_USER_AGENT', 'Mozilla/5.0 (compatible; MySite/1.0)');このほか includes/config.php で以下の定数を定義しています(値を変える場合はプラグイン側を編集):
| 定数 | 既定値 | 意味 |
|---|---|---|
KSLC_MAX_REDIRECTS |
5 | リダイレクト追随の上限回数 |
KSLC_FAILURE_CACHE_SECONDS |
3600 | 取得失敗を記憶して再取得しない秒数 |
KSLC_BROKEN_LINKS_MAX |
500 | リンク切れ一覧の最大保持件数 |
KSLC_LINK_CHECK_TIME_BUDGET |
20 | 定期チェック 1 回の実行時間の目安(秒) |
KSLC_LINK_CHECK_TIMEOUT |
8 | 定期チェックの HTTP タイムアウト(秒) |
KSLC_DEFAULT_LINK_CHECK_INTERVAL |
24 | 定期チェックの既定間隔(時間) |
フィルターフック
今後のバージョンでカスタムフィルターフックを追加予定です。
トラブルシューティング
キャッシュが更新されない
管理画面の「キャッシュをクリア」ボタンをクリックしてください。
画像が表示されない
- 外部サイトのOGP設定を確認
- サムネイル表示設定がオンになっているか確認
- ファイアウォールがOGP画像URLをブロックしていないか確認
クリック統計が記録されない
- JavaScriptが有効になっているか確認
- AJAX URLが正しく設定されているか確認(ブラウザのコンソールでエラーを確認)
- データベーステーブルが作成されているか確認
プラグインを再有効化
プラグインを一度無効化し、再度有効化することでデータベーステーブルが再作成されます。
セキュリティ
- WordPress Nonce によるCSRF対策
- サニタイゼーション・エスケープ処理の徹底
- SQLインジェクション対策(prepared statements使用)
- XSS対策(
esc_html,esc_url,esc_attrの使用)
パフォーマンス
- トランジェントAPIによる効率的なキャッシュ
- 内部リンクはデータベース直接取得(HTTP不要)
- 外部リンクはタイムアウト設定(10秒)
- 画像検索は最初の10個のみスキャン(過負荷防止)
ライセンス
GPL-2.0 or later
このプラグインはフリーソフトウェアです。GNU General Public License v2以降の条件の下で再配布および変更が可能です。
作者
柏崎剛 (Tsuyoshi Kashiwazaki)
- Website: https://www.tsuyoshikashiwazaki.jp
- Profile: https://www.tsuyoshikashiwazaki.jp/profile/
- Email: [email protected]
サポート
バグ報告や機能リクエストは、GitHubのIssuesページでお願いします。
https://github.com/TsuyoshiKashiwazaki/wp-plugin-kashiwazaki-seo-link-card/issues
変更履歴
詳細は CHANGELOG.md を参照してください。
貢献
プルリクエストを歓迎します!大きな変更の場合は、まずissueを開いて変更内容を議論してください。
クレジット
このプラグインは WordPress コミュニティの素晴らしいツールとドキュメントに基づいて開発されました。
