wp-plugin-kashiwazaki-seo-link-card

This plugin allows you to display a link in a card format by simply using a shortcode. It fetches the OGP (Open Graph Protocol) data from the specified URL and displays the title, description, and thumbnail image in a clean and modern card.

PHP ★ 0 🕔 0 GNU General Public License v2.0

Kashiwazaki SEO Link Card

WordPress
PHP
License
Version

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ブロックパターンの登録
  • ブロックエディタでの簡単挿入

インストール

手動インストール

  1. このリポジトリをダウンロード
git clone https://github.com/TsuyoshiKashiwazaki/wp-plugin-kashiwazaki-seo-link-card.git
  1. WordPressの /wp-content/plugins/ ディレクトリにアップロード
cd wp-content/plugins/
mv /path/to/wp-plugin-kashiwazaki-seo-link-card kashiwazaki-seo-link-card
  1. WordPress管理画面のプラグインメニューから有効化

  2. 設定メニュー「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 定期チェックの既定間隔(時間)

フィルターフック

今後のバージョンでカスタムフィルターフックを追加予定です。

トラブルシューティング

キャッシュが更新されない

管理画面の「キャッシュをクリア」ボタンをクリックしてください。

画像が表示されない

  1. 外部サイトのOGP設定を確認
  2. サムネイル表示設定がオンになっているか確認
  3. ファイアウォールがOGP画像URLをブロックしていないか確認

クリック統計が記録されない

  1. JavaScriptが有効になっているか確認
  2. AJAX URLが正しく設定されているか確認(ブラウザのコンソールでエラーを確認)
  3. データベーステーブルが作成されているか確認

プラグインを再有効化

プラグインを一度無効化し、再度有効化することでデータベーステーブルが再作成されます。

セキュリティ

  • 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)

サポート

バグ報告や機能リクエストは、GitHubのIssuesページでお願いします。

https://github.com/TsuyoshiKashiwazaki/wp-plugin-kashiwazaki-seo-link-card/issues

変更履歴

詳細は CHANGELOG.md を参照してください。

貢献

プルリクエストを歓迎します!大きな変更の場合は、まずissueを開いて変更内容を議論してください。

クレジット

このプラグインは WordPress コミュニティの素晴らしいツールとドキュメントに基づいて開発されました。