Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

「Qiita」と「WordPress」のRSSを取得して、PHPで静的HTMLに表示する方法

外部サイトの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.php -->
<?php
// RSSフィードからRSSを取得
$feed = file_get_contents('https://sarap422.com/wp1/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->channel->item as $item) : ?>
        <?php
        // 取得回数の指定
        if ($count >= 3) { break; }
        ?>
        <?php
        $item_title = $item->title;
        $item_pub = date("Y-m-d", strtotime($item->pubDate));
        $item_link = $item->link;
        $item_desc = mb_strimwidth(strip_tags($item->description), 0, 110, "…Read More", "utf-8");
        ?>
        <dt class="col-lg-4"><?php echo $item_pub; ?></dt>
        <dd class="col-lg-8 text-left"><a href="<?php echo $item_link; ?>" target="_blank" rel="noopener noreferrer">
                <?php echo $item_title; ?></a></dd>
        <?php $count++; ?>
    <?php endforeach; ?>
</dl>
<!--ƒ /?output-rss.php -->

rowmx-autocol-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の勉強中だし時間かけて無理して調べるところじゃないので現状そんな感じで以上です。

sarap422
半年間の委託訓練校での学びを経て、現在はコーディング業務として古書店・病院・プロイラストレーター様のHPからWEBアプリの開発等、主にWEBデザイン・画像制作についての経験を積んできました。現在、WEBサイト制作業務に携われる会社さんへの就職を目指して就職活動中です。
https://sarap422.com/portfolio/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away