18
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

WordPress に API として機能してもらう方法

Posted at

WordPress に API として機能してもらう方法

WordPress に投稿したデータを、WordPress 外から利用したい場合ってありますよね。
最近の WordPress では、XML-RPC を標準で利用できるようになっておりますので、簡単な実装で、すぐにやりたいことを実現できるようになっています。

XML-RPC とは?

http://www.weblio.jp/content/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 に記述していきます。

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 の作成

もうひとつメソッドを追加してみましょう。
今度は、引数を利用します。

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';
	$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 攻撃に利用されてしまう可能性があります。

従いまして、実際に利用する場合は、利用するメソッドを限定したりするなどしておくといいかもしれません。

18
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?