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

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

新規登録して質問してみよう
ただいま回答率
85.48%
WordPress

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

PHP

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

Q&A

解決済

1回答

3132閲覧

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

thewild

総合スコア32

WordPress

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

PHP

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

0グッド

0クリップ

投稿2017/05/31 07:42

編集2017/06/01 17:24

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

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

###発生している問題

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

###該当のソースコード

php

1<ul> 2 <?php 3 $args = array( 4 'posts_per_page' => 7, 5 'paged' => $paged, 6 'orderby' => 'post_date', 7 'post_type' => 'shop', 8 'post_status' => 'publish' 9 ); 10 $the_query = new WP_Query($args); 11 ?> 12 <?php if ( $the_query->have_posts() ) :?> 13 <?php while ( $the_query->have_posts() ) : $the_query->the_post();?> 14 <?php 15 $bloglist = array(); 16 get_template_part('feed/rss-one'); 17 var_dump($bloglist); 18 ?> 19 <?php endwhile; ?> 20 <?php endif; ?> 21 <?php wp_reset_postdata(); ?> 22</ul>

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

php

1<?php 2require_once "Feed.php" ; //rss-phpライブラリを読み込みます 3$feed = new Feed ; 4date_default_timezone_set('Asia/Tokyo'); 5$txt = get_field('rss');//←カスタムフィールドを取得 6if($txt){ 7 $url = $txt; 8 $rss = $feed->loadRss( $url ) ; 9 $num = 1;//表示させたい件数 10 $i=0; 11 $desW = 50;//詳細の文字数を制限します。制限しないときは0にします。 12 if ( $desW != 0){ 13 $desW = ($desW*2)+2; 14 } 15 foreach( $rss->item as $item ) 16 { 17 if($i>=$num){ 18 } 19 else{ 20 $title = $item->title ; // タイトル 21 $link = $item->link ; // リンク 22 $timestamp = strtotime( $item->pubDate ) ; // 更新日時 23 $description = $item->description ; // 詳細 24 $description = str_replace("▼続きを読む","",$description); 25 //↑ 続きを読むなど、決まった文章が詳細にはいっている場合に、それを除外する 26 $description = strip_tags($description); 27 if ( $desW != 0){ 28 $description = mb_strimwidth($description, 0, $desW, "…",'utf-8'); 29 } 30 ?> 31 <?php 32 $html = "<li class='rss'>"; 33 $html .="<p class='post-date'>" . date( 'H:i', $timestamp) . "</p>"; 34 $html .="<h3><a href=" . $link . "target='_blank'>" . $title . "</a></h3>"; 35 $html .="<p class='areaname'>"; 36 $terms = get_the_terms($post->ID,'area'); 37 foreach( $terms as $term ) { 38 $html .= $term->name; 39 }; 40 $html .="</p>"; 41 $html .="<p class='shopname'><a href=" . get_permalink($post->ID) .">" . the_title('','',false) . "</a></p>"; 42 $html .="</li>"; 43 ?> 44 <?php $shopblog = array( 45 "text"=>$html, 46 "update"=>date( 'YmdHi', $timestamp) 47 ); 48 ?> 49 <?php 50 $i++; 51 $bloglist[]=$shopblog; 52 } 53 } 54} 55?> 56

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

###不明点

php

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

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

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

php

1// 取得するフィードのURLを指定 2 $urls = array( 3 "http://www.lesson5.info/?feed=rss2", 4 "http://www.lesson5.info/?feed=rss2", 5 "http://www.lesson5.info/?feed=rss2", 6 "http://www.lesson5.info/?feed=rss2", 7 "http://www.lesson5.info/?feed=rss2", 8 "http://www.lesson5.info/?feed=rss2" 9 );

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

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

###解決しました。

以下最終コード

php

1<ul> 2 <?php 3 $args = array( 4 'posts_per_page' => 7, 5 'paged' => $paged, 6 'orderby' => 'post_date', 7 'post_type' => 'shop', 8 'post_status' => 'publish' 9 ); 10 $the_query = new WP_Query($args); 11 ?> 12 <?PHP if ( $the_query->have_posts() ) :?> 13 <?php $bloglist = array(); ?> 14 <?php while ( $the_query->have_posts() ) : $the_query->the_post();?> 15 <?PHP include locate_template('/feed/rss-one.php'); ?> 16 <?php endwhile; ?> 17 <?php // 日付でソート 18 foreach ((array)$bloglist as $key => $value) { 19 $sort[$key] = $value['update']; 20 } 21 array_multisort($sort, SORT_DESC, $bloglist); 22 ?> 23 <?php 24 for($i = 0 ; $i < count($bloglist); $i++){ 25 echo $bloglist[$i]['text'] ; 26 } 27 ?> 28 <?php endif; ?> 29 <?php wp_reset_postdata(); ?> 30</ul>

↓rss-one.php

php

