Blog

GASを使ってWordPressに定期自動投稿する

スプレッドシートに、関数を使って動的な値を用意する。
そして、GASを使って、WordPressに毎日決まった時間になったら、自動的に投稿する
さらに、WordPress側の設定に合わせるために、「カスタム投稿、カテゴリ、カスタムフィールド」これにも、GASを使って自動的に投稿できたら、とても使い勝手の良い「スプレッドシート」が誕生する。
こんな素晴らしい”WordPress投稿ツール”を今回は作ってみた。

前提条件

  • WordPressサイトへの自動投稿を定期実行したい何かがある
  • 動的処理が可能なスプレッドシートから投稿したい
  • カスタムフィールドやカテゴリなどの細かなデータ処理もしたい

上記の目的が備わっていることが、前提条件となる。

STEP1.WordPress側の環境を整える

スプレッドシートで用意した内容を、カスタムフィールドとして受け取るための設定を、先にWordPress側で終わらせておく必要がある。

STEP1-1.functions.phpに下記のコードを追記する

  1. add_action( 'rest_api_init', 'create_api_posts_meta_field' );
  2. function create_api_posts_meta_field()
  3. {
  4.  register_rest_field(
  5.         ['post','wolight'], //投稿タイプのスラッグを指定。
  6.         'meta_field', //これは任意のキー名
  7.         array(
  8.  'get_callback' => 'get_post_meta_for_api',
  9.             'update_callback' => 'update_post_meta_for_api',
  10.  'schema' => null,
  11.  )
  12.  );
  13. }
  14. //取得(GET)時のオブジェクトにpostのメタをすべて追加
  15. function get_post_meta_for_api( $object ){
  16.  $post_id = $object['id'];
  17.  return get_post_meta( $post_id );
  18. }
  19. //投稿(POST)時のオブジェクトからメタを更新する
  20. function update_post_meta_for_api($value, $object, $fieldName){
  21.     foreach($value as $key => $val){
  22.                 $rtn = update_post_meta($object->ID, $key, $val);
  23.         if (!$rtn){
  24.             return false;
  25.         }
  26.     }
  27.     return $rtn;
  28. }

[06]行目では、投稿タイプのスラッグを指定している。サンプルコードでは、複数の投稿タイプを設定しているが、一つだけで良い場合は、[カッコ]を外して、’post’だけにすればよい。
こんな感じ↓

  1.  register_rest_field(
  2.         'post', //投稿タイプのスラッグを指定。
  3.         'meta_field', //これは任意のキー名
  4.         array(
  5.  'get_callback' => 'get_post_meta_for_api',
  6.             'update_callback' => 'update_post_meta_for_api',
  7.  'schema' => null,
  8.  )
  9.  );

STEP1-2.アプリケーションパスワードの設定

REST-APIという仕組みを使って、GAS(スプレッドシート)から、WordPressに直接投稿することができる。そのための設定として、外部のプログラムからWordPressにログインするための専用パスワードを発行する必要がある。

今回の事例で例えると、外部のプログラムが”GAS(スプレッドシート)”にあたる。GASがWordPressにログインするための、専用パスワードということになる。

設定方法は、下記の記事を参考にして欲しい↓

STEP1-3.カテゴリID、タグIDを控える

ここは少しアナログな過程となる。

GASから投稿する際に、「このセルは、このカテゴリに」という”カテゴリ・タグ指定”は、IDを指定して連携させることになる。

IDの使い方は、下の方で説明するが、まずはIDの確認方法を知るところから。

確認方法は、下記の記事を参考にして欲しい。※カテゴリもタグも同じ方法だ。

STEP2.スプレッドシートとGASを用意する

次は、いよいよスプレッドシートとGAS側の設定に移る。これが終われば、WordPressの定期自動投稿ツールが完成する。

STEP2-1.筆者が用意したスプレッドシートの雛形をコピーする

WordPress投稿の「投稿データベース」となるスプレッドシートを用意する。

習得後、ご自身でカスタマイズすればよいのだが、まずは下記のリンクを開き、左上のメニューから、コピーを作成して欲しい。

https://docs.google.com/spreadsheets/d/10vZk8v32Lvvzjp6SJ__phcvSj_yMwqrG_hmRpiFFS1A/edit?usp=sharing

筆者が作成した”雛形”をコピーできる。

STEP2-2.GoogleAppScriptの立ち上げ

下記の記事を参考にして、【STEP2-1】でコピーしたスプレッドシートから、スクリプトエディタを立ち上げる。

https://note.com/dxs/n/n95b7e2736417

