何ができるか
複数の外部ブログの最新記事を取得し、更新日でソートして降順に並べられる
背景
カテゴリが異なるサイトの更新情報を、それぞれのWordPress 記事として投稿している。大本のサイトでは、全情報を表示できるようにしたい。なおかつ、時系列でソートしたい。
技術情報
- jQuery の$.getJSON(url, function(results){…}) で各店のWordPress ブログ記事を取得
- getJSON()は非同期通信なので、データ取得後にHTML の描写を行うようにする
- 取得したJSON データで必要なものをallArticles.push() で格納
- 配列”allArticles” にオブジェクトを追加している
- 全データ取得後、underscore.js を使い、allArticles をsortBy() で時系列降順にソート
- 各店のJSON 読み込みにばらつきがあるので、setTimeout() で2秒の待機時間を付けている
- allArticles をHTML として書き出す
配列を指定した項目でソートする
事前準備
jquery および、underscore.js を事前に読み込んでおく
1 2 |
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> <script type="text/javascript" src="/js/underscore.js"></script> |
underscore.js のsortBy() を使って、数字を降順に並べる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
var obj =[ { title: '悪魔城ドラキュラ', year: 1994, author: "Michiru Yamane" }, { title: 'FF5', year: 1992, author: "Nobuo Uematsu" }, { title: 'FF4', year: 1991, author: "Nobuo Uematsu" }, { title: 'FF6', year: 1992, author: "Nobuo Uematsu" } ]; var func = function(obj) { return -obj.year; } var re = _.sortBy(obj, func); console.log(re); |
出力結果
1 2 3 4 |
0: Object { title: "悪魔城ドラキュラ", year: 1994, author: "Michiru Yamane" } 1: Object { title: "FF5", year: 1992, author: "Nobuo Uematsu" } 2: Object { title: "FF6", year: 1992, author: "Nobuo Uematsu" } 3: Object { title: "FF4", year: 1991, author: "Nobuo Uematsu" } |
year を比較して、降順に並び変わった
JavaScript で、複数の外部WordPress の最新記事を取得し、更新日でソートして降順に並べる
HTML
1 |
<div class="p-article__main"></div> |
JavaScript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> <script type="text/javascript" src="/js/underscore.js"></script> <script type="text/javascript"> jQuery( function () { /* 記事のオブジェクト グローバル変数 */ allArticles = []; /* 各ブログのJSONを指定。URL に"_embed"で写真データを要求、"per_page=3" で記事を3つ取得*/ /* 1番目のWordPress 記事を取得 */ getBlogInfo("http://www.sakuranomichi.jp/wordpress/wp-json/wp/v2/posts?_embed&per_page=2", "リボン日記2記事"); /* 2番目のWordPress 記事を取得して書き出し(複数ないので、同じブログを流用) */ getBlogInfo("http://www.sakuranomichi.jp/wordpress/wp-json/wp/v2/posts?_embed&per_page=4", "リボン日記4記事", true); /* JSON を取得して、ブログ最新記事を変数に格納 */ function getBlogInfo(url, blog_name, display_b) { /* 各WordPress のJSON を読み込んで、記事を表示する*/ jQuery.getJSON( url, function(results) { /* 取得した記事をオブジェクトに格納する */ jQuery.each(results, function(i, item) { var date_data = new Date(item.date); /* 記事の日付を取得 */ var year = date_data.getFullYear(); var month = date_data.getMonth() + 1; var day = date_data.getDate(); var title = item.title.rendered; /* 記事タイトル */ var link = item.link; /* 記事URL */ var date = year + '年' + month + '月' + day + '日'; /* 表示用日付 */ var datetime = year + '-'+ addzero(month) + '-' + addzero(day); /* time タグのdatetime 値用日付 */ var datenum = Number(year + addzero(month) + addzero(day)); /* ソート用の日付を数値で取得 */ /* 記事アイキャッチ画像の取得*/ var thum if (item._embedded["wp:featuredmedia"]) { thum = item._embedded["wp:featuredmedia"][0].media_details.sizes.thumbnail.source_url } else { thum = "/images/basic/logo.jpg"; /* 代替画像 */ } addData = { title: title, link: link, thum: thum, datetime: datetime, datenum: datenum, date : date, name : blog_name } allArticles.push(addData); }); /* ブログデータを非同期で最後まで取得したら、記事を表示する */ if (display_b) { /* 2秒の遅延動作で、各店のJSON 読み込み時間差をなくす*/ setTimeout(function(){ /* allArticles の参照が早いと、ブログの読み込みが間に合わない時がある */ /* 日付でソート */ allArticles = _.chain(allArticles).sortBy( function(item) { return -item.datenum;}).value(); showBlogInfo(); /* 記事データを作成 */ }, 2000); } }); } function showBlogInfo() { /* 記事データを作成 */ var article = ""; /* 配列から、日付でソートされた記事データを順に取り出す */ for (var ij in allArticles) { article += '<div><a href="'+ allArticles[ij].link + '" target="_blank">' + '<div><img src="' + allArticles[ij].thum + '" alt="' + allArticles[ij].title + '"></div>' + '<p><time datetime="' + allArticles[ij].datetime + '">' + allArticles[ij].date + '</time></p>' + '<p">' + allArticles[ij].title + '</p>' + '<p>' + allArticles[ij].name + '</p></a></div>'; } /* 記事をまとめて表示 */ /* 記事の書き出し */ jQuery(".p-article__main").append(article); } //数値が一桁だとゼロを足す function addzero(num) { if (num < 10) { num = "0" + String(num); } else { num = String(num); } return num; } } ); </script> |
解説
- getBlogInfo() で指定されたWordPress のJSON を取得して、ブログ最新記事を変数に格納
- showBlogInfo() で記事をHTML に書きだす
- 取得した記事をソートするとき、配列”allArticles”が空だった時が一番作業が煮詰まった。
jQuery.getJSON() が非同期通信するため、読み込みが終わっていないタイミングで配列を参照していたのが原因だった。 - 取得した記事のソートはこの部分。”-item.datenum” のマイナスを記載すると、降順になる。
1 |
allArticles = _.chain(allArticles).sortBy( function(item) { return -item.datenum;}).value(); |
参考
sortBy()
http://www.elder-flower.com/blog/2015/04/sortby.html
sortBy() の使い方