WordPress に API として機能してもらう方法
WordPress に投稿したデータを、WordPress 外から利用したい場合ってありますよね。
最近の WordPress では、XML-RPC を標準で利用できるようになっておりますので、簡単な実装で、すぐにやりたいことを実現できるようになっています。
XML-RPC とは?
WordPress では、この技術をリモートでの投稿や、pingback の処理等で利用しています。
具体的に何が行われるか?
まず、WordPress の XML-RPC が有効化されているかの確認と、どのようなやりとりを行うかのイメージです。
$ curl -d '<?xml version="1.0"?><methodCall><methodName>demo.sayHello</methodName></methodCall>' http://(WordPressのURL)/xmlrpc.php
こんな感じで WordPress に POST してみましょう。
<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
<params>
<param>
<value>
<string>Hello!</string>
</value>
</param>
</params>
</methodResponse>
こんなレスポンスが返ってくるかと思います。
ブログタイトルを返す API の作成
それでは、こんな感じのものをひとつ作ってみましょう。
おなじみ functions.php に記述していきます。
/**
* エンドポイントを追加します。
*
* @param array $methods
* @return array
*/
add_filter( 'xmlrpc_methods', 'append_custom_methods' );
function append_custom_methods( $methods ) {
$methods['mywp.sample_method'] = 'api_mywp_sample_method';
return $methods;
}
function api_mywp_sample_method($args) {
return get_bloginfo('name');
}
まず、xmlrpc_methods というフィルターフックを利用します。
利用できるメソッドがホワイトリストで設定されているので、そちらに任意のメソッドを追加します。
上記では、api_mywp_sample_method() を呼び出す、mywp.sample_method というメソッドを追加しています。
api_mywp_sample_method() 内では、もちろん WordPress の関数群が利用できますので、こうしてブログタイトルも呼び出せます。
それでは、実際に呼び出してみましょう。
$ curl -d '<?xml version="1.0"?><methodCall><methodName>mywp.sample_method</methodName></methodCall>' http://(WordPressのURL)/xmlrpc.php
このような感じで、設定したメソッドを呼び出します。
<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
<params>
<param>
<value>
<string>(ブログタイトル)</string>
</value>
</param>
</params>
</methodResponse>
いかがでしょうか?ブログのタイトルが返されましたでしょうか?
任意の記事タイトルを返す API の作成
もうひとつメソッドを追加してみましょう。
今度は、引数を利用します。
/**
* エンドポイントを追加します。
*
* @param array $methods
* @return array
*/
add_filter( 'xmlrpc_methods', 'append_custom_methods' );
function append_custom_methods( $methods ) {
$methods['mywp.sample_method'] = 'api_mywp_sample_method';
$methods['mywp.sample_method2'] = 'api_mywp_sample_method2';
return $methods;
}
function api_mywp_sample_method($args) {
return get_bloginfo('name');
}
function api_mywp_sample_method2($args) {
$post = get_post( $args[0] );
return $post ? $post->post_title : 'Not Found.';
}
api_mywp_sample_method2() では、引数に記事IDを受け取って、該当するものがあればその記事タイトルを返すようにしています。
以下のように呼び出せます。
curl -d '<?xml version="1.0"?><methodCall><methodName>mywp.sample_method2</methodName><params><param><value>(記事ID)</value></param></params></methodCall>' http://(WordPressのURL)/xmlrpc.php
先ほどのレスポンスの(ブログタイトル)部分が、今度は指定した記事IDのタイトルになっているかと思われます。(該当記事がなければ、Not Found. になりますね。)
セキュリティの問題(重要)
ちなみに、この XML-RPC は、DDOS 攻撃に利用されてしまう可能性があります。
従いまして、実際に利用する場合は、利用するメソッドを限定したりするなどしておくといいかもしれません。