WPの記事をJSONで返しそれをAjaxで取得してHandlebars.jsで処理する

このブログの情報を別サイトで表示するのに、タイトルのような事をしたいなと思いました。昔、普通に記事をwhileで回しつつthe_post()した後にJSON形式に出力してたけど面倒なので、もっと楽な方法は無いかと調べると、WPでJSONの出力は、

という2通りの方法が良くでてきます。

プラグインを増やしすぎるのもあれなので、後者の方法で作成することにしました。
サムネイルも使いたかったので、元記事のコードに、サムネイルの画像パス付与の処理も追加しています。

<?php
/*
Template Name: API Page
*/

$args = array(
  'numberposts' => 9,
  'orderby'     => 'post_date',
  'order'       => 'DESC',
);
$posts = get_posts($args);

if($posts): foreach($posts as $post):
	// サムネイルがある時は、記事データにサムネイル画像のURLを追加する
	if(has_post_thumbnail()) {
		$image_id = get_post_thumbnail_id($post->ID);
		$image_url = wp_get_attachment_image_src($image_id, true);
		$post->thumb = $image_url;
	}
	setup_postdata($post);
	$json[] = $post;
endforeach; endif;

header("Content-Type: application/json; charset=utf-8");
echo json_encode($json);

固定ページ(ここでは、/blog/api/というURLの固定ページ)を作成して、JSONが取得できるようになったら、別サイト側から、jQueryの$.ajaxで取得して、それをhandlebars.jsに渡します。今回は、同じドメイン内のサイトだったので良いですが、別ドメインとかだと、JSONPにしないと読み込めないかもしれません。

$.ajax({
	type: "GET",
	url: "/blog/api/",
	dataType:'json'
}).done(function(data) {
	var templateData = {
		results : data
	};
	// テンプレート元を取得
	var source = $("#template-blog").html();
	// テンプレート元をコンパイル
	var template = Handlebars.compile(source);
	// コンパイルしたテンプレートにデータを入力
	var html = template(templateData);
	// 出来上がったHTMLを該当箇所に追加
	$("#blog-list-template").html(html);
}).fail(function(data) {
	console.error("failed to get json");
});

ajaxで取得したdataをresultsをキーにしてtemplateDataに追加しているのは、dataが配列(Array)なのでテンプレート内で{{#each }}を回すのに良い値の渡し方が分からなかったからです(良い方法があればご教授頂きたいところです!)。以下がテンプレート元ですが、{{#each results}}とすることで、ループが使えます。

<script type="text/x-handlebars-template" id="template-blog">
	{{#each results}}
	<a href="{{guid}}" data-type="" data="" target="_blank">
		<div style="background-image: url(thumb.[0]);"></div>
		<div>
			<p class="title">{{post_title}}</p>
			<p class="description">{{post_content}}</p>
		</div>
	</a>
	{{/each}}
</script>

これでWPの記事データを取得して、handlebars.jsで表示できるようになりました。

現場でかならず使われているWordPressデザインのメソッド[アップデート版]
エムディエヌコーポレーション(MdN) (2016-09-02)
売り上げランキング: 60,019
funnydreamer
栃木生まれのミドルエイジ。フロントエンドとデザインの領域におりましたが、最近はマーケティングやライティングにPythonによる自動化など何でも屋になってきました。趣味は、ゲーム、アニメ、自転車(ポタリング)、カフェ巡り、お絵描きと自称多趣味。ケーキはショートケーキが好物。

ADD COMMENT

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください