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

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

ただいまの
回答率

87.34%

wordpressのカスタムフィールドで入力したurlでrssを取得し、取得したrssの日付順で表示したい。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,314

score 32

前提・実現したいこと

wordpressのカスタム投稿タイプ(shop)のカスタムフィールドに、rssのurlを入力し複数のrssを日付順に並び替えたい。

カスタム投稿タイプのターム(店舗名)も一緒に出力したい為、投稿に関連付けたワードプレスのカスタムフィールドの値で出力したい。

発生している問題

rssの取得をし、一覧の表示は出来ましたが、rssで取得したブログの投稿順にソート出来ない。

該当のソースコード

<ul>
    <?php
        $args = array(
         'posts_per_page' => 7,
         'paged' => $paged,
         'orderby' => 'post_date',
         'post_type' => 'shop',
         'post_status' => 'publish'
        );
        $the_query = new WP_Query($args);
    ?>
    <?php if ( $the_query->have_posts() ) :?>
        <?php while ( $the_query->have_posts() ) : $the_query->the_post();?>
            <?php
                $bloglist = array();
                get_template_part('feed/rss-one');
                var_dump($bloglist);
            ?>
        <?php endwhile; ?>
    <?php endif; ?>
    <?php wp_reset_postdata(); ?>
</ul>


上記で取得しているrss-oneというテンプレ

<?php
require_once "Feed.php" ; //rss-phpライブラリを読み込みます
$feed = new Feed ;
date_default_timezone_set('Asia/Tokyo');
$txt = get_field('rss');//←カスタムフィールドを取得
if($txt){
    $url = $txt;
    $rss = $feed->loadRss( $url ) ;
    $num = 1;//表示させたい件数
    $i=0;
    $desW = 50;//詳細の文字数を制限します。制限しないときは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');
            }
            ?>
            <?php
                $html = "<li class='rss'>";
                $html .="<p class='post-date'>" . date( 'H:i', $timestamp) . "</p>";
                $html .="<h3><a href=" . $link . "target='_blank'>" . $title . "</a></h3>";
                $html .="<p class='areaname'>";
                $terms = get_the_terms($post->ID,'area');
                foreach( $terms as $term ) {
                    $html .= $term->name;
                };
                $html .="</p>";
                $html .="<p class='shopname'><a href=" . get_permalink($post->ID) .">" . the_title('','',false) . "</a></p>";
                $html .="</li>";
            ?>
            <?php $shopblog = array(
                "text"=>$html,
                "update"=>date( 'YmdHi', $timestamp)
            );
            ?>
        <?php
            $i++;
            $bloglist[]=$shopblog;
        }
    }
}
?>

補足情報

店舗ごとに外部ブログがあり、最新記事を一つだけ表示するようにしてます。
当たり前ですが現在はrssの更新順ではなく、ワードプレスに投稿した記事の日付順になってますので、これをこの形のままrssの更新順にしたいです。

不明点

<?php $shopblog = array(
            "text"=>$html,
            "update"=>date( 'YmdHi', $timestamp)
            );

という部分で$shopblogにテキストデータと、日付を関連付けて格納したのですが、
・新たに変数に格納するのを記述する場所
・ループで出力したこの値を新たに変数に格納する方法
・出力する方法
が不明です。

試した方法

ちなみにkei344さんが添付してくださったリンク先の方法もはじめに試しましたが、

// 取得するフィードのURLを指定
  $urls = array(
    "http://www.lesson5.info/?feed=rss2",
    "http://www.lesson5.info/?feed=rss2",
    "http://www.lesson5.info/?feed=rss2",
    "http://www.lesson5.info/?feed=rss2",
    "http://www.lesson5.info/?feed=rss2",
    "http://www.lesson5.info/?feed=rss2"
  );


これは例ですが、このarrayの中にカスタムフィールドで取得した値をループで格納する方法が分からなかったのと、
カスタム投稿shopのタイトル(店舗名)と、タームを関連付ける方法が分からなかったです。

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

解決しました。

以下最終コード

