「過去記事と効率よくリンクさせたい。」
「リンク漏れを防ぎたいが、作業はなるべくスムーズにしたい。」
「サイト内を検索して関連記事を探すのが手間。」

WordPressでブログやメディアを運営していると、こうした悩みに直面することはありませんか?

そこで今回は、投稿編集画面に内部リンク候補を自動表示するカスタマイズをご紹介します。記事執筆中のリンク漏れを防ぎ、関連記事もリライトしやすくなります。

WordPressテーマ「GLUE」
WordPressテーマ「GLUE」
無料で高機能なWordPressテーマが手に入る。

内部リンク候補を自動表示するカスタマイズ

functions.phpを編集しますので、プラグイン「Code Snippets」を使うのが便利で安心です。コピペで使えるコードを以下に掲載しています。

カスタマイズの仕様・できること

このカスタマイズでできることは、以下のとおりです。

  • 投稿編集画面に「リンク候補を表示」ボタンが追加される
  • ボタンを押すと、タイトル・カテゴリー・タグをもとに候補記事が5件まで表示される
  • 候補記事は公開済みだけでなく下書きや予約投稿も含む

実際の表示は、次のようなイメージです。

リンク候補を表示した例

リンク候補を表示した例

上記のように「リンク候補を表示」ボタンを押すと、関連記事が候補としてリストアップされます。

記事タイトルをクリックすると公開画面が別タブで開き、「編集画面」をクリックするとその記事の編集画面が別タブで開く仕様です。関連記事のリライトや確認がスムーズに行えるようになります。

このカスタマイズは、クラシックエディタ専用で、ブロックエディタには未対応です。

コピペで使えるコードサンプル

下記コードを「Code Snippets」の編集画面にコピペして追加するだけでOKです。

// リンク候補(投稿編集画面に表示)
add_action('edit_form_after_title', function($post){
    if($post->post_type !== 'post') return;

    echo '<div id="related-link-candidates" style="margin:10px 0;">';
    echo '<button type="button" id="show-candidates" class="button">リンク候補を表示</button>';
    echo '<div id="candidate-list" style="margin-top:10px;"></div>';
    echo '</div>';

    $data = [
        'post_id' => $post->ID,
        'title'   => trim($post->post_title),
        'tags'    => wp_get_post_tags($post->ID, ['fields'=>'ids']),
        'cats'    => wp_get_post_categories($post->ID),
        'ajax_url'=> admin_url('admin-ajax.php')
    ];
    echo '<script>var relatedData='.json_encode($data).';</script>';
});

// Ajax処理:候補取得(上位5件固定)
add_action('wp_ajax_get_related_candidates', function(){
    $post_id = intval($_POST['post_id']);
    $title   = trim($_POST['title']);
    $tags    = $_POST['tags'] ?? [];
    $cats    = $_POST['cats'] ?? [];

    $posts = get_posts([
        'post_type'=>'post',
        'post_status'=>['publish','draft','future'],
        'post__not_in'=>[$post_id],
        'posts_per_page'=>-1,
    ]);

    $candidates = [];
    foreach($posts as $p){
        $score = 0;
        if($title && stripos($p->post_title, $title)!==false) $score+=3;
        if($tags) $score+=count(array_intersect($tags, wp_get_post_tags($p->ID,['fields'=>'ids'])))*2;
        if($cats) $score+=count(array_intersect($cats, wp_get_post_categories($p->ID)));
        if($score>0) $candidates[$p->ID]=$score;
    }

    if($candidates){
        arsort($candidates);
        $candidates=array_slice($candidates,0,5,true);

        foreach(array_keys($candidates) as $pid){
            $p = get_post($pid);
            $status = $p->post_status;
            $title_text = esc_html($p->post_title);

            // 公開済みならフロント、下書き/予約なら編集画面
            if($status === 'publish'){
                $front = get_permalink($p->ID);
            } else {
                $front = get_edit_post_link($p->ID,'');
            }

            // ステータス表示
            $label = '';
            if($status === 'draft') $label = '(下書き)';
            if($status === 'future') $label = '(予約投稿)';

            echo '<div style="margin-bottom:6px;">';
            echo '・<a href="'.esc_url($front).'" target="_blank">'.$title_text.'</a> '.$label.' - <a href="'.esc_url(get_edit_post_link($p->ID,'')).'" target="_blank">編集画面</a>';
            echo '</div>';
        }
    } else {
        echo '<p>リンク候補の記事はありません。</p>';
    }

    wp_die();
});

// 管理画面用最小JS
add_action('admin_footer', function(){
?>
<script>
jQuery(function($){
    $('#show-candidates').on('click', function(){
        $.post(relatedData.ajax_url,{
            action:'get_related_candidates',
            post_id:relatedData.post_id,
            title:relatedData.title,
            tags:relatedData.tags,
            cats:relatedData.cats
        }, function(response){
            $('#candidate-list').html(response);
        });
    });
});
</script>
<?php
});

注意点・補足

カスタマイズ導入時の注意点や補足をまとめているので、参考にご覧ください。

権限による表示の違い

下書きや予約投稿の候補は、ユーザーの権限によって表示されないようになっています。

たとえば、投稿の編集権限を持たないユーザーは一部の非公開記事を閲覧できません。

通常どおり、WordPressのユーザー権限別で操作制限があるということです。管理者や編集者など、適切な権限を持つアカウントで確認しましょう。

パフォーマンスへの影響

候補リストは、ボタンを押したときにのみ取得される仕様のため、通常の編集画面の読み込み速度には影響しません。必要なときだけ動作する設計なので安心です。

候補の精度について

5件の候補は、タイトル・タグ・カテゴリをもとにスコア化して抽出される仕組みです。

具体的には以下のとおりです。

  • タイトルが部分一致:3点
  • タグが一致:2点
  • カテゴリーが一致:1点

これらの合計スコアが高い順に、上位5件の記事を表示しています。

仕組み上、関連性が100%正確とは限らないため、最終的なリンク先は実際の内容を確認して判断するのがおすすめです。

まとめ

投稿編集画面に内部リンク候補を自動表示する方法をご紹介しました。

記事執筆中の内部リンクの効率化や、関連記事のリライトにすぐに役立つカスタマイズです。Code Snippets」プラグインを使えば、コピペだけでかんたんに実装できます。

WordPressブログやメディアの内部リンクは、ユーザー体験の向上やSEO効果に直結します。日常的に記事を更新しているなら、ぜひこの方法を試してみてください。

ブログ運営に関する記事

魅力的なブログがつくれる
WordPressテーマ集
WordPressテーマ「PANDORA」
レイアウト自由自在なブログ・メディアを構築。
WordPressテーマ「NULL」
技術や知見をシェアする開発者ブログを構築。
WordPressテーマ「Muum」
デザイン・SEOともに最高峰のブログに。
WordPressテーマ「Cherie」
華やかなブログで集客できるテンプレート。