WPをCMS利用している時に、店舗紹介ページから外部の店舗ブログのRSSを表示したい時とか、ありません?
ないですか?そうですか。
まぁ普通はWordPressにブログ用カテとか作っちゃいますよねw
でも、既に運用中のブログがあるとか、構造が複雑になってきてるからブログは分けたいとか、ブログは他のスタッフも更新するけどWPは担当者以外触らせたくないとか、いろんな理由で外部のブログを利用したい時ってあると思うんですよね。
ないですか?そうですか…(2回目)
そんなときにRSSを表示する方法として、自力でRSSパーサを作ったり、ライブラリを使う方法やGoogle Feed APIを使う方法なんかが思いつくと思うのですが、実はWordPressでは標準でSimplePieというRSSパーサを利用することができるそうです。(2.8移行)
なので今回はそれを使ってRSSをとってみたいと思います。
前提として、カスタムフィールドでRSSフィードのURLとブログURL、取得最大数なんかを登録できるようにしてあることとします。
また、カスタムフィールドの値はそれぞれ、
フィードURL:shop_blog_feed_url
最大表示件数:shop_blog_feed_items
として設定し、記事にもセット済みということで話を進めますので、違う場合は適当に読み替えてください。
早速コードですが、表示したいところにこんな風に書きます。
1 2 3 4 5 6 7 8 9 |
<?php $posted_feed = get_post_meta($post->ID, 'shop_blog_feed_url', true); $disp_items = get_post_meta($post->ID, 'shop_blog_feed_items', true); $feed = fetch_feed($posted_feed); if(!is_wp_error($feed)) { $maxitems = $feed->get_item_quantity($disp_items); $feed_items = $feed->get_items(0,$maxitems); } ?> |
これでカスタムフィールドに設定されたRSSフィードから指定した件数読み出せました。
あとは、その下でループを回して出力すればおしまいです。
1 2 3 4 5 6 7 8 9 10 11 |
<dl> <?php // フィードが空の時の処理 if($maxitems == 0) echo '<dt>----/--/--</dt><dd>no items.</dd>'; // ループを回してフィードを表示 foreach ($feed_items as $item) : ?> <dt><?php echo mysql2date('Y/m/d', $item->get_date()); ?></dt> <dd><a href="<?php echo esc_url($item->get_permalink()); ?>"><?php echo $item->get_title(); ?></a></dd> <?php endforeach; ?> </dl> |
めでたしめでたし。
…と思ったのですが。アメブロとかだとRSSフィードの中に広告が入っちゃうんですよね。
「PR:なんたら〜」ってタイトルの記事が増えちゃいます。
まぁ、無料サービスですし、しょうがないのかもしれませんけど、お店のサイトとかで広告が出ちゃうのはあまりよろしくないですよね。
なので、「PR:」から始まる記事を正規表現で探して、華麗にスルーさせるように改造します。
1 2 3 4 5 6 7 8 9 10 11 12 |
<dl class="shopfeed"> <?php // フィードが空の時の処理 if($maxitems == 0) echo '<dt>----/--/--</dt><dd>no items.</dd>'; // ループを回してフィードを表示 foreach ($feed_items as $item) : if (!preg_match('/^PR:/i', $item->get_title())) : ?> <dt><?php echo mysql2date('Y/m/d', $item->get_date()); ?></dt> <dd><a href="<?php echo esc_url($item->get_permalink()); ?>"><?php echo $item->get_title(); ?></a></dd> <?php endforeach; ?> </dl> |
削除するトリガーになる文字列を変える場合は7行目をうまいこと修正してください。
これで「PR:」からスタートする記事は綺麗に見えなくなりました。
ですが、これだと消えちゃった分表示される量が減っちゃいますね。これは困りました。
記事を無視したらその分繰り上げるようにしなくてはなりません。
ということで、まずは本来の取得件数より多めにとってきて、必要な記事を選んで表示し、必要な件数分表示したらそれ以上は出さないようにします。
と、いうことで最終的に出来上がったのがこんなコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<?php // 投稿からフィードURLを取得 $posted_feed = 'http://example.com/rss' // 投稿から表示する最大数を取得 $disp_items = 5 $feed = fetch_feed($posted_feed); if(!is_wp_error($feed)) { $feed->set_item_limit($disp_items); $feed->set_cache_duration(1800); $feed->init(); $maxitems = $feed->get_item_quantity(50); $feed_items = $feed->get_items(0,$maxitems); } // カウンタの初期化 $item_cnt = 0; ?> <dl> <?php // フィードが空の時の処理 if($maxitems == 0) echo '<dt>----/--/--</dt><dd>no items.</dd>'; // ループを回してフィードを表示 foreach ($feed_items as $item) : // 正規表現でPR:から始まる奴を除外。他の文字列にする場合は前後の「^」や「/」まで消さないように注意 if (!preg_match('/^PR:/i', $item->get_title())) : // 表示できた件数を確認するためカウンタを回して… $item_cnt++; // 本来の表示数を超えたらループを抜けて終了(処理前にブレイクさせるのでラスト1回分を足しておく) if($item_cnt >= $disp_items+1) break; ?> <dt><?php echo mysql2date('Y/m/d', $item->get_date()); ?></dt> <dd><a href="<?php echo esc_url($item->get_permalink()); ?>" target="_blank"><?php echo $item->get_title(); ?></a></dd> <?php endif; endforeach; ?> </dl> |
12/13修正
すみません。記事を書いた時点でのコードが間違えていました。
以前のコードだと一応取得はできるのですが、PR記事を消した時などに表示される件数がブレてしまう問題があったため
新しく書き直しました。
今度こそ大丈夫…なはずです。現在設定を入れ替えながらテストしていますが、今のところ正確に取得できているようなので…。
コメントする