blog

BLOGブログ

ARCHIVES

vax

【wordpress】RSS feedから記事データ、サムネイルを取得するず

20160712

 

 

全国2000万1612人のファンのみなさま。

お疲れさまです。VAXだず。
広島帰ってきたけど全然つけ麺を食べにいけれてないず(>_<)

 

だんだんと熱くなってきて若者たちは、やれ夏休みだ、花火だと夏を楽しむ時期がやってきました。

いいですね。

 

 





 

そんなことは全く関係ないですが

 

以前書いた

簡単なAPIを使ってwordpressのデータを取得。APIって便利だね。

この方法ではなく feed を使って外部サーバーの wordpress ブログを取得したいと思います。
きっとどこかで「サムネイルが取れないから使えないよぅ」っと世界のどこかできっと困ってる人がいると思うのでいろんな合わせ技を使って表示したいと思います。

 

 

基本的な feed の取得


 

//example.com/?feed=rss2

 

これで大体 取得できます。
すると最新記事などがつらつらと表示されます。(ソースを見た方がいいかもです)

ソースを見てもはじめてみる方にはなんじゃいこれって感じだと思うので
必要な箇所を抜粋
<channel>以下にある
<item> ~ </item> まで囲まれた箇所が記事情報の一つの塊となります。

 

 

その中にあるほしい情報は以下のタグに囲まれた中にあります。

 

■記事タイトル
<title>○○</title>

■パーマリンク
<link>○○</link>

■公開日
<pubDate>○○</pubDate>

■作者名
<dc:creator><![CDATA[○○]]></dc:creator>

■カテゴリー名
<category><![CDATA[○○]]></category>

■抜粋文
<description><![CDATA[○○]]></description>

■本文
<content:encoded><![CDATA[○○]]></content:encoded>

 

 

simplexml_load_file()を使った基本的な取得方法


 


$rss_url = "//example.com/?feed=rss2";
$rss_data = simplexml_load_file($rss_url);
$i = 0;
foreach($xmldata->channel->item as $item){
$rss_data[$i]['title'] = $item->title;
$rss_data[$i]['link'] = $item->link;
$rss_data[$i]['pubData'] = $item->pubData;
$rss_data[$i]['dc'] = $item->dc:creator;
$rss_data[$i]['category'] = $item->category;
$rss_data[$i][description'] = $item->description;
$rss_data[$i]['content'] = $item->content:encoded;
$i++;
}


 

 

こんな感じでデータを取得します。
でも、ここで問題が

 

■ <![CDATA[○○]]>データも普通に取得するだけだと表示されない。

■ 名前空間だとかの
dc:creator
content:encoded
こいつらが取れない。。。

 

 

 

だがしかし

CDATAは「文字列」として扱うと取得できます。

 

 

例えば
<description><![CDATA[○○]]></description>

$rss_data[$i][description'] = (string)$item->description;

 

こんな感じでゲットだず。
だがしかーし更なる山がきます。

 

 

 

そもそもこれアイキャッチ画像を吐き出してるとこがない。。。


 

 

でもあきらめるのはまだ早いので
まずは、RSSを吐き出す方にアイキャッチ画像ブッコんでみよう。
こちらをfunctions.php に追加しておいてください。

(※必ずバックアップを取ってから自己責任で。。)

 

 


//フィードの記事本文と抜粋にアイキャッチ画像を出力だ!
function rss_post_thumbnail($content) {
global $post;
if(has_post_thumbnail($post->ID)) {
$content = '<div>' . get_the_post_thumbnail($post->ID) . '</div>' . $content;
}
return $content;
}
add_filter('the_excerpt_rss', 'rss_post_thumbnail');
add_filter('the_content_feed', 'rss_post_thumbnail');


 

 

 

これで

<description>内にアイキャッチ画像情報が組み込まれます。

<description><![CDATA[<div><img src="○○" .... ></div>○○.....]]></description>

このような形で組み込まれてます。

 

 

WordPress RSSフィードにサムネイル(アイキャッチ)画像を表示させる方法

こちらの記事を参考にしています。

 

みなさんあの手この手と考えてて頭が下がります。

 

 

 

そこで今度は
投稿記事の最初の画像をとってくるやつの出番がきます。

 

 

こちらも functions.php に追加しておいてください。(>_<)

(※必ずバックアップを取ってから自己責任で。。)

 


//記事の最初の画像を取得だ!
function catch_that_image($content) {
$first_img = '';
ob_start();
ob_end_clean();
$output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $content, $matches);
$first_img = $matches [1] [0];
if(empty($first_img)){
//Defines a default image
$first_img = "画像が無いとき表示したい画像パス(フルパスの方がいいお)";
}
return $first_img;
}


 

 

あとは


$rss_data[$i]['description'] = (string)$item->description;
$rss_data[$i]['thumbnail'] = catch_that_image($rss_data[$i]['description']);


 

 

※thumbnail この辺の名前は適当です。

これで記事の最初の画像をサムネイルとして取得することができました。

 

 

 

さらによくばりな僕は

 

 

contentの方に画像入ってるんならそれとった方がええんやないか?


 

 

ということに気づきました。
だがだが しかーし更なる山がきます。
■ 名前空間だとかの
dc:creator
content:encoded
こいつらが取れない。。。。

 

 

これどーやんねん。。

 

 

すると神がいました。
//qiita.com/miiitaka/items/1607c007e096bca04890

 

 

よくお世話になるこちらのサイトで

 

前空間要素を 丸ごと配列にって、こんな方法でできるとは。。。

 

 


$rss_url = "//example.com/?feed=rss2";
$rss_data = simplexml_load_file($rss_url);
$rss_data = preg_replace("/<([^>]+?):(.+?)>/", "<$1_$2>", $rss_data);
$rss_data = simplexml_load_string($rss_data,'SimpleXMLElement',LIBXML_NOCDATA);
$i=0;
foreach($xmldata->channel->item as $item){
$contents = $item->content_encoded;
$rss_newdata[$i]['thumbnail'] = catch_that_image($contents);
$i++;
}

あざす。

 

 

 

 

そもそも何で外部サーバーから...くっ
久しぶりにまじめに書きましたが、まだまだです。。。(>_<)
そろそろつけ麺食べに行きたいず。

 

では。

 

 

 

 

この人が書いた記事

VAXの記事をもっと見る

関連する記事