WordPressAPI

51
URL : http://www.asial.co.jp/ Copyright © Asial Corporation. All Rights Reserved. 1 WordPress APIの活用 アプリケーションプラットフォームとしてのWordPress

description

WordPressAPIを利用してアプリケーションを作成するサンプル

Transcript of WordPressAPI

Page 1: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 1

WordPress APIの活用

アプリケーションプラットフォームとしてのWordPress

Page 2: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 2

自己紹介

名前• 岡本雄樹 (HN:ジャスティス岡本)

[email protected]

Webやプログラミングを始めた理由• 自分のWebサイトを作るためWebサーバーを構築したのがきっかけでLinux

やPHP・オープンソースの世界と出会う。

略歴• 大学生時代は創業したばかりの通販ベンチャーでECサイト立ち上げに関わ

り、システム構築からサーバの運用などシステム面を一手に引き受ける。

• アシアル入社後も、その経験を生かしECサイトの自社パッケージ開発や多数のEC案件に関わる。

現在の仕事• 現在は教育事業を担当しておりWeb技術の教育サービスを行っている。

• 著書として「イラストでよくわかるPHP はじめてのWebプログラミング入門」がある。

Page 3: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 3

本講座の目的

WordPressを使ってアプリケーションを作ろう

WordPress APIでできること

例題:ジャスティス†ブックマーク

フレームワークとしてのWordPress

XML-RPCとJSON REST API

参考資料

Page 4: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 4

WordPressを使ってアプリケーションを作ろう

Page 5: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 5

アプリケーションプラットフォーム?

今後WordPressは「アプリケーションプラットフォーム」を指向するらしいです• なるほど! わからん!

アプリケーションとは?• WordやPhotoShopのような、特定の目的の為に使うソフトウェア

ブラウザもアプリケーション

– Webサイトは通常、アプリケーションではない。

» ブログなどはコンテンツ。

– キーワード検索や翻訳など、特定の目的で使えるソフトが動くサイトはアプリケーション

LinuxやApacheやMySQLは応用ソフトやミドルウェアに分類されるためアプリケーションではない

アプリケーションの例• ニュースアプリ

• RSSリーダーアプリ

• ブラウザ

• MS製品やAdobe製品、その他パソコンソフト全般

• etc,etc

Page 6: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 6

アプリケーションを開発するために必要なもの

アプリケーションを開発するために必要なもの

• 入力

文字・数値・座標(マウスやタップから得られる情報を含む)等

• 出力

文字・数値・画像・アニメーション等

• 処理

何らかのプログラム

• 保存

何らかのデータ

Page 7: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 7

アプリケーションを開発するために必要なもの

これが基本。ゲームであっても入力に応じて何かを出力している。

入力 処理 出力

保存

Page 8: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 8

アプリケーションを開発するために必要なもの

WordPressもアプリケーション• Webサイトの表示や管理に特化している。

記事 WordPress WebPage

DB

Page 9: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 9

アプリケーションを開発するために必要なもの

Webの管理画面やWebの閲覧画面から脱却できれば、新たな可能性が…

WordPress

DB

Page 10: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 10

アプリケーションを開発するために必要なもの

APIを使うことでWebサイトに限定しない使い方ができるようになる

WordPress

DB

入力 出力API API

Page 11: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 11

WordPress

アプリケーションを開発するために必要なもの

カスタム三兄弟を使うことで扱うコンテンツも自由に定義することができる

DB

カスタム

タクソノミー

カスタム

フィールド

カスタム

投稿タイプ

Page 12: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 12

具体的なアプリケーションの例

ブログエディタソフトもアプリです• 公式のiOSアプリ等

Page 13: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 13

WordPressを「アプリケーションプラットフォーム」にする実験ジャスティス†ブックマーク

Page 14: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 14

ジャスティス†ブックマーク

ジャスティス†ブックマーク• WordPressを「アプリケーションプラットフォーム」にしてブックマーク管理サービスを開