<ul>
    <?php
        $args = array(
         'posts_per_page' => 7,
         'paged' => $paged,
         'orderby' => 'post_date',
         'post_type' => 'shop',
         'post_status' => 'publish'
        );
        $the_query = new WP_Query($args);
    ?>
    <?PHP if ( $the_query->have_posts() ) :?>
    <?php $bloglist = array(); ?>
        <?php while ( $the_query->have_posts() ) : $the_query->the_post();?>
            <?PHP include locate_template('/feed/rss-one.php'); ?>
        <?php endwhile; ?>
    <?php // 日付でソート
        foreach ((array)$bloglist as $key => $value) {
            $sort[$key] = $value['update'];
        }
        array_multisort($sort, SORT_DESC, $bloglist);
    ?>
    <?php
    for($i = 0 ; $i < count($bloglist); $i++){
            echo $bloglist[$i]['text'] ;
    }
    ?>
    <?php endif; ?>
    <?php wp_reset_postdata(); ?>
</ul>


↓rss-one.php

<?php
require_once "Feed.php" ; //rss-phpライブラリを読み込みます
$feed = new Feed ;
date_default_timezone_set('Asia/Tokyo');
$txt = get_field('rss');//←カスタムフィールドを取得
if($txt){
    $url = $txt;
    $rss = $feed->loadRss( $url ) ;
    $num = 1;//表示させたい件数
    $i=0;
    $desW = 50;//詳細の文字数を制限します。制限しないときは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');
            }
            ?>
            <?php
                $html = "<li class='rss'>";
                $html .="<p class='post-date'>" . date( 'H:i', $timestamp) . "</p>";
                $html .="<h3><a href=" . $link . "target='_blank'>" . $title . "</a></h3>";
                $html .="<p class='areaname'>";
                $terms = get_the_terms($post->ID,'area');
                foreach( $terms as $term ) {
                    $html .= $term->name;
                };
                $html .="</p>";
                $html .="<p class='shopname'><a href=" . get_permalink($post->ID) .">" . the_title('','',false) . "</a></p>";
                $html .="</li>";
            ?>
            <?php $shopblog = array(
                "text"=>$html,
                "update"=>date( 'YmdHi', $timestamp)
            );
            ?>
        <?php
            $i++;
            $bloglist[]=$shopblog;
        }
    }
}
?>

ありがとうございました!

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • kei344

    2017/06/02 00:45

    もしかして質問内容をエディタで作ってコピー&ペースしていませんか?teratail のバグで記述内容が表示されないというものが以前有ったので、ペースト後に何文字か記入してみてください。

    キャンセル

  • thewild

    2017/06/02 00:50

    ありがとうございます。コードはエディタで作ってますが、質問文章はこちらのページで直接入力しています。

    キャンセル

  • thewild

    2017/06/02 00:50

    もう一度修正してみます。

    キャンセル

回答 1

checkベストアンサー

+2

rss-oneで出力せず、配列に入れて処理するか、取得時点で複数RSSをまとめて取得するかすれば出来ると思います。

【「Google Feed API」の代替として「rss-php」でRSSやAtomフィードを取得・表示する – lesson me】
http://www.lesson5.info/?p=392#rss-multi

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/06/02 00:41

    array(0) { } array(0) { } array(0) { }
    という結果になります。
    もう一度質問内容に今の状態を反映させます。

    キャンセル

  • 2017/06/02 01:08

    私がちょっと勘違いしていました。

    $bloglist = array(); をwhileの前に、var_dump($bloglist); をendwhile;の後に変更、
    get_template_part('feed/rss-one'); を include locate_template( 'feed/rss-one.php' ); に変更してみてください。

    【get_template_part()に変数を渡して参照したい時の対策 | WWW開発ブログ | WWWクリエイターズ】
    http://www-creators.com/archives/465

    キャンセル

  • 2017/06/02 02:26

    解決しました!
    本当にありがとうございました。
    思っていた挙動になり大変助かりました。

    キャンセル

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

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

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

  • トップ
  • PHPに関する質問
  • wordpressのカスタムフィールドで入力したurlでrssを取得し、取得したrssの日付順で表示したい。