質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

7024閲覧

PHPでアメーバブログのRSSから画像を表示させたい

sazami

総合スコア18

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/11/13 03:37

編集2018/11/13 04:19

WordpressサイトにアメブロのRSSを使用し、新着のタイトル・日付・記事内容・最初の投稿写真を5件表示させたいと思い、PHPを作成しました。
記事内にある絵文字は除外し、投稿写真の最初の物を表示させます。

全て表示はされているのですが、写真が最初の物ではなく最後の物が表示されてしまいます。
調べてもどこに原因があるのかわからず、質問させていただきました。
アドバイスいただけると大変助かります。よろしくお願い致します。

↓こちらのFeed.phpを設置
https://github.com/dg/rss-php

↓Wordpressのindex.phpに書いたphpコード

php

1<?php 2require_once "Feed.php" ; 3$feed = new Feed ; 4$url = "RSSのURL入力"; 5$rss = $feed->loadRss( $url ) ; 6$num = 5;//表示させたい件数 7$i=0; 8$desW = 40; 9if ( $desW != 0){ 10 $desW = ($desW*2)+2; 11} 12foreach( $rss->item as $item ) 13{ 14 if($i>=$num){ 15 } 16 else{ 17$title = $item->title ; 18$link = $item->link ; 19$timestamp = strtotime( $item->pubDate ) ; 20$description = $item->description ; 21$description = str_replace("▼続きを読む","",$description); 22$description = strip_tags($description); 23if ( $desW != 0){ 24$description = mb_strimwidth($description, 0, $desW, "…",'utf-8'); 25} 26//画像がない場合の指定 27$first_img = trim($now_url,"/") . "../../../img/noimage.jpg"; 28//絵文字画像は除外 29$blacklist = array( 30"emoji.ameba.jp", 31"stat100.ameba.jp/blog/ucs/img" 32); 33if( preg_match_all('/<img(.+?)>/is', $item->description, $matches) ){ 34 foreach( $matches[0] as $img ){ 35 $is_white = true; 36 foreach ($blacklist as $path) { 37 if (strpos($img, $path) !== false) { 38 $is_white = false; 39 } 40 } 41//最初の画像にマッチしたもの 42 if ($is_white && preg_match('/src=[\'"](.+?(?:jpg|png))[\'"]/i', $img, $m)) { 43 $first_img = $m[1]; 44 } 45 } 46 } 47?> 48 <p><?php echo date( "Y/m/d", $timestamp); ?></p> 49 <img src="<?php print $first_img; ?>" alt="<?php print $item->title; ?>" width="100"> 50 <a href="<?php echo $link; ?>" target="_blank"><?php echo $title; ?></a> 51 <p class="text"><?php echo $description; ?></p> 52 <?php 53 $i++; 54 } 55 } 56 ?>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/11/13 03:45

ソースコードはマークダウンのcode機能を使ってください。質問・解説内容とコードとの境目が不明瞭となりますし、code機能では正しくコードをコピペできるようになりインデントもつけられて読みやすくなり、再現確認も容易となりますので、的確な回答が得やすくなります。https://teratail.com/help#about-markdown
sazami

2018/11/13 04:07

大変失礼致しました。初めての利用のため、方法がよくわかっておりませんでした。ご指摘ありがとうございます。
m.ts10806

2018/11/13 04:15

すみません。あとタグに「WordPress」を追加しておいてもらえると。PHPの知識よりWordPress自体の知識が必要になるケースの方が多いので
sazami

2018/11/13 04:20

こちらこそたびたびすいません。タグ追加致しました。
guest

回答1

0

ベストアンサー

インデントがずれていて、見にくいので悩みましたが...

foreach( $matches[0] as $img ){

でループを回していますので、$matches[0] の数だけループします。

複数の画像がある場合、最初の画像を取得してからも次のループが回るので、条件に一致する画像が複数あると 何回も実行されて、$first_img が、上書きされますね。そのため、条件に一致した最後の画像が代入されているのだと思われます。

画像取得の条件に $first_img が空であるという条件を加えるか。または、$first_img に代入した後に break でループを抜けるようにする必要がありそうです。


$first_img = $m[1];

の次の行に break; といれて、 foreach ループを抜けるようにしたら 希望の動作にならないでしょうか。

投稿2018/11/13 04:38

編集2018/11/13 04:44
CHERRY

総合スコア25171

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazami

2018/11/13 04:52

ありがとうございます!できました! ループで上書きされていたのですね。知識が乏しく、そこに気がつきませんでした。 $first_img = $m[1]; break; とし、ループを抜ける事で解決できました。 大変助かりました。感謝申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問