見出し画像

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用のパスワードを発行します


パスワード名は何をするapi用か入れる(これ自体はパスワードでもなんでもないので日本語でOK)

「新しいアプリケーションパスワードを追加」を押すと、下記のようにパスワードが発行されるので、メモっておく


発行されたパスワードは必ずメモる(後で見れない)

事前準備はこれで完了です。

2.画像をアップロードする

  1. 画像をアップロード

  2. アップロードしたIDを取得

  3. 画像の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;


この記事が気に入ったらサポートをしてみませんか?