発するとりあえずソロ利用を前提とする

カスタム三兄弟も今回は使わない

– タイトルとリンクだけなら無くても保存できる。

仕様• ブックマークレット対応

閲覧しているページをブックマークレット一発で登録できるようにする

• モバイルアプリ対応 (まにあえば)ブックマーク一覧をアプリとして確認できるようにする

– iOS / Android / FireFoxOS端末に対応したい

Page 15: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 15

モバイルアプリ側

モバイルアプリ側• ブックマークを一覧で表示

WordPressAPI経由で取得

• ブックマークをクリック(タッチ)すると外部ブラウザで表示する

Page 16: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 16

ブックマークレットとは

ブックマークレットとは• お気に入りに登録できるJSプログラム

閲覧しているサイトのタイトルやURLを外部に送信するようなプログラムも実現可能

Page 17: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 17

ブックマーク管理プラグイン

ブックマーク管理プラグイン• ブックマークを管理するためのカスタム三兄弟をプラグイン一発で用意できるようにする

今回はカスタム三兄弟の使用を見送ります

カスタム投稿タイプ Link

カスタム投稿フィールド・(タイトル)・URL・(description)

Page 18: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 18

デモ

Page 19: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 19

デモ

デモ• アプリデモ

• 管理画面デモ

• ブックマークレットデモ

Page 20: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 20

【技術解説】XML-RPCとJSON REST API

Page 21: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 21

XML-RPCとJSON REST API

XML-RPCとJSON REST API• コンテンツの入出力を行うAPIは一つではない

昔からあるもの

– XML-RPC

» 枯れてる

» XML-RPCというやり方で通信を行う

» データはXMLで返ってくる

最近開発中の物

– JSON REST API

» 開発中

» REST というやり方で通信を行う

» データはJSONで返ってくる

その他

– 各種プラグイン

– JetPackのREST API

Page 22: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 22

事前知識

事前知識

• 認証BASIC認証

– ユーザー名とパスワードによる認証

その他– OAuth

» アプリに権限を付与するための仕組み

» アプリに生のユーザー名とパスワードを持たせずに済む

• Same-Origin PolicyとCross-Origin Resource Sharing

• デバッグvar_dump()

– 開発環境でやりましょう…

console.log()

Page 23: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 23

XML-RPC API

メリット

• 枯れてる、確実に動く公式のWordPressアプリもXML-RPCを使っている

– カスタム三兄弟も動作が保証されている

MonacaPressプロジェクトでも利用したが、確かに動く

デメリット

• リクエストもレスポンスも全てXML組み立てるのが少々面倒

結果もXMLで返ってくる

ライブラリを使えば…

• 認証リクエストのXMLに直接ユーザー名とパスワードを入力する方式

– 手軽だが、アプリに権限の一部を開放するような仕組みは用意されていない

公開している記事の取得ですら認証が必要

Page 24: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 24

JSON REST API

メリット

• RESTの仕組みはXML-RPCより簡単といわれている

• 結果がJSONで取得できる

• 公開されている記事なら認証せずに取得できる

デメリット

• ドキュメントが少ない日本語のドキュメントは皆無

カスタム三兄弟に対応する方法が分からなかった

• 認証がBASIC認証とOAuth1しか用意されていないので難易度が高いOAuth1は難しい

– OAuth2の方が簡単といわれている

XHRで外部サイトとBASIC認証するとCORS問題が出てきて難しい

Page 25: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 25

認証と権限(認可)

認証と権限(認可)

• JSON REST APIでBASIC認証を利用したい場合

JSON Basic Authentication プラグイン

• APIを開放して投稿出来るようにしたいけど「下書き」に留めておきたい場合

ユーザーの権限を管理者以外にする– 「寄稿者」などにする

プラグインで細かく設定する– User Role Editor プラグイン

Page 26: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 26

Same-Origin PolicyとCORSについて

