ノラWEB屋 野良人(のらんど)- 個人営業のWEB屋さん

【WordPress】アメブロの新着情報を取得する…PR記事の非表示とキャッシュの変更

2016年5月31日

アメブロのRSSをWordPressサイトに表示します。

アメブロ最新記事を取得して表示

こちらの記事で紹介した制作事例のアメブロ情報取得部分のサンプルです。

「[PR]記事を表示させない」「更新を随時反映させる(キャッシュの制御)」の2点がポイント。

  1. [PR]記事を表示させない
  2. アメブロの更新がすぐに反映しない→キャッシュの時間を変更
  3. サンプルコード

[PR]記事を表示させない

普通に取得する分には、コーデックのサンプル通りで問題ないと思うのですが、アメブロの場合はそのままだとPR記事が表示されてしまいます。

関数リファレンス/fetch feed – WordPress Codex 日本語版

そこで以下の記事を参考にさせて頂きました。

▼参考

WordPressにアメブロの新着記事のRSSを取得して表示、さらにPR記事を除外(2013年版)[WordPress使えそうなスニペットシリーズ]:マイペースクリエイターの覚え書き

基本的にここに書いてあるまんまで実装しました。手を加えたのはループの内容をデザインに合わせて変更してあるのと、後述のキャッシュの変更部分を追加したのみ。

アメブロの更新がすぐに反映しない→キャッシュの時間を変更

「間違って投稿した記事をすぐに消したが、反映されない(誤投稿した記事が表示されたまま)」という問題が発生したので調べたところ、rssの取得に使っているfetch_feedはデフォルトで12時間キャッシュする仕様になっていたことが原因でした。

fetch_feed キャッシュは、デフォルトでは12時間です。 wp_feed_cache_transient_lifetime /enフィルタを介して、時間間隔を変更することによって、これを変更することができます。

by関数リファレンス/fetch feed – WordPress Codex 日本語版

こちらは以下の記事に倣って解決しました。

▼参考

WordPressに入ってる仕組みを使ってよそのサイトのRSSを取得してテーマ内で表示のメモ ? Shinichi Nishikawa’s

時間の設定は秒単位です。制作事例のサイトでは600秒(10分)に設定しました。

なお、設置場所については以下の記事にあるようにfetch_feedの前に置くのが正解のようです。

▼参考

RSS(フィード)を取得し、ショートコードで記事内に挿入する。:【81日目】WordPress1日1プラグイン | Alpac@labo:大分県臼杵市でホームページ運営やWordPressやってます。

※「キャッシュの時間を変更する」の箇所参照

サンプルコード

上記を踏まえて、できたのがこちら。

PHP
<?php
	//以下3行の項目を任意に変更
	$display_posts_count = 5; //実際に表示したい記事件数
	$get_posts_count = 10; //取得する記事件数(PR記事を含むので$display_posts_countより少し多めに設定)

	function return_cache(){return 600;}// キャッシュの時間を設定
	add_filter (  'wp_feed_cache_transient_lifetime' , 'return_cache' );// キャッシュの時間を変更
	$feed = fetch_feed('http://feedblog.ameba.jp/rss/ameblo/kimura-ryota/rss20.xml'); //取得したいRSS
	remove_filter( 'wp_feed_cache_transient_lifetime' , 'return_cache' );// キャッシュの時間をデフォルトに戻す
	 
	//以下は必要なければ変更しなくてOK
	$counter = 0; //ループ回数カウンター
	include_once(ABSPATH . WPINC . '/feed.php');
	if (!is_wp_error( $feed ) ) : //エラーがなければ
	$maxitems = $feed->get_item_quantity($get_posts_count); //取得件数
	$feed_items = $feed->get_items(0, $maxitems); //指定件数分の配列作成
	endif;
?>
<ul id="blogentry">
<?php
	if ( $feed_items == 0 )  echo '<li>新しい記事はないようです</li>';
		else foreach ( $feed_items as $item ) :
			if( !preg_match('/^PR:/', $item->get_title() ) && $counter < $display_posts_count ): //PR記事の除外 && 表示件数が設定件数を超えないかチェック
?>

<li><span><?php echo $item->get_date('Y.m.d'); ?></span><a href="<?php echo $item->get_permalink(); ?>" target="_blank"> <?php echo $item->get_title(); ?></a></li>

<?php $counter++;
      endif;
      endforeach; ?>
</ul> 

ほぼまんまですね。

悩んだ時には、基本はコーデックを調べるべきなんですが、そういう時って、そもそもどの関数で当たればいいのか知りたかったり、コーデックの範囲以上の応用編で手こずったりしてることがほとんどなので、やはり参照元に挙げたようなブログたちは助かります。ありがとうございます。

目の前の問題の解決策が1か所に固まってるとは限らないので、あちこちの見識を巡り歩いて集めた解決策をまとめて、類似の問題で困ってる人の参考になれば、何らかの形でお世話になった分の還元ができているのかなという気持ちでブログにしています。

あと、仕事につながったらいいなーという下心もほんのちょびっとあります。8割くらい。お問い合わせはこちらですよ~!

このエントリーをはてなブックマークに追加