WordpressサイトにアメブロのRSSを使用し、新着のタイトル・日付・記事内容・最初の投稿写真を5件表示させたいと思い、PHPを作成しました。
記事内にある絵文字は除外し、投稿写真の最初の物を表示させます。
全て表示はされているのですが、写真が最初の物ではなく最後の物が表示されてしまいます。
調べてもどこに原因があるのかわからず、質問させていただきました。
アドバイスいただけると大変助かります。よろしくお願い致します。
↓こちらのFeed.phpを設置
https://github.com/dg/rss-php
↓Wordpressのindex.phpに書いたphpコード
<?php
require_once "Feed.php" ;
$feed = new Feed ;
$url = "RSSのURL入力";
$rss = $feed->loadRss( $url ) ;
$num = 5;//表示させたい件数
$i=0;
$desW = 40;
if ( $desW != 0){
$desW = ($desW*2)+2;
}
foreach( $rss->item as $item )
{
if($i>=$num){
}
else{
$title = $item->title ;
$link = $item->link ;
$timestamp = strtotime( $item->pubDate ) ;
$description = $item->description ;
$description = str_replace("▼続きを読む","",$description);
$description = strip_tags($description);
if ( $desW != 0){
$description = mb_strimwidth($description, 0, $desW, "…",'utf-8');
}
//画像がない場合の指定
$first_img = trim($now_url,"/") . "../../../img/noimage.jpg";
//絵文字画像は除外
$blacklist = array(
"emoji.ameba.jp",
"stat100.ameba.jp/blog/ucs/img"
);
if( preg_match_all('/<img(.+?)>/is', $item->description, $matches) ){
foreach( $matches[0] as $img ){
$is_white = true;
foreach ($blacklist as $path) {
if (strpos($img, $path) !== false) {
$is_white = false;
}
}
//最初の画像にマッチしたもの
if ($is_white && preg_match('/src=[\'"](.+?(?:jpg|png))[\'"]/i', $img, $m)) {
$first_img = $m[1];
}
}
}
?>
<p><?php echo date( "Y/m/d", $timestamp); ?></p>
<img src="<?php print $first_img; ?>" alt="<?php print $item->title; ?>" width="100">
<a href="<?php echo $link; ?>" target="_blank"><?php echo $title; ?></a>
<p class="text"><?php echo $description; ?></p>
<?php
$i++;
}
}
?>
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
checkベストアンサー
+2
インデントがずれていて、見にくいので悩みましたが...
foreach( $matches[0] as $img ){
でループを回していますので、$matches[0] の数だけループします。
複数の画像がある場合、最初の画像を取得してからも次のループが回るので、条件に一致する画像が複数あると 何回も実行されて、$first_img
が、上書きされますね。そのため、条件に一致した最後の画像が代入されているのだと思われます。
画像取得の条件に $first_img が空であるという条件を加えるか。または、$first_img に代入した後に break
でループを抜けるようにする必要がありそうです。
$first_img = $m[1];
の次の行に break;
といれて、 foreach ループを抜けるようにしたら 希望の動作にならないでしょうか。
-
回答の評価を上げる
以下のような回答は評価を上げましょう
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.93%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