Same-Origin Policyについて• 簡単に言うとブラウザに制限を掛けるための仕組み

例えば、JSによる外部のサイト(厳密にはオリジン)へのリクエストはこのポリシーで制限されている

CORS(Cross-Origin Resource Sharing)について• Same-Origin Policyを緩和するための仕組み

JS用にAPI提供などを行いたい場合に利用できる

API提供サーバー側で特別なHTTPヘッダーを返すようにする

– Allow CORS XML-RPC プラグイン

詳細はMozilla参照• https://developer.mozilla.org/ja/docs/HTTP_access_control

メモ• CORSだけなら固定のヘッダーを一行追加するだけ

BASIC認証も併用する場合、複雑な対応が必要

Page 27: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 27

XMLRPCで記事取得

Page 28: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 28

XMLRPCでPHPから記事取得

APIのURLとXMLを用意• 認証情報もXML中に含める

• XMLRPCの場合は公開記事の取得でも記事の権限が必要となる

<?php$url = "http://b.j801.com/xmlrpc.php";$xml = '<?xml version="1.0"?><methodCall><methodName>wp.getPost</methodName><array><data>

<value>1</value><value>ユーザー名</value><value>!PASSWORD!</value><value>10</value>

</data></array>

</methodCall>';

$ch = curl_init();curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml')); curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);curl_setopt($ch, CURLOPT_POST, TRUE); curl_setopt($ch, CURLOPT_URL, $url);

curl_exec($ch);

getByXMLRPC.php

Page 29: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 29

XMLRPCでJSから記事取得

JSでXML文を直接記述する場合は改行に注意• 複雑なXML文を組み立てる場合はライブラリの使用も検討

<!DOCTYPE html> <html>

<head> <meta charset="utf-8"><script>var url = 'http://b.j801.com/xmlrpc.php';var xml = '<?xml version="1.0"?>¥

<methodCall>¥<methodName>wp.getPost</methodName>¥<array>¥

<data>¥<value>1</value>¥<value>ユーザー名</value>¥<value>!PASSWORD!</value>¥<value>7</value>¥

</data>¥</array>¥

</methodCall>';

getByXMLRPC.html

Page 30: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 30

XMLRPCでJSから記事取得

続き• XMLRPCの場合は記事取得もPOSTリクエスト

var xhr= new XMLHttpRequest();xhr.open("POST" , url, false);xhr.send(xml);console.log(xhr.response);

</script></head><body></body>

</html>

getByXMLRPC.html

Page 31: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 31

レスポンスの例

XMLRPCでの記事取得に成功すると記事情報が返却されます<?xml version="1.0" encoding="UTF-8"?><methodResponse><params><param><value><struct>

<member><name>post_id</name><value><string>114</string></value></member><member><name>post_title</name><value><string>bookmarkLetのリンク</string></value></member><member><name>post_date</name><value><dateTime.iso8601>20140824T16:40:20</dateTime.iso8601></value></member><member><name>post_date_gmt</name><value><dateTime.iso8601>20140824T07:40:20</dateTime.iso8601></value></member><member><name>post_modified</name><value><dateTime.iso8601>20140824T16:40:20</dateTime.iso8601></value></member><member><name>post_modified_gmt</name><value><dateTime.iso8601>20140824T07:40:20</dateTime.iso8601></value></member><member><name>post_status</name><value><string>draft</string></value></member><member><name>post_type</name><value><string>post</string></value></member><member><name>post_name</name><value><string></string></value></member><member><name>post_author</name><value><string>2</string></value></member><member><name>post_password</name><value><string></string></value></member><member><name>post_excerpt</name><value><string></string></value></member><member><name>post_content</name><value><string></string></value></member><member><name>post_parent</name><value><string>0</string></value></member><member><name>post_mime_type</name><value><string></string></value></member><member><name>link</name><value><string>http://b.j801.com/?p=114</string></value></member><member><name>guid</name><value><string>http://b.j801.com/?p=114</string></value></member><member><name>menu_order</name><value><int>0</int></value></member><member><name>comment_status</name><value><string>closed</string></value></member><member><name>ping_status</name><value><string>open</string></value></member><member><name>sticky</name><value><boolean>0</boolean></value></member><member><name>post_thumbnail</name><value><array><data>

