制作物全国対応・兵庫県 姫路市にある発信力をテーマとしたホームページ・ブログ制作
ニコ株式会社
Blog


google feed apiが使えなくなったので代わりにPHPで


突然google feed apiが動かなくなって対応に追われてしまいましたので、自分でPHPを触れる方用にPHPで同じように出力する手順を記載しておきます。

 

WordPressの記事を取得する場合

ふたつのPHPでファイルを使います。

 

ひとつめ。(feed.php)

<?php
/**
 * RSS for PHP - small and easy-to-use library for consuming an RSS Feed
 *
 * @copyright  Copyright (c) 2008 David Grudl
 * @license    New BSD License
 * @version    1.2
 */
class Feed
{
	/** @var int */
	public static $cacheExpire = '1 day';
	/** @var string */
	public static $cacheDir;
	/** @var SimpleXMLElement */
	protected $xml;
	/**
	 * Loads RSS or Atom feed.
	 * @param  string
	 * @param  string
	 * @param  string
	 * @return Feed
	 * @throws FeedException
	 */
	public static function load($url, $user = NULL, $pass = NULL)
	{
		$xml = self::loadXml($url, $user, $pass);
		if ($xml->channel) {
			return self::fromRss($xml);
		} else {
			return self::fromAtom($xml);
		}
	}
	/**
	 * Loads RSS feed.
	 * @param  string  RSS feed URL
	 * @param  string  optional user name
	 * @param  string  optional password
	 * @return Feed
	 * @throws FeedException
	 */
	public static function loadRss($url, $user = NULL, $pass = NULL)
	{
		return self::fromRss(self::loadXml($url, $user, $pass));
	}
	/**
	 * Loads Atom feed.
	 * @param  string  Atom feed URL
	 * @param  string  optional user name
	 * @param  string  optional password
	 * @return Feed
	 * @throws FeedException
	 */
	public static function loadAtom($url, $user = NULL, $pass = NULL)
	{
		return self::fromAtom(self::loadXml($url, $user, $pass));
	}
	private static function fromRss(SimpleXMLElement $xml)
	{
		if (!$xml->channel) {
			throw new FeedException('Invalid feed.');
		}
		self::adjustNamespaces($xml);
		foreach ($xml->channel->item as $item) {
			// converts namespaces to dotted tags
			self::adjustNamespaces($item);
			// generate 'timestamp' tag
			if (isset($item->{'dc:date'})) {
				$item->timestamp = strtotime($item->{'dc:date'});
			} elseif (isset($item->pubDate)) {
				$item->timestamp = strtotime($item->pubDate);
			}
		}
		$feed = new self;
		$feed->xml = $xml->channel;
		return $feed;
	}
	private static function fromAtom(SimpleXMLElement $xml)
	{
		if (!in_array('http://www.w3.org/2005/Atom', $xml->getDocNamespaces(), TRUE)
			&& !in_array('http://purl.org/atom/ns#', $xml->getDocNamespaces(), TRUE)
		) {
			throw new FeedException('Invalid feed.');
		}
		// generate 'timestamp' tag
		foreach ($xml->entry as $entry) {
			$entry->timestamp = strtotime($entry->updated);
		}
		$feed = new self;
		$feed->xml = $xml;
		return $feed;
	}
	/**
	 * Returns property value. Do not call directly.
	 * @param  string  tag name
	 * @return SimpleXMLElement
	 */
	public function __get($name)
	{
		return $this->xml->{$name};
	}
	/**
	 * Sets value of a property. Do not call directly.
	 * @param  string  property name
	 * @param  mixed   property value
	 * @return void
	 */
	public function __set($name, $value)
	{
		throw new Exception("Cannot assign to a read-only property '$name'.");
	}
	/**
	 * Converts a SimpleXMLElement into an array.
	 * @param  SimpleXMLElement
	 * @return array
	 */
	public function toArray(SimpleXMLElement $xml = NULL)
	{
		if ($xml === NULL) {
			$xml = $this->xml;
		}
		if (!$xml->children()) {
			return (string) $xml;
		}
		$arr = array();
		foreach ($xml->children() as $tag => $child) {
			if (count($xml->$tag) === 1) {
				$arr[$tag] = $this->toArray($child);
			} else {
				$arr[$tag][] = $this->toArray($child);
			}
		}
		return $arr;
	}
	/**
	 * Load XML from cache or HTTP.
	 * @param  string
	 * @param  string
	 * @param  string
	 * @return SimpleXMLElement
	 * @throws FeedException
	 */
	private static function loadXml($url, $user, $pass)
	{
		$e = self::$cacheExpire;
		$cacheFile = self::$cacheDir . '/feed.' . md5(serialize(func_get_args())) . '.xml';
		if (self::$cacheDir
			&& (time() - @filemtime($cacheFile) <= (is_string($e) ? strtotime($e) - time() : $e))
			&& $data = @file_get_contents($cacheFile)
		) {
			// ok
		} elseif ($data = trim(self::httpRequest($url, $user, $pass))) {
			if (self::$cacheDir) {
				file_put_contents($cacheFile, $data);
			}
		} elseif (self::$cacheDir && $data = @file_get_contents($cacheFile)) {
			// ok
		} else {
			throw new FeedException('Cannot load feed.');
		}
		return new SimpleXMLElement($data, LIBXML_NOWARNING | LIBXML_NOERROR);
	}
	/**
	 * Process HTTP request.
	 * @param  string
	 * @param  string
	 * @param  string
	 * @return string|FALSE
	 * @throws FeedException
	 */
	private static function httpRequest($url, $user, $pass)
	{
		if (extension_loaded('curl')) {
			$curl = curl_init();
			curl_setopt($curl, CURLOPT_URL, $url);
			if ($user !== NULL || $pass !== NULL) {
				curl_setopt($curl, CURLOPT_USERPWD, "$user:$pass");
			}
			curl_setopt($curl, CURLOPT_HEADER, FALSE);
			curl_setopt($curl, CURLOPT_TIMEOUT, 20);
			curl_setopt($curl, CURLOPT_ENCODING , '');
			curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); // no echo, just return result
			if (!ini_get('open_basedir')) {
				curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE); // sometime is useful :)
			}
			$result = curl_exec($curl);
			return curl_errno($curl) === 0 && curl_getinfo($curl, CURLINFO_HTTP_CODE) === 200
				? $result
				: FALSE;
		} elseif ($user === NULL && $pass === NULL) {
			return file_get_contents($url);
		} else {
			throw new FeedException('PHP extension CURL is not loaded.');
		}
	}
	/**
	 * Generates better accessible namespaced tags.
	 * @param  SimpleXMLElement
	 * @return void
	 */
	private static function adjustNamespaces($el)
	{
		foreach ($el->getNamespaces(TRUE) as $prefix => $ns) {
			$children = $el->children($ns);
			foreach ($children as $tag => $content) {
				$el->{$prefix . ':' . $tag} = $content;
			}
		}
	}
}
/**
 * An exception generated by Feed.
 */
