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

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

ただいまの
回答率

90.86%

  • PHP

    18170questions

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

  • WordPress

    6180questions

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

  • RSS

    129questions

    RSS(Really Simple Syndication)はブログのエントリやニュースの見出し、標準のフォーマットの音声やビデオなどを発行するために使われるウェブフィードのフォーマットの集合体です。

ワードプレスでRSS取得(外部ブログの記事一覧表示)について

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 105

現在ワードプレスサイトに、別のワードプレスブログの記事をRSSで取得し表示させています。

現在RSSは5つのサイトから取得するよう設定していますが以下のことがうまくいきません。

■記事の取得数が10になっているものを変更したい。

1ページに表示する最大数が10で取得する記事数を全記事にしたいと考えています。素人ですのでRSS取得のphpコードは他のサイトからコピーして引用して使わせていただいています。

わかる方がいらっしゃいましたらどこを変更すれば良いか教えていただけますでしょうか。

よろしくお願いいたします。

(以下、RSS取得コード)
https://gist.github.com/cherenkov/2663757より引用して使わせていただいております。

================================================

<?php
$nums = 10; // 1ページの表示件数
$rsslist = array('http://michaelsan.livedoor.biz/index.rdf', // RSSのURLを配列にして代入します。
             'http://blog.livedoor.jp/domesaka/index.rdf', // 2件で大丈夫な場合はこの行を削除します。(※行を追加して4件以上にしても大丈夫です。)
             'http://news4vip.livedoor.biz/index.rdf');
//デバッグ時はコメントアウトにする。うまくいかなかったらcookieを消す。
session_start(); // ページ遷移ごとにリクエストしないようにセッションを使用します。
header('Content-Type:text/html; charset=UTF-8');
if(!isset($_SESSION['rssses'])) {
    foreach($rsslist as $url) {
        $tmpData = file_get_contents($url);
        $tmpData = str_replace('dc:creator', 'Creator', $tmpData);
        $tmpData = str_replace('dc:date', 'Date', $tmpData);
        $tmpData = str_replace('pubDate', 'Date', $tmpData);
        $rssData[] = simplexml_load_string($tmpData);
    }
    foreach($rssData as $key => $value) {
        if($value['version'] == '2.0') {
            foreach($value->channel->item as $item) {
                $date = date_create($item->Date);
                $item->Date = date_format($date, 'Y-m-d\TH:i:sP');
            }
        }
    }
    $i = count($rsslist);
    $allrss = array();
    for($n=0;$n<$i;$n++) {
        $rssarr[$n] = xml2arr($rssData[$n]);
        //pr($rssarr[$n]);
        $channelTitle = $rssarr[$n]['channel']['title'];
        if(isset($rssarr[$n]['channel']['item'])) {
            $rssarr[$n]['channel']['item'] = addChannelTitle($rssarr[$n]['channel']['item'], $channelTitle);
            $allrss = array_merge($allrss, $rssarr[$n]['channel']['item']);
        } else {
            $rssarr[$n]['item'] = addChannelTitle($rssarr[$n]['item'], $channelTitle);
            $allrss = array_merge($allrss, $rssarr[$n]['item']);
        }
    }
    usort($allrss, 'cmp');
    //pr($allrss);
    $i = count($allrss);
    for($n=0;$n<$i;$n++) {
        if(empty($allrss[$n]['title'])) {
            $allrss[$n] = null;
        }
    }

    $_SESSION['rssses'] = $allrss = array_filter($allrss);
} else {
    $allrss = $_SESSION['rssses'];
}
function addChannelTitle($items, $channelTitle) {
    $result = array();
    foreach($items as $item) {
        $result[] = array_merge($item, array('channel_title'=>$channelTitle));
    }
    return $result;
}
//dumpして確認する関数
function pr($var) {
    echo '<pre>'; print_r($var); echo '</pre>';
}
# オブジェクト→配列変換用関数(http://soft.fpso.jp/develop/php/entry_2764.html)
function xml2arr($xmlobj) {
    $arr = array();
    if (is_object($xmlobj)) {
        $xmlobj = get_object_vars($xmlobj);
    } else {
        $xmlobj = $xmlobj;
    }
    foreach ($xmlobj as $key => $val) {
        if (is_object($xmlobj[$key])) {
            $arr[$key] = xml2arr($val);
        } else if (is_array($val)) {
            foreach($val as $k => $v) {
                if (is_object($v) || is_array($v)) {
                    $arr[$key][$k] = xml2arr($v);
                } else {
                    $arr[$key][$k] = $v;
                }
            }
        } else {
            $arr[$key] = $val;
        }
    }
    return $arr;
}
function cmp($a, $b)
{
    return strcmp($b['Date'], $a['Date']);
}
$maxnum = count($allrss); // 最大件数を取得
$pages = ceil($maxnum / $nums); // 最大ページ数を計算
$page = (empty($_GET['page'])) ? 1 : $_GET['page']; // 現在のページを取得
$start = ($page - 1) * $nums; // スタートページを設定
$script = basename($_SERVER['SCRIPT_NAME']);
$link = '';
// 前ページ・次ページのリンク設定※表示形式は自由に指定してください。
if ($page > 1) $link = '<a href="'.$script.'?page='.($page -1) .'">PREV</a>&nbsp|';
// 各ページへのリンクを表示する場合
for($n = 1; $n <= $pages; $n++) {
    if($n == $page){
        $link .= '['.$n.']';
    } else {
        $link .= '[<a href="'.$script.'?page='. $n .'">'.$n.'</a>]';
    }
}
if ($page < $pages) $link .= ' <a href="'.$script.'?page='.($page + 1) .'">NEXT</a>';
echo '<div style="margin: 15px 10px;">' . $link . "</div>\n";
echo "<h3>新着RSS</h3>\n<ul>\n";
$count = 1;
foreach ($allrss as $rss => $item) {
        if ($count > $start && $count <= $start + $nums) {
            $date = preg_replace('/([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9:]{3}[0-9]{2})[0-9+:]+$/', '$1/$2/$3 $4', $item['Date']);
            echo '<li class=""><a href="' . $item['link'] . '"';
            echo '>' . $date . ' ' . $item['title'] . ' ' . $item['channel_title'] .'</a></li>';
            echo "\n";
        }
        $count++;
}
echo "</ul>\n";
echo '<div style="margin: 15px 10px;">' . $link . "</div>\n";
//pr($allrss);