</data></array></value></member>

Page 32: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 32

レスポンスの例

続き• XMLのままだとプログラムの中では扱いにくいため、実際には変換して利用します

<member><name>terms</name><value><array><data><value><struct><member><name>term_id</name><value><string>1</string></value></member><member><name>name</name><value><string>未分類</string></value></member><member><name>slug</name><value><string>%e6%9c%aa%e5%88%86%e9%a1%9e</string></value></member><member><name>term_group</name><value><string>0</string></value></member><member><name>term_taxonomy_id</name><value><string>1</string></value></member><member><name>taxonomy</name><value><string>category</string></value></member><member><name>description</name><value><string></string></value></member><member><name>parent</name><value><string>0</string></value></member><member><name>count</name><value><int>2</int></value></member><member><name>filter</name><value><string>raw</string></value></member>

</struct></value></data></array></value></member><member><name>custom_fields</name><value><array><data>

</data></array></value></member></struct>

</value></param>

</params></methodResponse>

Page 33: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 33

XMLRPCで記事投稿

Page 34: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 34

XMLRPCでPHPから記事投稿

APIのURLとXMLを用意

<?php$url = "http://b.j801.com/xmlrpc.php";$xml = '<?xml version="1.0"?><methodCall>

<methodName>wp.newPost</methodName><array><data>

<value>1</value><value>ユーザー名</value><value>!PASSWORD!</value><value>

<struct><member>

<name>post_title</name><value>foo</value>

</member></struct>

</value></data></array>

</methodCall>';

postByXMLRPC.php

Page 35: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 35

XMLRPCAPIでPHPから記事投稿

続き• PHPのcurlを利用してAPIにXMLをPOSTする

$ch = curl_init();

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml')); curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);curl_setopt($ch, CURLOPT_POST, TRUE); curl_setopt($ch, CURLOPT_URL, $url);

curl_exec($ch);

postByXMLRPC.php

Page 36: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 36

XMLRPCAPIでJSから記事投稿

APIのURLとXMLを用意

<!DOCTYPE html> <html>

<head> <meta charset="utf-8"><script>var url = 'http://b.j801.com/xmlrpc.php';var xml = '<?xml version="1.0"?>¥

<methodCall>¥<methodName>wp.newPost</methodName>¥<array>¥

<data>¥<value><int>1</int></value>¥<value>ユーザー名</value>¥<value>!PASSWORD!</value>¥<value>¥

<struct>¥<member>¥

<name>post_title</name>¥<value>foo</value>¥

</member>¥</struct>¥

</value>¥</data>¥

</array>¥</methodCall>';

postByXMLRPC.html

Page 37: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 37

XMLRPCAPIでJSから記事投稿

続き• XHRを利用してAPIにXMLをPOSTする。

今回は非同期通信をオフにしています

– プログラムを分かり易くするためなので必須ではありません

var xhr= new XMLHttpRequest();xhr.open("POST" , url, false);xhr.send(xml);console.log(xhr.response);

</script></head><body></body>

</html>

postByXMLRPC.html

Page 38: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 38

レスポンスの例

XMLRPCでの記事投稿に成功すると記事IDが返却されます

<?xml version="1.0" encoding="UTF-8"?><methodResponse><params>

<param><value><string>122</string></value>

</param></params>

</methodResponse>

Page 39: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 39

JSON REST APIで記事取得

Page 40: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 40

JSON REST APIでPHPから記事取得

APIのURLに記事のID指定してGETリクエストする• 公開されている記事なら権限チェックも特になし

<?php$url = "http://b.j801.com/wp-json/posts/7";

$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_exec($ch);

getByJSONRESTAPI.php

Page 41: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 41

JSON REST APIでJSから記事取得

こちらもXHRでリクエストするだけ

<!DOCTYPE html> <html>

<head> <meta charset="utf-8"><script>var url = ' http://b.j801.com/wp-json/posts/7';var xhr = new XMLHttpRequest();xhr.open("GET", url, false);xhr.send();console.log(xhr.response);

</script></head><body></body>

</html>

getByJSONRESTAPI.html

Page 42: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 42

レスポンスの例JSON形式で情報が大量に返ってきます

{"ID": 7, "author": {

"ID": 1, "URL": "", "avatar": "http://0.gravatar.com/avatar/42fcbe74b0c48f70ffbffe57472382c8?s=96", "description": "", "first_name": "", "last_name": "", "meta": {

"links": {"archives": "http://b.j801.com/wp-json/users/1/posts", "self": "http://b.j801.com/wp-json/users/1"

}}, "name": "justice", "nickname": "justice", "registered": "2014-08-18T01:31:52+00:00", "slug": "justice", "username": "justice"

}, "comment_status": "open", "content": "<p>http://j801.com</p>

", "date": "2014-08-18T10:36:47+09:00", "date_gmt": "2014-08-18T01:36:47+00:00", "date_tz": "Asia/Tokyo", "excerpt": "<p>http://j801.com</p>

", "featured_image": null, "format": "standard", "guid": "http://b.j801.com/?p=7", "link": "http://b.j801.com/archives/7", "menu_order": 0, "meta": {

"links": {"author": "http://b.j801.com/wp-json/users/1",

"collection": "http://b.j801.com/wp-json/posts", "replies": "http://b.j801.com/wp-json/posts/7/comments", "self": "http://b.j801.com/wp-json/posts/7", "version-history": "http://b.j801.com/wp-json/posts/7/revisions"

}}, "modified": "2014-08-18T10:36:47+09:00", "modified_gmt": "2014-08-18T01:36:47+00:00", "modified_tz": "Asia/Tokyo", "parent": 0, "ping_status": "open", "slug": "j801", "status": "publish", "sticky": false, "terms": {

"category": [{

"ID": 1, "count": 2, "description": "", "link": "http://b.j801.com/archives/category/%e6%9c%aa%e5%88%86%e9%a1%9e", "meta": {

"links": {"collection": "http://b.j801.com/wp-json/taxonomies/category/terms", "self": "http://b.j801.com/wp-json/taxonomies/category/terms/1"

}}, "name": "未分類", "parent": null, "slug": "%e6%9c%aa%e5%88%86%e9%a1%9e"

}]

}, "title": "j801", "type": "post"

}

Page 43: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 43

JSON REST APIで記事投稿

Page 44: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 44

JSON REST APIでPHPから記事投稿

投稿内容はJSONで用意する必要があります• PHPのjson_encode()関数を利用できます

記事投稿には認証が必要です• PHPの場合curlで簡単にBASIC認証できます

<?php$url = "http://b.j801.com/wp-json/posts";$userpwd = 'ユーザー名:!PASSWORD!';$data = array('title' => 'Hello World!','type' => 'post','content_raw' => 'foo',

);$data = json_encode($data);

$ch = curl_init();curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); curl_setopt($ch, CURLOPT_USERPWD, $userpwd);curl_setopt($ch, CURLOPT_POSTFIELDS, $data);curl_setopt($ch, CURLOPT_POST, TRUE); curl_setopt($ch, CURLOPT_URL, $url);curl_exec($ch);

postByJSONRESTAPI.php

Page 45: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 45

JSON REST APIでJSから記事投稿

JSでBASIC認証に対応するためには注意点があります• xhr.setRequestHeader()でAuthorizationヘッダーをセットする

• ユーザー名とパスワードは事前にbase64エンコードを施す

ユーザー名:パスワード

<!DOCTYPE html> <html>

<head> <meta charset="utf-8"><script>var xhr = new XMLHttpRequest();var url = "http:///b.j801.com/wp-json/posts";var basic = "Basic " + "ajgwMWNvbStudWxsZnNAZ21haWwuY29tOmRldm51bGw4MDE=";

xhr.open("POST" , url, false);xhr.setRequestHeader("Authorization", basic);xhr.send(JSON.stringify({ 'title': 'Hello World!', 'type' : 'post', 'content_raw': 'foo'}));console.log(xhr.response);

</script></head><body></body>

</html>

postByJSONRESTAPI.php

Page 46: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 46

ユーザー名とパスワードをbase64エンコードする

ユーザー名とパスワードをbase64エンコードする• JSの標準では関数が無い

どうしてもJSで変換したい

– 別途ライブラリを使う

面倒なのでWebサービスを使う

– 幾らでも存在するがユーザー名やパスワードを打ち込むのは気持ちの良いものではない…

• PHPを利用する

MacやLinuxならコマンドラインからPHPを呼び出す

php -r "echo base64_encode('ユーザー名:!PASSWORD!');"

Page 47: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 47

ブックマークレットでURLとタイトルを投稿

Page 48: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 48

ブックマークレット

ブックマークレット• お気に入り登録できるJSプログラム

例えば、閲覧しているサイトの情報を外部に飛ばしたりできる

• 諸注意

1行にまとめねばならない

空白等をURLエンコードせねばならない

– ブックマークレット変換ツールみたいなものも存在する

返り値が発生しないようにせねばらなない(void化)

文字数制限が存在する

• 実は外部ファイルが使える

外部ファイルなら1行縛りや文字数制限から解放される

– ただしCORS問題からは解放されない

– 読み込みは非同期に行われるので注意

Page 49: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 49

ブックマークレット

ブックマークレットのソースコード

// ブックマークレットは「javascript:」から始める。返り値がvoidになるように対策。javascript:(function(){// 外部ファイルを読み込むためのscriptタグを生成var s = document.createElement("script");// scriptタグの属性srcに値として外部ファイルを設定s.src = "http://b.j801.com/tools/b.js";// 外部ファイルの読み込み完了時に処理が実行されるように設定s.onload=function(){

postBookmarkByXMLRPC()};// DOMにscriptタグを埋め込むdocument.body.appendChild(s);

})()'

Page 50: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 50

ブックマークレット実際に送信処理を行う関数

function postBookmarkByXMLRPC () {var xml = '<?xml version="1.0"?>¥

<methodCall>¥<methodName>wp.newPost</methodName>¥<array>¥<data>¥

<value><int>1</int></value>¥<value>ユーザー名</value>¥<value>!PASSWORD!</value>¥<value>¥

<struct>¥<member>¥

<name>post_title</name>¥<value>' + document.title + '</value>¥

</member>¥<member>¥

<name>post_content</name>¥<value>' + location.href + '</value>¥

</member>¥</struct>¥

</value>¥</data>¥</array>¥

</methodCall>';

var xhr= new XMLHttpRequest();xhr.open("POST" , "http://b.j801.com/xmlrpc.php", false);xhr.send(xml);

}

Page 51: WordPressAPI

URL : http://www.asial.co.jp/ │ Copyright © Asial Corporation. All Rights Reserved. │ 51

登録されたブックマークレット

お気に入りとして登録しましょう• ブックマークバーなどに表示しておくと便利です

• ブックマークの編集から編集可能です

認証情報は外部ファイルよりもブックマークに記述する方が、まだマシです

<a href='javascript:(function(){var%20s%20=%20document.createElement("script");%20s.src%20=%20"http://b.j801.com/tools/b.js";s.onload=function(){postBookmarkByXMLRPC()};document.body.appendChild(s);})()'>ブックマークレット</a>

ブックマークレットをAタグで提供する場合の例