wordpress rest api とリアクティブプログラミング

44
WordPress REST API とリアクティブプログラミング SaCSS Special 08

Upload: hiromasa-tanaka

Post on 21-Jan-2017

522 views

Category:

Engineering


4 download

TRANSCRIPT

Page 1: WordPress REST API とリアクティブプログラミング

WordPress REST API とリアクティブプログラミング

SaCSS Special 08

Page 2: WordPress REST API とリアクティブプログラミング

自己紹介

名前 田中 広将(ひろましゃ)

住所 札幌市

職業 SIer 所属のインフラエンジニア

WordPress歴 2005年~

WordPress Bench 札幌 発起人(すいません…)

Page 3: WordPress REST API とリアクティブプログラミング

オープンソース活動

Page 4: WordPress REST API とリアクティブプログラミング

本日の内容

本日は、WordPress 4.4 から実装された

WordPress REST API と、

昨今定着してきた「リアクティブ」系

JavaScript ライブラリを組み合わせて、

ウェブサイトを構築する手法を

解説したいと思います

Page 5: WordPress REST API とリアクティブプログラミング

本日の内容

1.WordPress REST API とは

2.リアクティブプログラミングとは

3.Vue.js と WordPress REST API を組合せた活用

Page 6: WordPress REST API とリアクティブプログラミング

1. WordPress REST API とは

Page 7: WordPress REST API とリアクティブプログラミング

WP REST API の歴史

● WordPress REST API は、バージョン 4.4 からコア実装された、コンテンツの内容を JSON(JavaScript)形式で返すための仕組みです。

● 従来、WordPress においてコンテンツを出力するために「テーマ」を用いていましたが、REST API の追加により、新しい出力先が追加された形です。

● WordPress 4.7(近日リリース)ではさらに、標準的な API も実装され、複雑な抽出操作も、ドキュメントに従い簡単に取り扱えるようになります。

Page 8: WordPress REST API とリアクティブプログラミング

WordPress REST API の活用

● WordPress REST API は「エンドポイント(URL)」に対して JavaScript などから REST リクエストを行うことで、コンテンツの内容を取得できます。

● エンドポイントは自分で設計し拡張することができます。

Page 9: WordPress REST API とリアクティブプログラミング

WordPress REST API の活用

REST API を活用すると、WordPress で次のようなことが実現可能です。

– 静的サイトへの WordPress コンテンツの記載(本日紹介)

– 画面遷移のない検索の実装(本日紹介)

– ニュースサイトで見られるような、コンテンツの遅延ロード

– バックエンドのコンテンツリポジトリとしての WordPress の活用

– 等々...

Page 10: WordPress REST API とリアクティブプログラミング

WordPress REST API を体験する

WordPress サイトの URL のおしりに /wp-json/ を付与してみてください。

/wp-json/

サイトが持っている「エンドポイント」が確認できるエンドポイントです。

Page 11: WordPress REST API とリアクティブプログラミング

WordPress REST API を体験する

その情報を元にさらにエンドポイントをたどります。

/wp-json/oembed/1.0/embed/

指定した URL の投稿の抜粋が JSON 形式が取得できます。

Page 12: WordPress REST API とリアクティブプログラミング

WP REST API と JavaScript の関係

● 静的サイトや WordPress テーマが、WordPress REST API を通じてコンテンツを取得するために、JavaScript を使います。

● JavaScript から AJAX を用いて「エンドポイント」に対して REST リクエストを行い、戻された JSON 形式を入力とし、HTML に展開するのが大きな流れになります。

● 閲覧している人の操作に応じて、REST のリクエストを変化させ、必要な情報を取得します。(条件付き検索などで活用できます)

Page 13: WordPress REST API とリアクティブプログラミング

WP REST API と JavaScript の関係

これらを従来のプログラミング手法で実装すると、

煩雑な処理がたくさんでてきます。

そこで登場してきたのが「リアクティブ」系と言われる

JavaScript ライブラリです。

Page 14: WordPress REST API とリアクティブプログラミング

従来のプログラミング手法を使った REST API 活用の際の課題点

● プログラマーは、ユーザの操作に応じて JSON を取得し、DOM(HTML)を操作しコンテンツを整形して出力するプログラムをかきます。

● 現在画面に表示されている HTML ツリー状態(ノード)を把握し、必要に応じて HTML タグの追加や削除を行います。

Page 15: WordPress REST API とリアクティブプログラミング

従来のプログラミング手法を使った REST API 活用の際の課題点

● ある操作の後は、この HTML タグがあるので削除する・・・

● ある操作の後は、この HTML タグがないので追加する・・・

● ひとつの操作だけではなく、前回、前々回…、いろいろなパターンで変化していく HTML の状態をすべて把握して、プログラミングしなければならないのため、特定の操作順に対する考慮不足といった不具合も起きやすいです。

