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

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

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

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

PHP

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

Q&A

解決済

1回答

2268閲覧

wordpressの記事とアメブロの記事を連携させて日付順にしたいです。

ssk

総合スコア332

RSS

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

PHP

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

0グッド

1クリップ

投稿2016/02/21 11:25

編集2016/02/21 15:13

【やりたいこと】
アメブロの記事更新をwordpressで作っているサイトのアーカイブページに表示

【困っていること】
アメブロとwordpressの記事の日付から最新の記事7件を表示すること

※現状
Wordpress記事
Wordpress記事
Wordpress記事
Wordpress記事
アメブロ記事
アメブロ記事
アメブロ記事

※理想(日付順で表示)
Wordpress記事
アメブロ記事
Wordpress記事
Wordpress記事
アメブロ記事
アメブロ記事
Wordpress記事

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
まずは両方の日付を配列にして、、、と考えていたのですができそうにありません。。
どのように実装したらよいでしょうか。ご教授下さい。

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

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

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

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

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

takotakot

2016/02/22 00:08

・アメブロからは、どう記事を持ってきているか(RSS?) ・今は何を尺度に並び替えているか 等を書いて頂けたら良いなと思います。
ssk

2016/02/22 04:16

アメブロはRSSで持ってきています。 今は並べ替えができていない状態です。
guest

回答1

0

ベストアンサー

PHP でプログラミングする必要がありますね。

  1. while ループで処理するとよいでしょう
  2. wordpress 側の最新記事と、feed 側の最新記事の時刻を比較します。新しい方を出力します。

the_time("Y.m.j") と $item->get_date('Y.m.d') とを比較することになるでしょう。
0. どちらかがなくなれば、もう片方をすべて出力します。

ループを一つにし、the_post();$item->get_title() か、どちらかを用いるイメージですね。

時間がないので、概要だけ…

PHP

