#外部サイトのRSS情報を取得して表示させる方法
参考にしたページはこのあたり。
PHPで外部サイトのRSS情報を取得して表示させる方法。 - 株式会社オンズ
https://on-ze.com/archives/1615新着情報を受け取る!PHPでRSSを取得する方法 | TechAcademyマガジン
https://techacademy.jp/magazine/18803
これで「Qiita」の記事を新着情報に表示させたい的なことをやろうとして、
サンプルはその通りにしたら表示されるのですけど、
「Qiita」のRSSフィードだと上手く行かなくてですねー、
結論として言うと
ページによって「RSSフィード」の形式が違うのが原因でした。
##output-rss-qiita.php
それで「Qiita」のRSS形式に合わせた
RSSフィードを取得して表示する「.php」がこちら
<!-- ?output-rss.php -->
<?php
// RSSフィードからRSSを取得
$feed = file_get_contents('https://qiita.com/sarap422/feed');
// XML解析を行う上で、XMLで不正文字と扱われる対象を空文字に変換
$invalid_characters = '/[^\x9\xa\x20-\xD7FF\xE000-\xFFFD]/';
$feed = preg_replace($invalid_characters, '', $feed);
// 文字列をXMLとして解析して、SimpleXMLElementクラスのインスタンスに変換
$rss = simplexml_load_string($feed);
?>
<?php
date_default_timezone_set('Asia/Tokyo');
$count = 0;
?>
<dl class="row mx-auto">
<?php foreach ($rss->entry as $entry) : ?>
<?php
// 取得回数の指定
if ($count >= 3) { break; }
?>
<?php
$entry_title = $entry->title;
$entry_pub = date("Y-m-d", strtotime($entry->published));
$entry_url = $entry->url;
$entry_cont = mb_strimwidth(strip_tags($entry->content), 0, 110, "…Read More", "utf-8");
?>
<dt class="col-lg-4"><?php echo $entry_pub; ?></dt>
<dd class="col-lg-8 text-left"><a href="<?php echo $entry_url; ?>" target="_blank" rel="noopener noreferrer">
<?php echo $entry_title; ?></dd>
</a></li>
<?php $count++; ?>
<?php endforeach; ?>
</dl>
<!--ƒ /?output-rss.php -->
##output-rss-wp.php
ついでに「WordPress」は「記事データの取得」から新着情報を表示する方法もあるのですけど、「RSSフィードからの取得」に統一した方がデザインとかたぶんやりやすいですよね?
ということで、「WordPress」のRSS形式に合わせた
RSSフィードを取得して表示する「.php」がこちら
<!-- output-rss-wp.php -->
<?php
//RSSフィードからRSSを取得
$feed = file_get_contents('https://www.lining-moon.casa/skuld/feed/');
//XML解析を行う上で、XMLで不正文字と扱われる対象を空文字に変換
$invalid_characters = '/[^\x9\xa\x20-\xD7FF\xE000-\xFFFD]/';
$feed = preg_replace($invalid_characters, '', $feed);
//文字列をXMLとして解析して、SimpleXMLElementクラスのインスタンスに変換
$rss = simplexml_load_string($feed);
?>
<?php
date_default_timezone_set('Asia/Tokyo');
$count = 0;
?>
<div class="su-posts su-posts-default-loop">
<?php foreach ($rss->channel->item as $item) : ?>
<?php
//取得回数の指定
if ($count >= 3) {
break;
};
$item_thumb_url = $item->thumb->url;
$item_title = $item->title;
$item_pubDate = date("Y-m-d", strtotime($item->pubDate));
$item_link = $item->link;
$item_description = $item->description;
?>
<div class="su-post">
<a href="<?php echo $item_link; ?>">
<img class="su-post-thumbnail" src="<?php echo $item_thumb_url; ?>" alt="" /></a>
<h3 class="su-post-title"><?php echo $item_title; ?></h3>
<div class="su-post-excerpt">
<!-- 抜粋文(文字数変更) -->
<?php $remove_array = ["\r\n", "\r", "\n", " ", " "];
$excerpt = strip_tags($item_description);
$excerpt = strip_shortcodes($excerpt);
$excerpt = str_replace($remove_array, '', $excerpt);
if (mb_strlen($excerpt, 'UTF-8') > 90) {
$excerpt = wp_trim_words($excerpt, 90, '…');
}
echo $excerpt;
?>
</div><!-- ///.su-excerpt -->
<div class="su-post-meta">
<span class="su-post-meta__date"><time datetime="<?php echo $item_pubDate; ?>"><?php echo $item_pubDate; ?></time></span>
</div>
<div class="su-post-readmore">
<a class="button is-outline is-readmore" href="<?php echo $item_link; ?>">続きを読む<i></i></a>
</div>
</div><!-- ///.su-post -->
<?php $count++; ?>
<?php endforeach; ?>
</div><!-- ///.su-posts -->
<!-- ///output-rss-wp.php -->
※row
やmx-auto
、col-lg
は、「Bootstrap」のclassなので、適当に変えてください。
#「foreach」構文について
ちなみに「foreach」構文は、
<?php foreach ($array as $parameter){
繰り返したい内容
} ?>
<?php foreach ($array as $parameter) : ?>
繰り返したい内容
<?php endforeach; ?>
の、どちらでもいいらしいのですけど、
今のところ自分の場合は、 <>
で囲んだ方が、htmlタグもそのまま書けるし、
見やすいかなーということで、その書き方にしました。
ついでに引っ張ってくる回数($count >= 3
)も指定できるように。
あと「.htaccess」に、AddHandler fcgid-script .html
を書いて
静的HTMLに「output-rss.php」をそのまま書けばたぶん動きそうなんですが、
それだとHTMLがゴチャゴチャするので、
「output-rss.php」を「WordPress」の「theme」内に置いて、
上位ディレクトリの「index.html」から「get_template_part」で
「output-rss.php」を引っ張ったら、
何故かディレクトリ指定することもなくそのまま動きました。
<!-- 「get_template_part」はWordPress構文 -->
<?php get_template_part ( 'output-rss-qiita' ); ?>
<?php get_template_part ( 'output-rss-wp' ); ?>
本当は、WordPressの「theme」外の「.php」はそれで置き場変えたいのですけど、
ちょっとよくわからなくて、今PHPの勉強中だし時間かけて無理して調べるところじゃないので現状そんな感じで以上です。