wordpressの記事をAPI使って自動で投稿する(PHP)
WordPressって便利でSEOとかやりやすいしレイアウトも作りやすい。一番難しいのはコンテンツ作成で、記事作成ですよね。
例えば、コンテンツのネタ(データ)は、自動で貯まるんだけど、それを記事化するのがめんどい。そんな時にAPIを使って自動投稿した時のメモ
wordpressのrest apiをphpから叩いて記事を投稿するまでを投稿します。
1:APIを使う準備編
使う前に知っておきたいこと
APIはプログラムからwordpressの操作ができる。ということは、設定をミスったりすると非常にまずい状態になる。例えば、2017年にはWordPress REST APIの脆弱性が発覚、特定のリクエストをサーバーに送信することで、認証をすり抜けてウェブサイトを改ざんするコンテンツインジェクションが可能な状態になっていた。などの実例もある。
また、APIを使うことによって大量の記事を自動生成することも可能で、サーバーの負荷が高くなることがあります。例えば同じサーバに複数のwordpressを入れている場合、他のwordpressの挙動が遅くなる等があり得るため、コードの確認やサーバの監視はしっかりやっておいた方が良いです
アカウント作成
apiで投稿した記事の投稿者はapiで使ったユーザーになります。
なので、普段使っているユーザーとは別にapi用のユーザーを作成することをお勧めします。
ユーザーを作成したらユーザー編集画面の下の方の、アプリケーションパスワード発行から、API用のパスワードを発行します
「新しいアプリケーションパスワードを追加」を押すと、下記のようにパスワードが発行されるので、メモっておく
事前準備はこれで完了です。
2.画像をアップロードする
画像をアップロード
アップロードしたIDを取得
画像のIDをサムネイルに設定しつつ、記事を投稿
まずは全体のコード
<?php
# アップロードするwordpressのurl
$base_url = 'https://xxxxx.com';
# アップロードするファイルのある場所
$file_tmp = __DIR__ .'/download/tmp.jpg';
# 画像ファイル名
$file_name = "img.jpg";
$file_info = new finfo(FILEINFO_MIME_TYPE);
$file_mime = $file_info->file($file_tmp);
$request_header = [
'Authorization: Basic ' . base64_encode( '{API投稿用ユーザー名}' . ':' . '{設定したAPI用のパス}' ),
'Content-Disposition: attachment; filename="%s"'. $file_name,
'Content-Type: ' . $file_mime,
];
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $base_url.'/wp-json/wp/v2/media');
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($curl, CURLOPT_HTTPHEADER, $request_header);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($curl);
curl_close($curl);
$media_id = '';
if (empty($result)) {
echo "画像ID > 失敗 " . PHP_EOL;
end();
}
$media_id = json_decode($result, true)['id'];
echo "画像ID > " . $media_id . PHP_EOL;
?>
1.wordpressとファイルの情報を設定する
# アップロードするwordpressのurl
$base_url = 'https://xxxxx.com';
# アップロードするファイルのある場所
$file_tmp = __DIR__ .'/download/tmp.jpg';
# 画像ファイル名
$file_name = "img.jpg";
2.作ったユーザーのIDとAPI用のパス
$request_header = [
'Authorization: Basic ' . base64_encode( '{API投稿用ユーザー名}' . ':' . '{設定したAPI用のパス}' ),
'Content-Disposition: attachment; filename="%s"'. $file_name,
'Content-Type: ' . $file_mime,
];
3.API叩く
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $base_url.'/wp-json/wp/v2/media');
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($curl, CURLOPT_HTTPHEADER, $request_header);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($curl);
# var_dump($result);
curl_close($curl);
4.成功すれば、IDとかとかが返ってくるので取っておく
$media_id = '';
if (empty($result)) {
echo "画像ID > 失敗 " . PHP_EOL;
end();
}
$media_id = json_decode($result, true)['id'];
echo "画像ID > " . $media_id . PHP_EOL;
ここまでで画像投稿は完了。
3.記事を投稿する
1.記事テキストを用意する
$ArticleTitle = "記事タイトル";
$txt = "テスト投稿";
テキストはmarkdownが使えるので、いい感じにいじる。
wordpress側で記事のテンプレを作って、それをベースに書き換えると◎
2.パラメータ設定
$data = [
"title" => $ArticleTitle ,
"content" => $txt,
"slug" => '記事のスラッグ',
"status" => "publish",
"featured_media" => $media_id,
"comment_status" => "closed",
];
パラメータを設定する。
参考は下記
3.作ったユーザーのIDとAPI用のパス
$header = [
'Authorization: Basic ' . base64_encode( '{API投稿用ユーザー名}' . ':' . '{設定したAPI用のパス}' ),
'Content-Type: application/json',
];
4.API叩く
$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));
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);
5.成功すれば記事のIDが帰ってくる
if (!empty($result)) {
$article_id = $result['id'];
}
echo "記事ID > " . $article_id . PHP_EOL;
この記事が気に入ったらサポートをしてみませんか?