Amazonで商品を見る セール会場へ

WordPress│情報をRSS化して別サイトでも動的に参照する方法

配信側で公開リンクの一覧をRSSにし、表示側で取得する方法です。配信と表示は別のサイトでも、同じWordPressでも構いません。機密情報を配信しないでください。

目次

著者

WEB制作をしているデジタルノマド
WordPressのカスタマイズが好きで、色々と自作しています。

WordPressのカスタマイズに困ったらご相談ください!

配信側:RSSを返す

配信するWordPressの子テーマfunctions.phpまたはPHPスニペットのどちらか一方へ追加します。既存PHP内では開始タグを追加しません。linksのタイトルとURLを自分の公開情報に置き換えます。同じURLは重複登録しないでください。

function waza_related_feed_xml($links) {
    $xml = static function($value) {
        return htmlspecialchars($value, ENT_QUOTES | ENT_XML1, 'UTF-8');
    };
    $out = '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
    $out .= '<rss version="2.0"><channel><title>関連リンク</title><link>';
    $out .= $xml(home_url('/')) . '</link><description>関連ページの一覧</description>';
    foreach ($links as $link) {
        $url = esc_url_raw($link['url'] ?? '', array('http', 'https'));
        $title = wp_strip_all_tags($link['title'] ?? '');
        if (!$url || !$title || !in_array(wp_parse_url($url, PHP_URL_SCHEME), array('http', 'https'), true)) { continue; }
        $out .= '<item><title>' . $xml($title) . '</title><link>' . $xml($url);
        $out .= '</link><guid isPermaLink="true">' . $xml($url) . '</guid></item>';
    }
    return $out . '</channel></rss>';
}
function waza_output_related_feed() {
    $links = array(
        array('title' => '記事一覧', 'url' => home_url('/')),
        // ここへ自分のサイト名・公開URLを追加。
    );
    header('Content-Type: application/rss+xml; charset=UTF-8');
    echo waza_related_feed_xml($links);
    exit; // wp_die()のエラー画面をXMLの後ろへ付けない。
}
add_action('init', function() {
    add_feed('waza-related-links', 'waza_output_related_feed');
});

まず https://自分のサイト/?feed=waza-related-links で確認します。WordPressがサブディレクトリにある場合は、そのパスを含めます。きれいな /feed/waza-related-links/ 形式を使う場合は導入時にパーマリンク設定を保存してルールを再生成し、毎アクセスのflushは追加しません。

表示側:取得してリストにする

表示する側へ次を追加し、feed_urlを実際の配信URLに変更します。記事のショートコードブロックへ [waza_related_links] を入れます。フィードURLを訪問者の入力から受け取る実装ではありません。

function waza_related_items_html($items) {
    $rows = '';
    foreach (array_slice($items, 0, 10) as $item) {
        $url = esc_url($item->get_link(), array('http', 'https'));
        $title = trim(wp_strip_all_tags($item->get_title()));
        if (!$url || !$title || !in_array(wp_parse_url($url, PHP_URL_SCHEME), array('http', 'https'), true)) { continue; }
        $rows .= '<li><a href="' . $url . '">' . esc_html($title) . '</a></li>';
    }
    return $rows ? '<ul class="waza-related-links">' . $rows . '</ul>' : '';
}
function waza_related_links_shortcode() {
    require_once ABSPATH . WPINC . '/feed.php';
    // 運営者が管理する実際の公開フィードURLへ変更。
    $feed_url = 'https://example.com/?feed=waza-related-links';
    $feed = fetch_feed($feed_url);
    if (is_wp_error($feed)) { return ''; }
    return waza_related_items_html($feed->get_items(0, 10));
}
add_shortcode('waza_related_links', 'waza_related_links_shortcode');

RSSの応答から表示リンクまで確認する

確認する場所確認内容
配信URL?feed=waza-related-linksを開き、RSSのXMLが返る
取得側fetch_feedの取得先を配信URLへ置き換える
表示ページタイトルとリンク先を確認し、リンクをキーボードで開く

配信側のPHPを保存したら、配信URLを直接開いてXMLのitemが出力されることを先に確認します。

通常の記事ページやログイン画面のHTMLが返る場合は、表示側のPHPを調べる前に配信側のURLとコードの有効範囲を見直します。

表示側のコードにあるexample.comのURLは例示なので、作成したRSSの配信URLに置き換えます。

WordPress 7.1.2 / SWELL 2.19.0の隔離環境でRSSをHTTP取得し、2件のリンクを表示できることを確認しました。

配信URLの応答は200で、Content-Typeはapplication/rss+xml、XMLの末尾に通常ページのHTMLが混ざっていませんでした。

検証ではタイトルに含めた「&」が画面上でも「&」になり、リンク先の2つのクエリ引数も維持されました。

リンクをEnterで開き、指定した記事へ到達することまで確認しています。

この結果は同じ隔離環境の配信URLと取得処理によるもので、別サーバー間の認証や通信制限までは検証していません。

fetch_feedの標準キャッシュは12時間なので、配信元を更新しても取得側にすぐ反映されない場合があります。

WP Rocketのページキャッシュを消す操作と、fetch_feedが保存するフィードのキャッシュは別に切り分けます。

まず配信URLのXMLが新しいかを確認し、その後に取得側と表示ページを確認してください。

戻すときは設置したショートコードを外し、今回追加した配信・取得用コードだけを変更前のバックアップへ戻します。

Code Snippetsを使った場合は対象のスニペットを無効化し、ほかのスニペットはそのまま残します。

RSSをHTTP取得して2件の関連リンクを表示した実画面
RSSをHTTP取得して2件の関連リンクを表示した実画面。2026年10月3日、隔離したWordPress 7.1.2 / SWELL 2.19.0で撮影。

更新・失敗・戻し方

fetch_feedにはキャッシュがあり、変更が即座に表示されるとは限りません。標準のキャッシュ期間は12時間です。XMLの直接表示と、表示側のキャッシュを分けて調べてください。取得エラーや有効な項目がない場合、この例は空文字を返します。必ず表示すべき重要リンクは固定の導線も用意します。

XMLにPHP警告やHTMLが混ざっていないか、&を含むタイトルやURLが壊れないか、リンク先が正しいかを確認します。表示は最大10件、http/httpsのリンクに限定します。戻す場合は設置したショートコードと今回の関数・フックを外し、必要に応じてパーマリンク設定を再保存します。既存の別フィードは削除しません。

参照:add_feed、fetch_feed。実サイト間の取得とキャッシュ期限経過後の更新は、設置先ごとの確認が必要です。

  • URLをコピーしました!

実装を任せたい方へ

WordPressのカスタマイズ代行

ブロックの追加、テーマの改修、管理画面の調整など、記事で紹介している内容の実装を承ります。1時間 ¥8,000〜(税込)。

WAZAの有料記事のサブスクリプションも開始しました。

サービス

Service

WordPressサイトのカスタマイズのサービスに関心がありましたら、ぜひ詳細をご覧ください。

目次