配信側で公開リンクの一覧をRSSにし、表示側で取得する方法です。配信と表示は別のサイトでも、同じ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を使った場合は対象のスニペットを無効化し、ほかのスニペットはそのまま残します。

更新・失敗・戻し方
fetch_feedにはキャッシュがあり、変更が即座に表示されるとは限りません。標準のキャッシュ期間は12時間です。XMLの直接表示と、表示側のキャッシュを分けて調べてください。取得エラーや有効な項目がない場合、この例は空文字を返します。必ず表示すべき重要リンクは固定の導線も用意します。
XMLにPHP警告やHTMLが混ざっていないか、&を含むタイトルやURLが壊れないか、リンク先が正しいかを確認します。表示は最大10件、http/httpsのリンクに限定します。戻す場合は設置したショートコードと今回の関数・フックを外し、必要に応じてパーマリンク設定を再保存します。既存の別フィードは削除しません。
参照:add_feed、fetch_feed。実サイト間の取得とキャッシュ期限経過後の更新は、設置先ごとの確認が必要です。