================================================

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • CHERRY

    2018/06/07 13:51

    出先なので、まだ、コードは見ていないのですが... 相手先が提供する RSS には、10件以上のデータが存在しているのでしょうか? 大手のBlog サービスを見ると10件しか提供されていないようです。

    キャンセル

  • teraokateraoka

    2018/06/07 14:04

    相手先ブログは私が管理しているワードプレスのブログです。RSSを提供している件数というのが決まっている場合があるのですね。今コメントいただいた内容で検索してみると設定内容が記載されたサイトがあり試してみるとうまく表示することができました。ありがとうございました。回答していただければベストアンサーに選ばせていただきます。よろしくお願いいたします。

    キャンセル

  • CHERRY

    2018/06/08 09:50

    お言葉に甘えて...  「質問への追記・修正」欄に記載した内容をもう少しわかりやすく書き直して、投稿しておきます。

    キャンセル

回答 2

checkベストアンサー

+1

ブログサイトの RSS は、件数が決まっていること多いです。
大手の Blog サービスの RSS を確認してみると 最新の10件しか提供されていないようです。

プログラムが参照している RSS は、10件以上のデータが存在しているのでしょうか?

RSSが 10 件しか提供されていない場合は、10件以上のデータを取得件することはできませんので、RSSの提供側の出力件数を確認してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/08 09:58

    参照元サイトのRSSの表示件数を増やすことで解決できました。ありがとうございました。

    キャンセル

+1

10記事でページングされる処理となっているものを1ページに収めるということを、このコードをベースにしてやるなら、最初の10という数値を大きくしてください(色々と機械の都合があるので、1万とかにするのが無難です。5兆とかにはしないほうがいいです)。

ページングそのものをしないようにするほどに書きかえるのは、このコードの著作権に触れる可能性もあるので控えます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/07 14:06

    ご回答ありがとうございます。1ページに収めるのではなく10ページごとにページングしているのはそのままで、記事の取得数の総数を増やすという処理を求めておりました。説明不足で申し訳ありません。
    コメント欄でいただいた別の方の助言で解決いたしました。
    ありがとうございました。

    キャンセル

  • 2018/06/07 14:14

    もう解決しているのであれですが、このコードはもともと10件で足切りをしていません。
    要約すると「10件しかないrssを取得したら10件しかないのですが(rssにないデータを引き出せますか)?」という質問だったということですね

    キャンセル

  • 2018/06/07 14:19

    相手先のブログ(私が管理しているワードプレスのブログ)がRSSフィードに表示する記事数を10件に設定されていました。フィードへの記事表示数を相手先ブログ側で制限されていることを知りませんでした。またそれを変更できることも知りませんでしたのでこのような質問になってしまいました。ご迷惑をおかけしました。

    キャンセル

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

  • ただいまの回答率 90.86%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    18170questions

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

  • WordPress

    6180questions

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

  • RSS

    129questions

    RSS(Really Simple Syndication)はブログのエントリやニュースの見出し、標準のフォーマットの音声やビデオなどを発行するために使われるウェブフィードのフォーマットの集合体です。