このような課題に対応すべく登場したのが、JavaScript のリアクティブ系のライブラリになります。

Page 16: WordPress REST API とリアクティブプログラミング

2. リアクティブプログラミングとは

Page 17: WordPress REST API とリアクティブプログラミング

プログラミングできる人

突然ですが問題です。

● "プログラミングができる人"とはどのような人でしょう?

●高度な CSS が記述できるのに、プログラミングが苦手という事象が起きるのはなぜでしょう?

Page 18: WordPress REST API とリアクティブプログラミング

プログラミングできる人(答え)

● 「変数」があるからです。

● CSS には変数がありません。

● プログラミングができる人は、上から順に流れていくソースコードの変数の状態を常に把握し、コントロールする術を知っています。

● 手続き型、構造化プログラミング、オブジェクト指向などなど、様々なプログラム言語が持つ仕組みは、いかに大量の変数の状態を把握しやすくするかとの戦いの中で生まれました。

Page 19: WordPress REST API とリアクティブプログラミング

プログラミングの例(FizzBuzz 問題)

● FizzBuzz 問題

プログラマーの基本的な素養をみるための、ごく簡単な問題。

Page 20: WordPress REST API とリアクティブプログラミング

プログラミングの例(FizzBuzz 問題)

● 問題

1から順に数を表示するプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」と表示し、3と5両方の倍数の場合には「FizzBuzz」と表示すること。

● 回答の出力例

1, 2, Fizz, 4, Fizz, Buzz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, FizzBuzz, ...[省略]..., 97, 98, Fizz, Buzz

Page 21: WordPress REST API とリアクティブプログラミング

プログラミングの例(FizzBuzz 問題・回答)

var i; // 変数

for (i = 1; i <= 100; i++) { // ループ

if (i % 3 == 0 && i % 5 == 0) {

console.log('FizzBuzz');

} else if (i % 3 == 0) {

console.log('Fizz');

} else if (i % 5 == 0) {

console.log('Buzz');

} else {

console.log(i);

}

}

Page 22: WordPress REST API とリアクティブプログラミング

従来のプログラミングスタイル

Page 23: WordPress REST API とリアクティブプログラミング

従来のプログラミングスタイル

● ソースコードが上から下に流れることを基本として、ループで実行される命令の位置をコントロールする。

● 命令により変数の値を変化させ、実行中のプログラムの状態を変化させ、望みの処理をさせる。

● プログラミング言語から外の世界に命令し、外部の状態を変化させる。(画面出力等)

● つらい…

Page 24: WordPress REST API とリアクティブプログラミング

CSSとプログラミング言語の比較

● CSS はプログラミング言語と異なり、実行行や変数の状態などをもたず、宣言のみを行うため、シンプルで分かりやすい。

● このような宣言型のプログラミングスタイルが、従来と異なる、リアクティブプログラミングの特徴のひとつです。

Page 25: WordPress REST API とリアクティブプログラミング

CSS で FizzBuzz 問題

● 問題

1から順に数を表示するプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」と表示し、3と5両方の倍数の場合には「FizzBuzz」と表示すること。

Page 26: WordPress REST API とリアクティブプログラミング

CSSで FizzBuzz 問題・回答

<ol>

<li></li>

<li></li>

...[省略]...

<li></li>

<li></li></ol>

Page 27: WordPress REST API とリアクティブプログラミング

CSSで FizzBuzz 問題・回答

li:nth-child(3n):before {

content: "Fizz";

}

li:nth-child(5n):before {

content: "Buzz";

}

li:nth-child(15n):before {

content: "FizzBuzz";

}

li:nth-child(3n), li:nth-child(5n) {

list-style: none;

}

Page 28: WordPress REST API とリアクティブプログラミング

CSSで FizzBuzz 問題・回答

● 入力(HTML)を与えれば「宣言」通りオートマティックに表示が変わる。

● これがリアクティブな動きです。

● というわけで、JavaScript リアクティブ系プログラミングも、従来なプログラミングに慣れている方より、最初から CSS などで宣言的コーディングをしている方のほうが、とっつきやすいかもしれません。

Page 29: WordPress REST API とリアクティブプログラミング

JavaScript を使ったリアクティブな例

● この例は「時間」を入力として、キャラクターを動かす例です。

http://pararaehon.com/

● JavaScript で画面を書き換えるプログラムを簡潔にかこうとすると、リアクティブな宣言的プログラミングにたどりつくような気がします。

Page 30: WordPress REST API とリアクティブプログラミング

JavaScript を使ったリアクティブな例

hitsuji01: {

image: 'images/page02/02_hitsuji01.png',

update: function() {

this.y = 600 + (1 - Math.exp(-6 * (this.tick / 60))) * -280;

}

},

Page 31: WordPress REST API とリアクティブプログラミング

3. Vue.js と WP REST API を組み合せた活用

Page 32: WordPress REST API とリアクティブプログラミング

Vue.js でできること