1<?php 2include_once(ABSPATH . WPINC . '/feed.php'); 3 4$display_posts_count = 20; 5$get_posts_count = 40; 6 7query_posts('post_type=post&paged='.$paged); 8 9$ameblo_feed = fetch_feed(array( 10'http://feedblog.ameba.jp/rss/ameblo/', // feed1 11// feed2'http://rssblog.ameba.jp/AmebloID/rss20.xml', 12// feed3'http://rssblog.ameba.jp/AmebloID/rss20.xml' 13)); 14 15$counter = 0; 16if (!is_wp_error( $ameblo_feed ) ) : 17$maxitems = $ameblo_feed->get_item_quantity($get_posts_count); 18$feed_items = $ameblo_feed->get_items(0, $maxitems); 19endif; 20 21// ここからメイン 22$post_next = TRUE; 23$have_posts_checked = have_posts(); 24while(TRUE) { 25 if($have_posts_checked) { 26 if($post_next) { 27 the_post(); 28 $post_next = FALSE; 29 $have_posts_checked = have_posts(); 30 } 31 if($counter >= count($feed_items) || strcmp(get_the_date('Ymd'), $feed_items[$counter]->get_date('Ymd')) > 0) { 32 the_time('Y.m.d'); 33 the_title(); 34 echo '<br>'; 35 $post_next = TRUE; 36 continue; 37 } 38 } 39 if($counter < count($feed_items)) { 40 printf('<span class="date">%s</span>%s<br />', $feed_items[$counter]->get_date('Y.m.d'), $feed_items[$counter]->get_title()); 41 ++$counter; 42 }else{ 43 break; 44 } 45} 46?>

記事一覧をソート(並び替え)する
WordPressで思った通りの順番で記事をソート
カスタムフィールドで並び替え
にあるように、query_posts 等で取得する際に、orderorderby を与えると、並び替えができます。記事取得方法によりますので、ここまでしか回答できません。

投稿2016/02/22 04:33

編集2016/02/22 14:14
takotakot

総合スコア1111

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

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

ssk

2016/02/22 04:56

ありがとうございます。 記事の取得方法はRSSなのですが、可能なのでしょうか?? ※理想(日付順で表示) Wordpress記事 アメブロ記事 Wordpress記事 Wordpress記事 アメブロ記事 アメブロ記事 Wordpress記事 ↑このような形で出力したいのですが><
takotakot

2016/02/22 05:05

現在どう記事を表示させているかによるので、何とも言えません。どう記事を表示させようとしていますか? http://otarunet.com/it/wordpress-rss-plugin/ こういうプラグインで取ってくれば、時刻設定ができる気がするのですが…
ssk

2016/02/22 05:09

残骸ですが、このような形で記事を表示させています。 今は日付のみを出力するようにしています。 <?php query_posts('post_type=post&paged='.$paged); ?> <?php if (have_posts()) : ?> <?php while (have_posts()) : the_post(); ?> <?php the_time("Y.m.j") ?> <?php endwhile; ?> <?php endif; ?> <?php include_once(ABSPATH . WPINC . '/feed.php'); $display_posts_count = 20; $get_posts_count = 40; $ameblo_feed = fetch_feed(array( 'http://feedblog.ameba.jp/rss/ameblo/', // feed1 // feed2'http://rssblog.ameba.jp/AmebloID/rss20.xml', // feed3'http://rssblog.ameba.jp/AmebloID/rss20.xml' )); $counter = 0; if (!is_wp_error( $ameblo_feed ) ) : $maxitems = $ameblo_feed->get_item_quantity($get_posts_count); $feed_items = $ameblo_feed->get_items(0, $maxitems); endif; ?> <ul> <?php if ( $feed_items == 0 ) echo '<li>新しい記事はありません</li>'; else foreach ( $feed_items as $item ) : if( !preg_match('/^PR:/', $item->get_title() ) && $counter < $display_posts_count ): ?> <span class="date"><?php echo $item->get_date('Y.m.d'); ?></span><br /> <?php $counter++; endif; endforeach; ?> </ul>
ssk

2016/02/22 05:11

今後のためにできればプラグインなしで実装できれば幸いです。
ssk

2016/02/22 05:21

query_posts 等で取得する際に、order や orderby を与えると、並び替えができます。 という回答では不測でしたか?すみません… ↑こちらは理解できるのですが、どうやってアメブロの記事の日付とWordpressの記事の日付を新着順に出力するのかがわからないです。。
ssk

2016/02/22 05:22

query_posts 等で取得する際に、order や orderby を与えると、並び替えができます。 ↑Wordpress内の記事のみ表示順を変更する仕組みしか思いつかず、、、
takotakot

2016/02/22 05:23

feed は直でもってきているのですね。失礼しました。その点は質問に書かないと、回答者は分かりません。 追記されると、他の回答者も回答しやすいと思います。回答編集しましたのでご確認下さい。
ssk

2016/02/22 05:27

申し訳ございませんでした。 たしかに、情報が不十分ですね、、>< 回答ありがとうございます。 PHP初学者でして、恐縮ですができれば参考プログラムを記述していただけませんか? 1と2については理解できるのですが、それを3にする際にどのように書いたら良いのか分からないです。
ssk

2016/02/22 07:34 編集

プログラミングありがとうございます。助かります>< 試してみたのですが、以下のエラーが出てしまいました。 get_date()がないということですかね? Fatal error: Call to a member function get_date() on a non-object in blog.php on line 247
takotakot

2016/02/22 07:41

foreach ではなくしたので、$item-> は $feed_items[$counter]-> としないといけませんでした。
ssk

2016/02/22 07:59

ありがとうございます。 このような日付が取れましたが動作は正しいでしょうか? 2015.04.272015.04.252015.04.252015.04.242015.04.232015.04.232015.04.232016.02.20 2015.04.272015.04.252015.04.252015.04.242015.04.232015.04.232015.04.232016.02.17 2015.04.272015.04.252015.04.252015.04.242015.04.232015.04.232015.04.232016.02.16 2015.04.272015.04.252015.04.252015.04.242015.04.232015.04.232015.04.232016.02.15 2015.04.272015.04.252015.04.252015.04.242015.04.232015.04.232015.04.232016.02.14 2015.04.272015.04.252015.04.252015.04.242015.04.232015.04.232015.04.232016.02.12 2015.04.272015.04.252015.04.252015.04.242015.04.232015.04.232015.04.232016.02.11 2016.02.08 2016.02.07 2016.02.06 2015.04.272015.04.252015.04.252015.04.242015.04.232015.04.232015.04.23
takotakot

2016/02/22 08:08

うーん…あとは、「get_the_date() > $feed_items[$counter]->get_date()」の部分に'Ymj'を入れてみるくらいでしょうか。手元で実行できませんので、概念的なことをお伝えすることしかできません。すみません。
ssk

2016/02/22 08:28

while(true) { if(have_posts()) { if($counter >= count($feed_items) || get_the_date() > $feed_items[$counter]->get_date('Y.m.d')) { the_post(); the_content(); the_time("Y.m.j"); continue; } } if($counter < count($feed_items)) { printf('<span class="date">%s</span><br />', $feed_items[$counter]->get_date('Y.m.d')); ++$counter; }else{ break; } にしたところ、以下のように出力されるようになりました。 テキストの部分はwordpress側の記事にタイトルです。 日付順にはなっていないようです、、>< 2016.02.20 2016.02.17 2016.02.16 2016.02.15 2016.02.14 2016.02.12 2016.02.11 2016.02.08 2016.02.07 2016.02.06 テキストテキストテキストテキストテキストテキストテキストテキスト 2015.04.27 テキストテキストテキストテキストテキストテキスト 2015.04.25 テキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト
takotakot

2016/02/22 08:29

get_the_date() の方も変えないとだめですね。
takotakot

2016/02/22 08:31

あとは get_the_time を試すとか、細かい調整だけでいけると思うのですが…
ssk

2016/02/22 08:33

while(true) { if(have_posts()) { if($counter >= count($feed_items) || get_the_date('Y.m.d') > $feed_items[$counter]->get_date('Y.m.d')) { the_post(); the_excerpt('続きを読む'); the_time("Y.m.j"); continue; } } if($counter < count($feed_items)) { printf('<span class="date">%s</span><br />', $feed_items[$counter]->get_date('Y.m.d')); ++$counter; }else{ break; } } のようにしたのですが、出力結果は一緒でした、、
takotakot

2016/02/22 08:41

あー、私のミスです。the_post は先に実行しないといけないですね…ちょっと書き換えますね
takotakot

2016/02/22 08:44

日付順でないのは、どういう感じですか?
ssk

2016/02/22 08:50

反映してみたのですが、このような表示になりました。 2016.02.06 テキストテキストテキストテキストテキストテキストテキストテキスト 2015.04.27 テキストテキストテキストテキストテキストテキスト 2015.04.25 テキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト 2016.02.20 2016.02.17 2016.02.16 2016.02.15 2016.02.14 2016.02.12 2016.02.11 2016.02.08 2016.02.07 日付順でないのは、どういう感じですか? ↑アメブロの記事とwordpressの記事を日付順に表示したいのです>< ※理想 2016.02.06 wordpress記事タイトルwordpress記事タイトル 2015.04.27 アメブロ記事タイトル 2015.04.25 アメブロ記事タイトル 2016.02.20 wordpress記事タイトルwordpress記事タイトル のような出力がしたいです。 伝わりますか?><
takotakot

2016/02/22 08:57

分かりました。if 文が効いていないですね 自分ならループ冒頭で、 echo get_the_date('Y.m.d') . ' vs ' . $feed_items[$counter]->get_date('Y.m.d') . '<br>'; とやってデバッグするのですが…日付比較は strcmp(get_the_date('Y.m.d'), $feed_items[$counter]->get_date('Y.m.d')) < 0 とすべきなのかもしれません。
ssk

2016/02/22 09:01

while(true) { if(have_posts()) { if($post_next) { the_post(); $post_next = FALSE; } if($counter >= count($feed_items) || strcmp(get_the_date('Y.m.d'), $feed_items[$counter]->get_date('Y.m.d')) < 0) { the_post(); the_excerpt('続きを読む'); the_time("Y.m.j"); $post_next = TRUE; continue; } } if($counter < count($feed_items)) { printf('<span class="date">%s</span><br />', $feed_items[$counter]->get_date('Y.m.d')); ++$counter; }else{ break; } } こういうことでしょうか??
takotakot

2016/02/22 09:03

そんな感じです!
ssk

2016/02/22 09:04

2016.02.06 テキストテキストテキストテキストテキストテキストテキストテキスト 2015.04.27 テキストテキストテキストテキストテキストテキスト 2015.04.25 テキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト 2016.02.20 2016.02.17 2016.02.16 2016.02.15 2016.02.14 2016.02.12 2016.02.11 2016.02.08 2016.02.07 の表示は変わりませんでした、、><
takotakot

2016/02/22 09:11

うーん…手元に自由にできる WordPress がないのです、すみません。 have_posts の直後に echo get_the_date('Ymd') . ' vs ' . $feed_items[$counter]->get_date('Ymd') . '<br>'; とやって、この日付がそれぞれ正しければ、ちゃんと比較されるはずなのですが…WP 触れる環境になってテストしたらコメントします。ごめんなさい。
takotakot

2016/02/22 14:16

一応手元で動かしてみました。
ssk

2016/02/22 16:06

度々、申し訳ございません。 echo get_the_date('Ymd') . ' vs ' . $feed_items[$counter]->get_date('Ymd') . '<br>'; を入れると 20150423 vs 20160220と表示されています。 ただ、どうしても wordpress記事 wordpress記事 wordpress記事 アメブロ記事 アメブロ記事 アメブロ記事 アメブロ記事 になってしまいます><
ssk

2016/02/22 16:16

あと、比較されているアメブロ記事の日付が全て 20150423 vs 20160220 20150425 vs 20160220 20150423 vs 20160220 20150423 vs 20160220 と、20160220と比較されています><
takotakot

2016/02/22 16:40

1. 私の回答、書き換えています。 2. 20150423 が wordpress 記事の日付ではありませんか?
ssk

2016/02/22 16:53

できました!!!! takotakot様、長い時間本当にありがとうございます、、 プログラミングを見て、なんとなくしか理解できないのですが、どうして動いたのか後学のために教えていただけませんか?
takotakot

2016/02/22 16:59

プログラムを見て頂くのが一番ですが… if($counter >= count($feed_items) || strcmp(get_the_date('Ymd'), $feed_items[$counter]->get_date('Ymd')) > 0) ・では feed 記事がない場合若しくは ・ワードプレス記事の方が新しい場合 を判定し、その後、ワードプレス記事を出力しています。 それ以外の場合は feed 記事を出力させています。この日付比較について、実行環境がなかったため手間取りました。 後は、wordpress 記事、feed 記事それぞれについて、1つ出力した後はその次の記事の日付を確認しに行くようにしたものです。
ssk

2016/02/22 17:13

最後まで本当にありがとうございます。 助かりました><
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問