WordPressの機能を使って外部サイトのRSSからコンテンツを持ってきて表示する2つの方法

複数のサイトを管理していて、AというサイトにBやCのサイトのコンテンツを表示したいということがありますよね?そうした場合に、AがWordPressであれば、わりと簡単に実現できますのでその方法を書きます。

2つ方法がありまして、2つとも簡単です。

ひとつは、SimplePie というパーサー(Parse≒構文解析)がWordPressのコアに同梱されているので、それを利用する方法です。

もうひとつは、WordPressの内部APIのひとつであるHTTP APIを使う方法です。

このように、WordPressはいろいろな機能を持っており、そうしたことを知っていれば、今までよりも難しいことができたり、同じものを作るのにも、時間を節約したり確実性を上げたりということが可能です。

こうした、WordPressの力を最大限に活かす方法については、『サイトの拡張性を飛躍的に高める WordPressプラグイン開発のバイブル』に詳しく書かれていますので買いましょう!

1. Simple Pieを利用する方法

2行目のfeedurlには、RSSのURLを入れます。
そして、WordPressの関数、fetch_feed()に渡すことで、アイテムを取得してくれますので、ループで表示を行います。

include_once( ABSPATH . WPINC . '/feed.php' );
$feeduri = 'http://example.com/feed/uri/here';

$rss = fetch_feed( $feeduri );

if ( ! is_wp_error( $rss ) ):

	$maxitems = $rss->get_item_quantity( 4 ); // 4件表示
	$rss_items = $rss->get_items( 0, $maxitems );

endif;

if ( !$rss_items ):
	echo '<p><a href="http://example.com/" target="_blank">おもしろブログだよ。読みに来てね&#9825;</a></p>';
else:
	 foreach ( $rss_items as $i ) {
		 ?>
		 <li><a href="<?php echo esc_url( $i->get_permalink() ); ?>"><?php echo esc_html( $i->get_title() ); ?></a></li>
		 <?php
	 }
endif;

この方法を使えば、simplexml_load_file()などの関数を使ってエラーの想定をしたりなどはしなくても大丈夫です。

また、外部サイトへのアクセスと情報の取得は毎回行っていると表示も遅くなりますし、よそのサイトにも迷惑になりますが、この方法であればデフォルトで12時間キャッシュしてくれます。キャッシュの時間の変更は、フックを通して行います(過去に書いています)。

ん?フックってなんだ?という方は、『サイトの拡張性を飛躍的に高める WordPressプラグイン開発のバイブル』に詳しく書かれていますので買いましょう(二度目)!

2. HTTP APIを利用する方法

次の方法です。

WordPressのHTTP APIというのは、外部サイトとの通信を助けてくれるものと理解すれば大丈夫だと思います。

WordPressは色々な環境にインストールされる上に、情報をとりにいく外部のサイトの環境も違います。相手側のサーバーによっては、通信できる方法が限られていたりもします。そうした外部サイトとの通信を行う際に問題になる(面倒くさい)色々な問題を、まるっと任せてしまうことができます。

今回は、一番シンプルだと思われる、wp_remote_get()関数を使ってみたいと思います。基本的には上記とほぼ同じなので、上記の本の共著者である岡本さんのキャッシングも含めたコードを使わせていただきます。

functions.phpなどに以下を書いておきます。

function nskw_transient_remote_get( $url, $expiration = 43200 ) {

	$transient = 'remote_get-' . md5($url);

	if ( ! ($response_body = get_transient($transient)) ) {

		$response = wp_remote_get($url);

		if( !is_wp_error($response) && $response["response"]["code"] === 200 ) {

			$response_body = $response["body"];
			set_transient( $transient, $response_body, $expiration );

		} else {

			$response_body = false;

		}
	}

	return $response_body;

}

そして、結果を表示したいところに、下記を記述します。テーマにガンと書いてしまってもOKだと思います。キャッシングに使われているのは、Transient APIというデータをキャッシングしておいてくれる仕組みです。これも『サイトの拡張性を飛躍的に高める WordPressプラグイン開発のバイブル』に詳しく書かれてい(以下略

$rss_url = "http://example.com/path/to/feed/";

$responce = nskw_transient_remote_get( $rss_url );

if ( $responce ) {

	$res_obj = simplexml_load_string( $responce );
	$bs = $res_obj->channel;

	foreach ( $bs->item as $b ) {
		?>
		<li><a href="<?php echo esc_url( $b->link ); ?>"><?php echo esc_html( $b->title ); ?></a></li>
		<?php
	}

}

いかがでしょうか?とってもシンプルですよね!

両方の方法に出てくる、esc_url() や esc_html というのは、セキュリティに関する関数なのですが、こうしたセキュリティについても、(以下略

↓ プラグインを作る方々への本、書きました。 ↓

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です