class FeedException extends Exception
{
}

 

ふたつめ。(feed1.php)

<?php 
require_once "feed.php" ; //feed-phpライブラリを読み込みます
$feed = new Feed ;
$url = "http://○○○○.com/feed/"; //RSSのURLを入力する
$rss = $feed->loadRss( $url ) ;
$num = 3;//表示させたい件数
$i=0;
$desW = 30;//記事本文の文字数。制限しないときは0。
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');
		}
		$thumbnail = trim($now_url,"/") . "http://○○○.png";//画像がない場合に表示させる画像URL
		if( preg_match_all('/<img([\s\S]+?)>/is', $item->description, $matches) ){
			foreach( $matches[0] as $img ){
				if ($img === reset($matches[0])) {//最初の画像にマッチしたものを表示
					if( preg_match('/src=[\'"](.+?(jpe?g|png))[\'"]/', $img, $m) ){

						$thumbnail = $m[1];
					}
				}
			}
		}
		?>
<li>
<img src="<?php print $thumbnail; ?>" alt="<?php print $item->title; ?>" width="100">
<a href="<?php echo $link; ?>" target="_blank"><?php echo date( "Y/m/d" , $timestamp ) ; ?> <?php echo $title; ?></a>
<?php echo $description; ?>
</li>
<?php
		$i++;
	}
}
?>

細かい部分の説明は省きます。

これらを見てピンと来ない方は触らないことをおすすめします。

 

一応、表記はサムネイル画像・日付・タイトル・記事本文を想定しています。

class属性などをつけてcssなどで表記は変更してください。

 

私の場合、これらのファイルをhtmlにインクルードしました。

そのソースも載せておきます。

 

<ul>
<?php include(dirname(__FILE__) . "/feed1.php"); ?>
</ul>

リストの中身しかphpに書かなかったので<ul></ul>で囲いました。
これだけな感じです。

 

ニコケアをご利用いただいている方は無償で修正させて頂きました。

 

どうしても自分でやってみたいけど出来ない方へ

サンプルのソースコードをUPしましたので、ご利用くださいませ。

 

もー無理!わかんねえ!という方へ

当社で修復の代行もさせて頂いております。
>>料金目安

ぜひご利用くださいませ。

 

アメブロをご利用の方へ

アメブロの場合、今回のWordPressの記事一覧の取得とは少し異なっていました。
(特に画像取得の部分)
こちらの修復もお気軽にお問い合わせくださいませ。

 



井上 大輔

この記事を書いたひと

ニコ株式会社の社長。html、cssのコーディングの基礎を独学で学び、引きこもってゴソゴソとコーディングをするのが趣味。 建物を見るとhtmlとcssが浮かぶほど。 webの力に惹かれ、今日もせっせとコーディングを行っています。 好きなことはいたずら。子供の頃の夢は社長。 ゲーム好きでテイルズシリーズ、龍が如くシリーズの話題は大好き。 圧倒的にドSですが、妻に怯えながらスマホのゲームに課金をしています。


カテゴリー: WordPress関連, サイト修理   タグ: , , ,   この投稿のパーマリンク

コメントを残す

メールアドレスが公開されることはありません。

スパム対策として日本語が含まれない投稿は無視されますのでご注意ください。

関連記事


カテゴリー:WordPress関連

ニコ株式会社 公式コラム

お知らせ

コラム新着情報

公式フェイスブックページ


Copyright ©ニコ株式会社 All Rights Reserved.