WordPress | wp_remote_post()で記事や固定ページを投稿する方法

2020-01-06WP REST API,WordPress

WordPress | wp_remote_post()で記事や固定ページを投稿する方法

WP REST API v2のwp_remote_post()API関数を使ってWordPressに記事や固定ページを投稿する方法の紹介とサンプルコードです。

wp_remote_post()で投稿するサンプルコード

require_once( '../wp-load.php' );
$url = 'https://example.com/wp-json/wp/v2/posts';
$username = 'xxxxx';
$password = 'xxxx xxxx xxxx xxxx xxxx xxxx';

$title = '記事タイトル';
$content = '記事本文';
$category_id = [1];
$tag_id = [1];
$slug = 'slug';

$response = wp_remote_post( $url, array(
	'headers' => array(
		'Authorization' => 'Basic ' . base64_encode( $username.':'.$password )),
		'body' => array(
			'title'   => $title,
			'status'  => 'draft',
			'content' => $content,
			'categories' => $category_id,
			'tags' => $tag_id,
			'slug' => $slug
		)
	));

	$response = $response['body'];
}

WP REST API v2の読み込む

require_once( '../wp-load.php' );

WP REST API v2を使うにあたって、wp-load.phpを読み込む必要があります。

APIのURLを指定する

$url = 'https://example.com/wp-json/wp/v2/posts';

APIのURLを指定します。
記事の場合はwp-json/wp/v2/posts、また固定ページの場合はwp-json/wp/v2/pagesを指定します。

※固定ページは方法が見つからず適当にそれっぽいとこ変えて試してみたらできただけなので、これが正解かは不明です。

ユーザー名とパスワードを指定する

WordPressに設定しているメインパスワードを公開せずにユーザーを認証するためのアプリケーション用の一意のパスワードを作成する必要があります。

当方は「Application Passwords」というプラグインを使って設定しています。

投稿データを作成する

タイトル、本文、カテゴリやタグの設定を作成します。
wp_remote_post()のbodyに指定可能なパラメータは以下の通りです。

title記事や固定ページのタイトルテキスト
status投稿ステータスpublish、future、draft、private、trash、auto-draft、inherit
content投稿本文テキスト
categoriesカテゴリーカテゴリID、複数時は配列やカンマ区切りで。
tagsタグタグID、複数時は配列やカンマ区切りで。
slugスラッグ名テキスト

投稿ステータス

投稿ステータス(status)オプション文字列の説明です。
投稿時のステータス状態を指定できます。

publish公開済み
future予約投稿
draft下書き
private非公開
trashゴミ箱
auto-draft自動保存
inherit継承

wp_remote_post()の返り値

$response['body’]とする事で、投稿の可否や結果を返り値として受け取る事が可能です。

返り値はjson形式で受け取ります。

新たに投稿した記事や固定ページのページIDが必要な場合は返り値のjsonをデコードすると$response['id’]という配列キーのデータに記事IDは入っています。

$response = json_decode($response['body'], true);
$post_id = $response['id'];

wp_remote_post()の注意点

そのままだとスラッグ名が重複した場合も複数作成される

wp_remote_post()で記事やカテゴリを作成した場合、スラッグ名の重複時も新たにページは作成されます。

返り値のjsonデータはそのままだと文字化けするのでデコードが必要

返り値のjsonデータはそのまま表示すると文字化けするのでデコードが必要になります。

bodyにdescriptionも指定できるけどGutenbergだと上手くいかないかも

bodyにdescriptionも指定可能ですが、何度かチャレンジしましたがGutenbergだからか上手くいかなかったので諦めました。

投稿と同時にカテゴリやタグを作成する場合は別途wp_insert_category()等を

投稿と同時にカテゴリやタグを作成する場合は別途wp_insert_category()やwp_create_term()を利用して先にカテゴリまたはタグを作成してそれぞれのIDを取得しておきます。

WordPressでPHPからカテゴリを作成・追加する方法 | ONE NOTES

WordPressでPHPからタグを新規作成・追加する方法 | ONE NOTES