WP REST APIを利用して、外部(IoTデバイス)からWordPressに投稿する

以前「WP REST APIを利用して、情報を取得する方法」をご紹介しましたが、今回はワードプレスに投稿する必要性があった為、その内容を記事にしました。

実際にこれが出来る様になれば、外部から簡単に投稿出来る様になりますし、それこそ、数年前からブームになっているIoTデバイスから投稿と言う事も可能になります。

ちなみに今回参考にさせて頂いたソースは以下になります。

WordPress REST APIで投稿の取得から新規投稿を行う

 

WordPressの認証に関して

まず、外部からWordPressに投稿するには、認証の設定をする必要があります。

認証の種類は、以下の3つがあります。

  • クッキー認証
  • OAuth 認証
  • アプリケーションパスワードまたはベーシック認証

上記の内、どれがセキュリティ的に良いかという議論もあるかもしれませんが、とりあえず今回は置いておいて、ベーシック認証での実装をご紹介します。

なお、認証に関する詳細は、下記の公式ページに書いてあります。

WP REST API 公式サイト 認証ページ

 

WordPressをベーシック認証に対応させる

公式サイトには、ベーシック認証には、下記の2つのプラグインの内、いずれかをインストールして有効化する必要があると書いてあります。

ベーシック認証とアプリケーションパスワードは、HTTP Basic Authentication (published as RFC2617) を利用しており、Basic Auth plugin または Application Passwords plugin のどちらかを有効化する必要があります。

 

プラグインのインストール

実は両方とも最終更新日から結構時間が経っている為、インストールするのに抵抗があったのですが、評価が高く、更新日から新しい方の、「Application Passwords plugin」を選択しました。

管理画面のプラグインの新規追加から、「Application Passwords plugin」を検索して、インストール⇒有効化をします。

 

ベーシック認証パスワードの発行

プラグインを「有効化」した後、管理画面のユーザー⇒あなたのプロフィールをクリックします。

 

任意のユーザー名を入力して、「Add New」をクリックします。

 

「認証パスワード」が表示されるので、先ほど入力した「ユーザー名」と合わせて、どこかに控えておきます。

 

これで、ベーシック認証用のユーザーIDとパスワードの取得が完了しました。

 

記事の投稿側の処理の概要

記事を投稿する側の処理は、いろんなケースがありますが、今回は、IoTデバイス側で記事を生成して、WordPressサイトにPOSTすると言う事例です。

ちなみに、今回使用したIoTデバイスは、Raspberry Piを使用しました。Raspberry Piの詳細や概要は割愛しますが、Linuxをベースに動くマイコンになります。

主に、学習用やプロトタイプ、実験用のデバイスとして使用されています。

今回は、Raspberry Piで、温度などを測定(センシング)して、それを元に記事を生成して、WordPressに自動投稿する処理になります。

 

自動投稿のプログラム

自動投稿のプログラムの一部はこちらになります。ユーザーIDや認証パスワードは、base64でエンコードして使用する必要があります。

		  
		$base_url = 'WordPressサイトのURL';

		$data = [
			"title" => ”記事のタイトル”,
			"content" => "記事のコンテンツ",
			"slug" => ”記事のスラッグ”,
			"categories" => [5,10],//カテゴリー(IDを配列で格納)
			"status" => "publish"//公開
		];

		$header = [
			'Authorization: Basic ' . base64_encode( 'ユーザーID' . ':' . '認証パスワード' ),
			'Content-Type: application/json',
		];

		$curl = curl_init();

		curl_setopt($curl, CURLOPT_URL, $base_url.'/wp-json/wp/v2/posts');
		curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST'); // post
		curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data)); // jsonデータを送信
		curl_setopt($curl, CURLOPT_HTTPHEADER, $header); // リクエストにヘッダーを含める
		curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($curl, CURLOPT_HEADER, true);

		$response = curl_exec($curl);

		$header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE); 
		$header = substr($response, 0, $header_size);
		$body = substr($response, $header_size);
		$result = json_decode($body, true); 

		curl_close($curl);	

こんな感じで、必要な箇所を変更してもらえれば、自動で投稿するプログラムの出来上がりです。

今回の事例では、cronで、定期的に温度を測定して、その内容を投稿する処理を走らせる形となりました。

 

投稿内容のカスタマイズに関して

投稿の情報は、下記ソースの様に配列に入れて、JSON形式で作成して送信する形になりますが、どのフィールドが対応しているかは、公式サイトを確認してください。

		  
	$data = [
		"title" => ”記事のタイトル”,
		"content" => "記事のコンテンツ",
		"slug" => ”記事のスラッグ”,
		"categories" => [5,10],//カテゴリー(IDを配列で格納)
		"status" => "publish"//公開
	];
	

WP REST APIの公式ページ

 

WP REST APIを利用した失敗事例

ちなみに、REST APIを利用して自動投稿を試した時、一発で上手くは行きませんでした。

いろいろインターネットで探していましたが、一向に解決する糸口が見えない時、ふとっひらめきました。

もしかしたら、セキュリティ向上のプラグインが原因なんじゃないか?と言う事を。よくパソコンのアプリケーションの不具合に、ウイルスソフトが関係しているように。

試しに、「SiteGuard WP Plugin」を停止にしてみたら、見事、自動投稿が成功しました。

 

WP REST APIを利用してWordPressに投稿するのまとめ

REST APIが使える事で、WordPressをプラットフォームに、いろんなシステムを構築する事が可能となりました。

セキュリティ面で心配な面がありますが、とりあえず、記事を投稿する場合は、母体となるWordPressが、SSL/TLS化されている事は、最低限やっておくべき対策でしょう。

 

以上「WP REST APIを利用して、外部(IoTデバイス)からWordPressに投稿する」のご紹介でした。