● Vue.js は JavaScript のリアクティブ系ライブラリのひとつです。

● 今日の Vue.js の任務は JSON を入力とし HTML をリアクティブに変化させることです。

● WordPress REST API で取得した JSON を HTML に展開する宣言します(データバインディング)

● 宣言さえ完了すれば、取得した JSON データによって勝手に画面が書き換わるイメージです。

Page 33: WordPress REST API とリアクティブプログラミング

Vue.js の特徴

● Vue.js は通常 HTML に付与された属性を手がかりに、JavaScript と HTML を結びます。

● このため、既存の HTML や WordPress テーマ(CMS)と相性が良いです。

Page 34: WordPress REST API とリアクティブプログラミング

Vue.js の特徴

● 多くのリアクティブ系の JS ライブラリは、コンポーネントの考え方のもと、処理したい HTML を JavaScript ファイル側に持たせます。

● WordPress を始めとした多くの CMS では、テーマとなるファイルをその CMS で処理して HTML を生成するため、 .js ファイルに HTML が移動すると、結構つらいです。

var Hello = React.createClass({

render: function() {

return (

<div>Hello {this.props.name}</div>

);

}

})

Page 35: WordPress REST API とリアクティブプログラミング

Vue.js を単体で使う(練習)

● Vue.js を単体で使ってデータを HTML に展開

<tbody id="latest">

<tr v-for="item in items">

<td>{{item.post_title}}</td>

<td>{{item.post_content}}</td>

</tr>

</tbody>

Page 36: WordPress REST API とリアクティブプログラミング

Vue.js を単体で使う(練習)

<script>

new Vue({

el: '#latest',

data: {

items: [

{

post_title: '佐賀県',

post_content : "佐賀市"

},

{

post_title: '岩手県',

post_content : "盛岡市"

},

]

}

});

</script>

Page 37: WordPress REST API とリアクティブプログラミング

静的ページで Vue.js を使い WordPress からデータを取得

● functions.php で WordPress に REST API の口を作成する

add_action( 'rest_api_init', function () {

register_rest_route( 'sacss/v1', '/latest', array(

'methods' => 'GET',

'callback' => function() {

return get_posts(

array('orderby' => 'rand' , 'posts_per_page' => -1));

}

) );

} );

Page 38: WordPress REST API とリアクティブプログラミング

静的ページで Vue.js を使い WordPress からデータを取得

● 静的 HTML に配置した Vue.js で HTML に展開する

<script>

new Vue({

el: '#latest',

data: {

items: []

},

created: function() {

this.$http.get('/wp-json/sacss/v1/latest', function (data) {

this.items = data;

})

}

})

</script>

Page 39: WordPress REST API とリアクティブプログラミング

WordPress テーマで Vue.js を使い WordPress からデータを取得

● functions.php で WordPress に REST API の口を作成する

add_action( 'rest_api_init', function () {

register_rest_route( 'sacss/v1', '/cat/(?P<term_id>\d+)', array(

'methods' => 'GET',

'args' => array(

'term_id' => array(

'default' => 1,

'sanitize_callback' => 'absint',

)

),

'callback' => function($request) {

return get_posts(array( 'cat' => $request->get_param('term_id'), 'posts_per_page' => -1));

}

) );

} );

Page 40: WordPress REST API とリアクティブプログラミング

WordPress テーマで Vue.js を使い WordPress からデータを取得

● WordPress テンプレートファイル

<ul>

<?php foreach(get_categories() as $cat) : ?>

<li>

<a v-on:click="get(<?php echo $cat->term_id; ?>)" href="#">

<?php echo esc_html($cat->name); ?>

</a>

</li>

<?php endforeach; ?>

</ul>

<tbody>

<tr v-for="item in items">

<td>{{item.post_title}}</td>

<td>{{item.post_content}}</td>

</tr>

</tbody>

Page 41: WordPress REST API とリアクティブプログラミング

WordPress テーマで Vue.js を使い WordPress からデータを取得

<script>

new Vue({

el: '#latest',

data: {

items: []

},

created: function(){

this.$http.get('/wp-json/sacss/v1/latest', function (data) {

this.items = data;

})

},

methods: {

get: function(term_id) {

this.$http.get('/wp-json/sacss/v1/cat/' + term_id, function (data) {

this.items = data;

})

}

}

});

</script>

Page 42: WordPress REST API とリアクティブプログラミング

まとめ

Page 43: WordPress REST API とリアクティブプログラミング

まとめ

● WordPress REST API は JSON 形式でコンテンツを取得できます。

● JSON 形式で取得したコンテンツは、リアクティブ系の JavaScript で宣言的に HTML に展開すると便利です。

● Vue.js は WordPress テーマなど CMS のテンプレートと組み合わせる場合に楽ができ、相性がいいです。

Page 44: WordPress REST API とリアクティブプログラミング

ご清聴ありがとうございました。