アイデアの甕

アイデアを放り込んでおくと甕は腐臭を発しない

RubypressでHTTPエラーが出たらpath設定を確認しよう。ただし時代はWP REST APIへ?

Web API: The Good Parts

 

Rubyでは色々なことが出来て、もちろんWordPressとの連携もお手の物。記事の投稿や更新、削除などが外部プログラムから実行出来たりします。

 

ワードプレスと外部プログラムの連携においては、二昔前なら「XML-RPC MetaWeblog API」を使っていたそうですが、一昔ほど前からは「XML-RPC WordPress API」を利用するのが、それもRuby用のライブラリ「rubypress」を利用するのが正攻法だったようで。

 

RubyからWordPressのXML-RPC MetaWeblog APIを使って取得、投稿、編集、削除する。(Rails) - Qiita

 

色々、ホントに色々できるんで簡単な例“だけ”が示されている…のは良いのですが、如何せん「初めの一歩」としてはこれでも複雑すぎるっす。

 

という訳で、rubypressのより簡便な使用例を探す。

 

rubypressでWordPressの情報をRubyから操作する | mah365

 

いいですね…と言いたいところですが、これでも「はじめの一歩」としては大きく出すぎているので、もっともっと簡単に。

 

「getPosts(複数ページ取得)」じゃなく、「getPost(単一ページ取得)」で試そうや。

 

getPostできない

改めて簡単な利用例を探すと、下記の記事で「更新」のみ行うスクリプトを発見。

 

rubypressを使うときにハマったところ(タグとカテゴリの部分)メモ。 - Qiita

 

「wp.newPost(...)」「wp.getPost(post_id: id)」に書き換えるだけで、ほら、rubypressの世界に向かう初めの一歩は軽やかに踏み出され…ることなくまんまと落とし穴へ突っ込む。

 

require 'rubypress'

wp = Rubypress::Client.new(
    host: 'xxxx.com',
    username: 'ゆーざーねーむ',
    password: 'パスワード'
)

wp.getPost(
    blog_id: 1,
    post_id: (ID数値)
)

 

getPostしようとしたけど、ファイルが見つからないエラー。

RuntimeError: HTTP-Error: 404 Not Found

 

うーむ、なんでやろ。と思いつつRubypress::Clientオブジェクトのインスタンス変数を眺めていると、「@path="/xmlrpx.php"」という値を発見。上記スクリプトでは設定していないデフォルト値として代入されたようです。

 

WordPressのインストールフォルダ

で、よくよく考えてみればWordPressはドメイン直下にはインストールされていないこともありまして。

 

WordPressをインストールするディレクトリはどこがよいのか?

 

A-ha.

 

@pathにインストールフォルダを設定してやらんといけんのやわ!そうなのやわ!とひとりごちて設定を確認。

 

wp-adminページから「設定」→「一般設定」→「WordPress アドレス (URL)」を確認。

 

http://xxxx.com/wp

 

A-ha.

 

require 'rubypress'

wp = Rubypress::Client.new(
    host: 'xxxx.com',
    path: '/wp',
    username: 'ゆーざーねーむ',
    password: 'パスワード'
)

wp.getPost(
    blog_id: 1,
    post_id: (ID数値)
)

 

 

実行!

 

 

エラー!

 

 

RuntimeError: HTTP-Error: 301 Moved Permanently

 

 

間違ってるのは「/wp」で、「/wp/xmlrpc.php」とPHPファイル自体を指定しないといけないのでした。

 

つまり、一つ目のスクリプトは「http://xxxx.com/xmlrpc.php」が存在しないと嘆き、二つ目のスクリプトは「http://xxxx.com/wp」というフォルダを参照してどないするんやという訴えかけであったと。

 

f:id:bukki:20160414162631p:plain

 

ブラウザで「http://(管理するWPサイトドメイン)/wp/xmlrpc.php」にアクセスした場合に下記のような一文が表示されていれば、在り処はそこだと分かりますね。


XML-RPC server accepts POST requests only.

 

一旦、使えるオブジェクトが手に入れば、後は下記ページなどを参照しつつ複数ページを取得したり更新などなどもお手の物。

 

 

rubypressでWordPressの情報をRubyから操作する | mah365

 

RubyからWordPressに記事を投稿する方法 | WEBとかアプリとかのメモ

 

rubypressを使うときにハマったところ(タグとカテゴリの部分)メモ。 - Qiita

 

 

そんなわけで、rubypressの世界へ向かう初めの一歩は無事踏み出されましたとさ。めでたしめでたし。

 

と言いたいところが。

 

xmlrpc.phpの脆弱性?

実はxmlrpc.phpは何度か攻撃対象になったことがあるみたいです。

 

WordPressのセキュリティ対策 xmlrpc.phpとwp-cron.phpの無効化 | モバイル・スマホ対策のSEO塾.com

 

悪用することができると。

 

 

WP REST APIによる連携法

だから、かどうだか知りませんが、外部プログラムとWordPressのAPI連携に関しては別口が開かれつつあるようです。

 

その筆頭くさいのが、「WP REST API(WP API)」。プログラム間でのデータ受け渡しに際して標準となっているJSON形式でデータ取得が可能(らしい)。

 

下記サイトが参考になるかと。

 

ECオーナー必見!WP-APIでWordPressのデータを外部サイトに表示する方法 | スマートフォン&モバイルEC事例ノウハウ集|モバイルファーストラボ

 

WordPress JSON REST API に OAuth でログインしてみた

 

 

その他の連携法

下記の記事では、WordPressをAPI化する方法が列挙されています。

 

WordPressをAPI化する5つの方法 - Qiita

 

「5つ」のうち、上記「2つ」は①と②に当たりますね。

 

③の自作プラグインに関しては下記の記事が参考になるかと。

 

[WordPress] 記事を JSON で出力する API ページを作る - rakuishi.com

 

 

現時点での個人的な感想としては、「WP REST API」が主流というかWP標準になるかなぁと思われます。開発言語を問わないJSON形式でのAPIが用いられるのではないかと。記事取得だけでなく、記事の更新もどうやらできるようですし(未実施)。

 

日本語で色々探ってみたい方は下記ページから辿ると良いかもしれません。

wp-kyoto.net