RSS最終版・改
タイトル部分が半角英数字から始まった場合、広告と同じように蹴られるという事態が発生。
まぁ、基本的に正規表現とかよくわかんないままだし。
ということで、ちょっと改造しました。
<?php $rssCount = isset($rssCount) ? $rssCount : '20'; $rssTpl = isset ($rssTpl) ? $modx->getChunk($rssTpl) : '<ul> <!-- start --> <li><a href="[+rsslink+]">[+rsstitle+]</a>([+rssdate+] / [+blogtitle+])</li> <!-- end --> </ul> '; define('MAGPIE_OUTPUT_ENCODING', 'UTF-8'); //文字コード化け対策 $rssrss_base = isset($rssrss_base) ? $modx->config['base_path'].$rssrss_base : $modx->config['base_path']."assets/snippets/rssrss/"; //まずMagpieRSSのモジュールを読み込む require_once ($rssrss_base . 'rss_fetch.inc'); require_once ($rssrss_base . 'rss_utils.inc'); //次に読み込むRSSの配列を作成する $mainrss = array ('http://www.xxx.net/rss.xml' => 'BLOG 1', 'http://www.yyy.com/rss.rdf' => 'ブログ2' ); //あとで使う配列を規定しておく $rsslines = array(); $rsslineItem = array(); $rssNum = 0; $output = ""; //1970年1月1日からの秒数を今の時間で取得 $today = date(U); //$mainrssを分解してURLと名前に分けて取り出す。このあたりは通常のMagpierssと変わらない。 foreach ($mainrss as $url=>$names){ $rss = fetch_rss($url); $title = $rss->channel['title']; $bloglink = $rss->channel['link']; foreach ($rss->items as $item ) { $title = $item['title']; $urls = $item['link']; //アイテムの日付を拾う、RSSによって変更する必要あり、if文が必要かも $date_timestamp = $item[date_timestamp]; if ($date_timestamp) { $date = Date("Y年m月d日",$date_timestamp); } else { $date_timestamp = strtotime($item[pubdate]); $date = Date("Y年m月d日",$date_timestamp); } //出力はここでタイムスタンプとセットで出力 $title = mb_convert_encoding($title,$modx->config["modx_charset"],"AUTO"); if( ! ($title == mb_ereg_match("PR:",$title))){ $rsslineItem[$rssNum]['timestamp'] = $date_timestamp; $rsslineItem[$rssNum]['rssdate'] = $date; $rsslineItem[$rssNum]['blogtitle'] = $names; $rsslineItem[$rssNum]['rsslink'] = $urls; $rsslineItem[$rssNum]['rsstitle'] = $title; $rsslineItem[$rssNum]['bloglink'] = $bloglink; $rssNum += 1; } } } if (count($rsslineItem) > 0) { $tpl = str_replace("<!-- start -->","\0",$rssTpl); $tpl = str_replace("<!-- end -->","\0",$tpl); $parts = explode("\0",$tpl); if (count($parts) != 3) { return "Template Error"; } $frame = $parts[0]; foreach ($rsslineItem as $key1 => $val1) { $tmp_data = $parts[1]; foreach ($val1 as $key2 => $val2) { $tmp_data = str_replace("[+".$key2."+]",$val2,$tmp_data); } //タイムスタンプで配列を作る。 $rsslines["{$val1['timestamp']}"] = $tmp_data; } //タイムスタンプでkrsort (配列をキーで逆順にソートする) krsort($rsslines); $count = "0"; for(reset($rsslines); $key=key($rsslines); next($rsslines)){ $frame .= $rsslines[$key]; $count++; if($count == $rssCount){ break; } } $frame .= $parts[2]; $output .= $frame; } return $output; ?>
PR以降はマルチバイト文字列なんだから、やっぱそっちにしないとダメだったということですかね。
それにしては、半角数字から始まると弾かれる理由がわかりませんが。
あとで、「広告」から始まるのも同じように除外するようにしないとなー。