FrontendWeb Component

PolymerでWP-APIのjsonから記事データを表示させる覚書

PolymerとWP-APIを使って、WordPressの記事一覧をPHPなしに表示させてみた時の覚書。コアエレメント「core-ajax」とスクリプトを数行追加して調整させています。

広告ここから
広告ここまで

CSS nite in Kyoto vol.3で「Polymerはjsonを取り扱うのが得意」と聞いて早速挑戦。

ようやく記事一覧のデータを表示させることに成功したので、忘れないように覚書としてまとめました。

1:ajax通信はコアファイルで行う

Polymerでは「core-ajax」という「コア要素」を使用することで、簡単にAjax通信が可能となります。

Polymer core elements – core-ajax

Ajax通信を行いたいテンプレートで、
[html]
<core-ajax
auto
url="https://gdata.youtube.com/feeds/api/videos/"
params='{"alt":"json", "q":"chrome"}’
handleAs="json"
on-core-response="{{handleResponse}}"></core-ajax>
[/html]

のように記述して使用します。

core-ajaxを使用する際には、以下のようにcore-ajaxのコンポーネントをimportする必要があります。
[html]
<link rel="import" href="../../bower_components/core-ajax/core-ajax.html">
[/html]

core-ajaxの中身

使ってみた感覚として、

  • URLに通信先URLを指定
  • paramに送信するクエリパラメータを設定
  • handleAsで受信する形式を設定
  • autoを設定すると、URL属性が変更された場合に自動でXHRを実行する(らしい)
  • responseで返り値を設定

というイメージです。

core-ajaxで取得したデータは、そのテンプレート内であれば変数的に扱える様子です。

2:記事の取り出し方はSmartyっぽい

Smartyなどのフレームワークで使用するTemplateや、Angular.js的な感覚で取得したものを扱うことができます。

{{handleResponse.title}}で記事タイトルを、{{handleResponse.content}}でコンテンツを取得するというイメージです。

3:リピート処理はtemplateで

ループ処理はrepeat=””という属性をtemplateタグに記述して使用します。

[html]
<template repeat="{{ent in handleResponse}}">
この中がループされる
</template>
[/html]

PHPのforeachと逆向きに記述することになるので要注意です。

・foreach ($handleResponse as $ent){}
・repeat=”{{ent in handleResponse}}”

4:デフォルトではHTMLがエスケープされるから要注意

デフォルトではエスケープされる仕様になっているので、contentを取得するとHTMLタグがそのまま表示されてしまいます。

I’m trying to render HTML using data-binding but Polymer escapes the content.
Polymer does not stamp unescaped HTML via data-binding because it becomes a vulnerability for XSS attacks. Instead, you can use a property changed watcher and automatic node finding to set the .innerHTML of an node:

FAQ – Polymer

XSS対策だから、必要に応じて解除してくださいなということでしょうか。

5:HTML表示用のテンプレートを作るとマジ便利

StackOverflowにも似たことを質問されている方がおり、まさに欲しかったコードも回答にありました。

javascript – How to inject HTML into a template with polymer – Stack Overflow

[html]
<polymer-element name="html-echo" attributes="html">
<script>
Polymer(‘html-echo’, {
htmlChanged: function() {
// WARNING: potential XSS vulnerability if `html` comes from an untrusted source
this.innerHTML = this.html;
}
});
</script>
</polymer-element>
[/html]
でHTMLを出力するテンプレートを作成して、HTMLタグを使用したい要素を投げつけるだけ。
[html]
<html-echo html="{{post}}"></html-echo>
[/html]
こうやって書くと、postの中身がエスケープされずに出力されます。

で:こんなの完成

とりあえずでサンプルを作ってみました。

Polymer_WebApp
Polymerで最新記事を5件表示するサンプル

記事タイトル・本文とかを表示するだけの簡単実装です。

そして:次にやりたいこと

Polymer部分とWP-API部分でまだまだ色々いじれる箇所はありますので、時間をみて試してみたいなと思います。

表示件数の制御

・1件表示にして「個別記事ページ」を表示させる。
・アーカイブは10件位にしたい
・サイドバーにカテゴリ一覧とかも出せるよね

非同期ページ遷移

正直jQueryMobileでもよくわからんかったからリベンジしたい領域でもあります。

ここまでできたらWordPressサイトをPHPなしで構築できる・・・はず。

ブックマークや限定記事(予定)など

WP Kyotoサポーター募集中

WordPressやフロントエンドアプリのホスティング、Algolia・AWSなどのサービス利用料を支援する「WP Kyotoサポーター」を募集しています。
月額または年額の有料プランを契約すると、ブックマーク機能などのサポーター限定機能がご利用いただけます。

14日間のトライアルも用意しておりますので、「このサイトよく見るな」という方はぜひご検討ください。

広告ここから
広告ここまで

Related Category posts