1<?php 2require_once "Feed.php" ; //rss-phpライブラリを読み込みます 3$feed = new Feed ; 4date_default_timezone_set('Asia/Tokyo'); 5$txt = get_field('rss');//←カスタムフィールドを取得 6if($txt){ 7 $url = $txt; 8 $rss = $feed->loadRss( $url ) ; 9 $num = 1;//表示させたい件数 10 $i=0; 11 $desW = 50;//詳細の文字数を制限します。制限しないときは0にします。 12 if ( $desW != 0){ 13 $desW = ($desW*2)+2; 14 } 15 foreach( $rss->item as $item ) 16 { 17 if($i>=$num){ 18 } 19 else{ 20 $title = $item->title ; // タイトル 21 $link = $item->link ; // リンク 22 $timestamp = strtotime( $item->pubDate ) ; // 更新日時 23 $description = $item->description ; // 詳細 24 $description = str_replace("▼続きを読む","",$description); 25 //↑ 続きを読むなど、決まった文章が詳細にはいっている場合に、それを除外する 26 $description = strip_tags($description); 27 if ( $desW != 0){ 28 $description = mb_strimwidth($description, 0, $desW, "…",'utf-8'); 29 } 30 ?> 31 <?php 32 $html = "<li class='rss'>"; 33 $html .="<p class='post-date'>" . date( 'H:i', $timestamp) . "</p>"; 34 $html .="<h3><a href=" . $link . "target='_blank'>" . $title . "</a></h3>"; 35 $html .="<p class='areaname'>"; 36 $terms = get_the_terms($post->ID,'area'); 37 foreach( $terms as $term ) { 38 $html .= $term->name; 39 }; 40 $html .="</p>"; 41 $html .="<p class='shopname'><a href=" . get_permalink($post->ID) .">" . the_title('','',false) . "</a></p>"; 42 $html .="</li>"; 43 ?> 44 <?php $shopblog = array( 45 "text"=>$html, 46 "update"=>date( 'YmdHi', $timestamp) 47 ); 48 ?> 49 <?php 50 $i++; 51 $bloglist[]=$shopblog; 52 } 53 } 54} 55?> 56

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kei344

2017/06/01 15:45

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

2017/06/01 15:50

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

2017/06/01 15:50

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

回答1

0

ベストアンサー

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

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

投稿2017/05/31 07:58

kei344

総合スコア69407

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thewild

2017/05/31 08:17

回答ありがとうございます! すみません。 そのやり方ですと、取得したrssに対して投稿のタイトル(店舗名)とタームを関連付けられなくて、、 何か方法はありますでしょうか。
kei344

2017/05/31 08:23

配列に入れて処理する方法であれば、一緒にタイトルとかタームを入れてしまえば出来ると思いますよ。 出力しているHTML部分をそのまま変数に入れて、ソート基準にする日付を、array(テキスト部分の入った変数, ソート基準になる日付) みたいにしてそれを全体の配列に入れて、最後にソートして出力すればよいと思います。
thewild

2017/05/31 10:56

<?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 $shopblogs = array( $html,date( 'H:i', $timestamp) );?> 配列に入れるというのはこのような形でよろしいでしょうか?
kei344

2017/05/31 10:59

そうですね、そのあとは $shopblogs を「全体の配列」に入れてソートすればよいと思います。
thewild

2017/05/31 14:01

すみません。 全体の配列に入れるところで詰まってます。 現在rss-oneの中で $shopblogs =$shopblog; $shopblogs =array_merge($shopblogs,$shopblog); という風に入れようとしてるのですが、 var_dump してみてみると テキスト要素と日付の2つの配列が複数出るだけでうまくいきません。 全体のコードを記載します。 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++; $shopblogs =$shopblog; $shopblogs =array_merge($shopblogs,$shopblog); var_dump($shopblogs); } } } ?> 全体の配列に入れてソートし出力までまだまだ遠そうです。。
thewild

2017/05/31 14:04 編集

ソート自体は // 多次元連想配列を変数に格納 $members = array( array('id'=>3,'name'=>'nagasawa'), array('id'=>1,'name'=>'kitagawa'), array('id'=>2,'name'=>'tanaka') ); // foreachで1つずつ値を取り出す foreach ($members as $key => $value) { $id[$key] = $value['id']; } // array_multisortで'id'の列を昇順に並び替える array_multisort($id, SORT_ASC, $members); // ソート済みの変数を出力 print_r($members); こういうので出来そうなのですが、、。
kei344

2017/05/31 14:45

コメントエリアではマークダウンが使えないため、コードはここではなく質問文に追記してください。
thewild

2017/05/31 18:46

失礼しました。かしこまりました。
kei344

2017/06/01 04:48

$bloglist = array(); は下記場所では。 <?PHP $bloglist = array(); get_template_part('feed/rss-one'); var_dump($bloglist); ?>
thewild

2017/06/01 15:41

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

2017/06/01 16: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
thewild

2017/06/01 17:26

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問