STEP2-3.GASに下記コードをコピペして保存する

  1. function postwordpress() //スプレッドシートに入力した情報を元に、WordPressに自動投稿する
  2. {
  3.   var ss = SpreadsheetApp.openById("***************"); //スプレッドシートID
  4. var sheet = ss.getSheetByName('Post_to_Wordpress'); //マスタとなるページ
  5.   var data = sheet.getDataRange().getValues();
  6.   var dayStr = ["日", "月", "火", "水", "木", "金", "土"];
  7.   var now = new Date();
  8.   for (var i=1; i<data.length; i++) {
  9.     var [year, month, dayOfMonth, weekNum, dayOfWeek, hour, minute, siteUrl, user , pass , posttype , title , content , category, tag , field ,imgurl] = data[i];
  10.     // ユーザーIDとアプリケーションパスワードが空の場合はスキップ
  11.     if (user === "" || pass === "") { continue; }
  12.     if ( (year == now.getFullYear() || year === "")
  13.       && (month == now.getMonth() + 1 || month === "")
  14.       && (dayOfMonth == now.getDate() || dayOfMonth === "")
  15.       && (weekNum == parseInt(now.getDate() / 7) + 1 || weekNum === "")
  16.       && (dayOfWeek === dayStr[now.getDay()] || dayOfWeek === "")
  17.       && (hour == now.getHours() || hour === "")
  18.       && (minute == now.getMinutes() || minute === "")
  19.     )
  20.    var apiUrl = siteUrl + 'wp-json/wp/v2/' + posttype;
  21.     var headers = {
  22.         'Content-Type': 'application/json',
  23.         'Authorization': 'Basic ' + Utilities.base64Encode(user + ":" + pass)
  24.     };
  25.     //画像をアップロードする
  26.     var imageID = postImage(siteUrl, user, pass, imgurl);
  27.     //アップロードした結果の画像IDを取得
  28.     imageID = Number(imageID["id"])
  29.     var arguments = {
  30.         'title': title,//タイトル
  31.         'content': content,//記事本文
  32.         'featured_media': imageID,//アイキャッチ画像
  33.         'status': 'publish',//公開ステータス
  34.         'comment_status': 'closed',//コメント設定
  35.     'meta_field':
  36.     {
  37.       'name': field,
  38.       'phone_number': '040-8090-9719'
  39.     },//カスタムフィールド
  40.     'categories': [category],//カテゴリ
  41.     'tags': [tag]//タグ
  42.     }
  43.     var options = {
  44.         'method': 'POST',
  45.         'muteHttpExceptions': true,
  46.         'headers': headers,
  47.         'payload': JSON.stringify(arguments)
  48.     };
  49.     UrlFetchApp.fetch(apiUrl, options);
  50.     
  51.   }}
  52. function postImage(siteUrl, user, pass, imageUrl) {
  53.     var apiUrl = siteUrl + 'wp-json/wp/v2/media';
  54.     var headers = {
  55.         'Content-Type': 'image/png',
  56.         'Content-Disposition': 'attachment;filename=画像のファイル名.png',
  57.         'accept': 'application/json',
  58.         'Authorization': 'Basic ' + Utilities.base64Encode(user + ":" + pass)
  59.     };
  60.     var options = {
  61.         'method': 'POST',
  62.         'muteHttpExceptions': true,
  63.         'headers': headers,
  64.         'payload': UrlFetchApp.fetch(imageUrl)
  65.     };
  66.     var response = UrlFetchApp.fetch(apiUrl, options);
  67.     var responseJson = JSON.parse(response.getContentText());
  68.     return responseJson;
  69. }

STEP2-4.テスト実行に必要箇所を入力する

スプレッドシートの値を編集

STEP2-1で複製したスプレッドシートの中身を編集し、テスト投稿出来る状態にする。編集すべき箇所がこちら↓

  • A〜G列:とりあえず空白のままでOK。ここの使い方は、記事の最後に紹介。
  • H列:WEBサイトのURL
  • I列:WordPressにログインするユーザー名
  • J列:STEP1-2.で設定したアプリケーションパスワード
  • K列:今回投稿する先の投稿タイプslug
    ※デフォルトの投稿タイプを設定する場合、「post」ではなく、「posts」。
  • L・M列:投稿タイトルと投稿本文
  • N・O列:STEP1-3.で控えた、カテゴリとタグのID
    ※もし、カテゴリやタグの設定をしないのであれば、GASの45,46行目をコメントアウトする必要がある
  • P列:カスタムフィールドとして入れる値。
    ※今回はとりあえず一つだけ。複数入れる場合、その分だけ、列を増やす必要がある
  • Q列:アイキャッチ画像として入れ込む画像URL。画像URLなので、WEB上に存在している画像でなければならない。

GASの編集

STEP2-3.でコピペしたGASを編集する

  • 3行目:STEP2-1.で複製したスプレッドシートのID

    Share It

    英語圏はデジタルツールの宝の山です。日本だと月額数千円とするツールが、0円で同じ効果をもたらしてくれます。アップセットは、「知らない」お客様に、こうした価値のあるツールを、ご提供します。

    Company