サポート » 使い方全般 » 関数リファレンス/fetch feedでRSS表示する際にアメブロPRを除く方法

  • 以下の記事を参考に、複数のアメブロのフィードを表示させています。
    http://detarame.moo.jp/2011/03/01/%E8%A4%87%E6%95%B0%E5%A4%96%E9%83%A8rss%E3%83%95%E3%82%A3%E3%83%BC%E3%83%89%E3%82%92wordpress%E3%81%A7%E8%A1%A8%E7%A4%BA/

    <?php include_once(ABSPATH . WPINC . '/feed.php');
    $rss = fetch_feed(array(
    'http://feeds.feedburner.com/WebmasterCentral',
    //RSSフィード1
    
    'http://ja.wordpress.org/feed/'
    //RSSフィード2
    ));
    if (!is_wp_error( $rss ) ) :
        $rss->set_cache_duration(1800);
        $rss->init();
        $maxitems = $rss->get_item_quantity(10);
        $rss_items = $rss->get_items(0, $maxitems);
        date_default_timezone_set('Asia/Tokyo');
    endif;
    ?>
    <dl>
        <?php if ($maxitems == 0) echo '<dt>No items.</dt>';
        else
        foreach ( $rss_items as $item ) : ?>
        <dt>
    <?php echo $item->get_feed()->get_title(); ?><br />
    <a href='<?php echo $item->get_permalink(); ?>' target="_blank"><?php echo $item->get_title(); ?></a>
    </dt>
    <dd>(<?php echo $item->get_date("Y-n-j H:i:s"); ?>)</dd>
    <?php endforeach; ?>
    </dl>

    その際、アメブロのPR記事が表示されてしまうのですが、これを除去するには、
    どの箇所にどのように記述すればよいのでしょうか?

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

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • 以下の参考記事だと、PHPのpreg_match()で記事のタイトルに「PR:」が含まれるものを除外しているようです。

    http://www.bhnt.co.jp/blog/%E9%9B%91%E8%A8%98/wordpress%E3%80%80%E5%90%84%E3%82%A2%E3%83%A1%E3%83%96%E3%83%AD%E3%81%AE%E6%96%B0%E7%9D%80%E8%A8%98%E4%BA%8B%E3%82%92%E6%97%A5%E4%BB%98%E9%A0%86%E3%81%AB%E3%82%BD%E3%83%BC%E3%83%88pr%E8%A8%98/

    2010年の記事なのでアメブロのRSSの仕様が変わっている場合は対応できないかもしれませんが、foreachの部分に以下のような感じでタイトルの条件式を加えるとうまくいくかもしれません。

    <?php foreach ( $rss_items as $item ) : ?>
    <?php $blog_title = $item->get_feed()->get_title(); ?>
    <?php if(!preg_match("/^PR:/",$blog_title)): ?>
    <?php echo $blog_title; ?>
    <?php endif; ?>
    <?php endforeach; ?>

    ところでアメブロの広告記事って除去しても大丈夫でしょうか?
    利用規約を確認していないので、良くわかっていないのですが、
    公開する前に一度アメブロのRSSの利用規約?のようなものがあれば確認してみたほうが良いかと思います。

    モデレーター jim912

    (@jim912)

    $item->get_permalink();

    の返値が ameblo.jp ではなくなるので、そのあたりで判別して条件分岐を組み込んでみてはいかがでしょうか。

    トピック投稿者 amachang

    (@amachang)

    t.okuboさん

    早速のご回答ありがとうございましたm(__)m
    ご案内頂いた記事も拝見したのですが、PHPに関しては詳しくなく、条件文をどこにどのように書けばよいかが分からなかった次第です。。

    よろしければ、ご教示頂けないでしょうか?

    それからアメブロの広告除去に関しては、確認してみたいと思います。

    トピック投稿者 amachang

    (@amachang)

    jim912さん

    早速のご回答ありがとうございます。

    なるほど、理解できます。それでいけそうですね!
    ただ私がphpのことが分からず、条件分岐をどこにどのように書けばよいか、
    まったく検討がつかない状態です。。

    お手数ですが、ご指南頂くことはできますでしょうか?

    風邪でダウンしてて連絡遅れました。
    以下、冒頭のコードに条件式を追加してみました。

    <?php
    include_once(ABSPATH . WPINC . '/feed.php');
    $rss = fetch_feed(array(
    'http://feeds.feedburner.com/WebmasterCentral',
    //RSSフィード1
    
    'http://ja.wordpress.org/feed/'
    //RSSフィード2
    ));
    if (!is_wp_error( $rss ) ) :
        $rss->set_cache_duration(1800);
        $rss->init();
        $maxitems = $rss->get_item_quantity(10);
        $rss_items = $rss->get_items(0, $maxitems);
        date_default_timezone_set('Asia/Tokyo');
    endif;
    ?>
    <dl>
        <?php if ($maxitems == 0) echo '<dt>No items.</dt>';
        else
        foreach ( $rss_items as $item ) : ?>
          <?php
            $blog_name    = $item->get_feed()->get_title();
            $article_title = $item->get_title();
            $article_url   = $item->get_permalink();
            $article_date  = $item->get_date("Y-n-j H:i:s");
          ?>
          <?php if(!preg_match("/^PR:/",$article_title)): ?>
          <dt>
            <?php echo $blog_name; ?>
            <br />
            <a href='<?php echo $article_url; ?>' target="_blank"><?php echo $article_title; ?></a>
          </dt>
          <dd>(<?php echo $article_date; ?>)</dd>
          <?php endif; ?>
        <?php endforeach; ?>
    </dl>

    ところどころ変数に置き換えてますが、
    単に可読性を上げただけですのでそれ程意味はありません。
    条件式は、

    <?php if(!preg_match("/^PR:/",$article_title)): ?>
    ~
    <?php endif; ?>

    で囲まれた部分で、これはpreg_match()の戻り値がFALSEだった時、
    つまり記事のタイトルに「PR:」という文字列が含まれていない場合、
    if文で囲まれた中身、

    <dt>
    <?php echo $blog_name; ?>
    <br />
    <a href='<?php echo $article_url; ?>' target="_blank"><?php echo $article_title; ?></a>
    </dt>
    <dd>(<?php echo $article_date; ?>)</dd>

    を出力するようになってます。
    HTMLとごちゃ混ぜになってるのでちょっと分かりにくいかもしれませんが、考え方自体は単純です。

    トピック投稿者 amachang

    (@amachang)

    t.okuboさん

    静養中のご回答、誠にありがとうございます。
    書いて頂いたコードでバッチリでした!!

    関連して恐縮ですが以下についてもご指南頂けましたら幸いです。
    フィードを1件のみ表示させたく、

    $maxitems = $rss->get_item_quantity(1);

    とした場合、アメブロPRがカットされるのみで、空白で出力されてしまいます。
    PRを除いて最新の1件を表示させる場合はどこにどのように条件式を入れればよいのでしょうか?

    今だと「PR:」が含まれない場合は即座に出力しているため、foreachのループを二つ使って(foreachじゃなくてforでもwhileでも良いのですが)HTMLの生成用と出力用の二つのループで対応するのが良いかもしれません。

    既存のforeachのループはHTMLの生成用として使うので、if文で囲まれた中身は以下のように配列変数にパラメータを代入する形に変更します。

    <?php if(!preg_match("/^PR:/",$article_title)): ?>
    <?php $output[] = '<dt>'. $blog_name .'<br /><a href="'. $article_url .'" target="_blank">'. $article_title .'</a></dt><dd>('. $article_date .')</dd>'; ?>
    <?php endif; ?>

    これで一先ず取得したRSSフィードの内、「PR:」が含まれていないもののHTMLコードの配列になるので、あとはこの配列を表示したい件数分だけ表示してやればOKです。
    配列の要素数分のループを回すのにはforeachが簡単なため、以下のような感じで出力用のループを作ります。

    <dl>
    //一個目のループ(HTML生成用)
    ...foreach ( $rss_items as $item ) : ?>
    ~
    <?php endforeach; ?>
    
    //以下新たに追加する二個目のループ(出力用)
    <?php
      $count   = 0;
      $maxview = 1;  //表示件数
    ?>
    <?php foreach( $output as $value ): ?>
      <?php if($count < $maxview); ?>
        <?php
          echo $value;
          $count++;
        ?>
      <?php else: ?>
        <?php break; ?>
      <?php endif; ?>
    <?php endforeach; ?>
    </dl>

    上記のコードで言うと$maxviewの値が表示件数に該当します。get_item_quantity()の値は大本のRSSフィードの取得数のようなので10や20といったパラメータにしておいた方が良いと思います。

    トピック投稿者 amachang

    (@amachang)

    ありがとうございます!たいへん助かっております。
    ご回答を参考に、以下のように書いてみたのですが、エラーが出てしまいました。。書き方が違いますでしょうか?PHPに詳しくないため、お手数をおかけしますm(__)m

    <?php
    include_once(ABSPATH . WPINC . '/feed.php');
    $rss = fetch_feed(array(
    'http://feeds.feedburner.com/WebmasterCentral',
    //RSSフィード1
    
    'http://ja.wordpress.org/feed/'
    //RSSフィード2
    ));
    if (!is_wp_error( $rss ) ) :
        $rss->set_cache_duration(1800);
        $rss->init();
        $maxitems = $rss->get_item_quantity(10);
        $rss_items = $rss->get_items(0, $maxitems);
        date_default_timezone_set('Asia/Tokyo');
    endif;
    ?>
    <dl>
    //一個目のループ(HTML生成用)
    <?php if ($maxitems == 0) echo '<dt>No items.</dt>';
    else
    foreach ( $rss_items as $item ) : ?>
    <?php
        $blog_name    = $item->get_feed()->get_title();
        $article_title = $item->get_title();
        $article_url   = $item->get_permalink();
        $article_date  = $item->get_date("Y-n-j H:i:s");
    ?>
    <?php if(!preg_match("/^PR:/",$article_title)): ?>
    <?php $output[] = '<dt>'. $blog_name .'<br /><a href="'. $article_url .'" target="_blank">'. $article_title .'</a></dt><dd>('. $article_date .')</dd>'; ?>
    <?php endif; ?>
    <?php endforeach; ?>
    //以下新たに追加する二個目のループ(出力用)
    <?php
      $count   = 0;
      $maxview = 1;  //表示件数
    ?>
    <?php foreach( $output as $value ): ?>
      <?php if($count < $maxview); ?>
        <?php
          echo $value;
          $count++;
        ?>
      <?php else: ?>
        <?php break; ?>
      <?php endif; ?>
    <?php endforeach; ?>
    </dl>
8件の返信を表示中 - 1 - 8件目 (全8件中)
  • トピック「関数リファレンス/fetch feedでRSS表示する際にアメブロPRを除く方法」には新たに返信することはできません。