スプレッドシートに、関数を使って動的な値を用意する。
そして、GASを使って、WordPressに毎日決まった時間になったら、自動的に投稿する。
さらに、WordPress側の設定に合わせるために、「カスタム投稿、カテゴリ、カスタムフィールド」これにも、GASを使って自動的に投稿できたら、とても使い勝手の良い「スプレッドシート」が誕生する。
こんな素晴らしい”WordPress投稿ツール”を今回は作ってみた。
前提条件
- WordPressサイトへの自動投稿を定期実行したい何かがある
- 動的処理が可能なスプレッドシートから投稿したい
- カスタムフィールドやカテゴリなどの細かなデータ処理もしたい
上記の目的が備わっていることが、前提条件となる。
STEP1.WordPress側の環境を整える
スプレッドシートで用意した内容を、カスタムフィールドとして受け取るための設定を、先にWordPress側で終わらせておく必要がある。
STEP1-1.functions.phpに下記のコードを追記する
- add_action( 'rest_api_init', 'create_api_posts_meta_field' );
- function create_api_posts_meta_field()
- {
- register_rest_field(
- ['post','wolight'], //投稿タイプのスラッグを指定。
- 'meta_field', //これは任意のキー名
- array(
- 'get_callback' => 'get_post_meta_for_api',
- 'update_callback' => 'update_post_meta_for_api',
- 'schema' => null,
- )
- );
- }
- //取得(GET)時のオブジェクトにpostのメタをすべて追加
- function get_post_meta_for_api( $object ){
- $post_id = $object['id'];
- return get_post_meta( $post_id );
- }
- //投稿(POST)時のオブジェクトからメタを更新する
- function update_post_meta_for_api($value, $object, $fieldName){
- foreach($value as $key => $val){
- $rtn = update_post_meta($object->ID, $key, $val);
- if (!$rtn){
- return false;
- }
- }
- return $rtn;
- }
[06]行目では、投稿タイプのスラッグを指定している。サンプルコードでは、複数の投稿タイプを設定しているが、一つだけで良い場合は、[カッコ]を外して、’post’だけにすればよい。
こんな感じ↓
- register_rest_field(
- 'post', //投稿タイプのスラッグを指定。
- 'meta_field', //これは任意のキー名
- array(
- 'get_callback' => 'get_post_meta_for_api',
- 'update_callback' => 'update_post_meta_for_api',
- 'schema' => null,
- )
- );
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に下記コードをコピペして保存する
- function postwordpress() //スプレッドシートに入力した情報を元に、WordPressに自動投稿する
- {
- var ss = SpreadsheetApp.openById("***************"); //スプレッドシートID
- var sheet = ss.getSheetByName('Post_to_Wordpress'); //マスタとなるページ
- var data = sheet.getDataRange().getValues();
- var dayStr = ["日", "月", "火", "水", "木", "金", "土"];
- var now = new Date();
- for (var i=1; i<data.length; i++) {
- var [year, month, dayOfMonth, weekNum, dayOfWeek, hour, minute, siteUrl, user , pass , posttype , title , content , category, tag , field ,imgurl] = data[i];
- // ユーザーIDとアプリケーションパスワードが空の場合はスキップ
- if (user === "" || pass === "") { continue; }
- if ( (year == now.getFullYear() || year === "")
- && (month == now.getMonth() + 1 || month === "")
- && (dayOfMonth == now.getDate() || dayOfMonth === "")
- && (weekNum == parseInt(now.getDate() / 7) + 1 || weekNum === "")
- && (dayOfWeek === dayStr[now.getDay()] || dayOfWeek === "")
- && (hour == now.getHours() || hour === "")
- && (minute == now.getMinutes() || minute === "")
- )
- var apiUrl = siteUrl + 'wp-json/wp/v2/' + posttype;
- var headers = {
- 'Content-Type': 'application/json',
- 'Authorization': 'Basic ' + Utilities.base64Encode(user + ":" + pass)
- };
- //画像をアップロードする
- var imageID = postImage(siteUrl, user, pass, imgurl);
- //アップロードした結果の画像IDを取得
- imageID = Number(imageID["id"])
- var arguments = {
- 'title': title,//タイトル
- 'content': content,//記事本文
- 'featured_media': imageID,//アイキャッチ画像
- 'status': 'publish',//公開ステータス
- 'comment_status': 'closed',//コメント設定
- 'meta_field':
- {
- 'name': field,
- 'phone_number': '040-8090-9719'
- },//カスタムフィールド
- 'categories': [category],//カテゴリ
- 'tags': [tag]//タグ
- }
- var options = {
- 'method': 'POST',
- 'muteHttpExceptions': true,
- 'headers': headers,
- 'payload': JSON.stringify(arguments)
- };
- UrlFetchApp.fetch(apiUrl, options);
-
- }}
- function postImage(siteUrl, user, pass, imageUrl) {
- var apiUrl = siteUrl + 'wp-json/wp/v2/media';
- var headers = {
- 'Content-Type': 'image/png',
- 'Content-Disposition': 'attachment;filename=画像のファイル名.png',
- 'accept': 'application/json',
- 'Authorization': 'Basic ' + Utilities.base64Encode(user + ":" + pass)
- };
- var options = {
- 'method': 'POST',
- 'muteHttpExceptions': true,
- 'headers': headers,
- 'payload': UrlFetchApp.fetch(imageUrl)
- };
- var response = UrlFetchApp.fetch(apiUrl, options);
- var responseJson = JSON.parse(response.getContentText());
- return responseJson;
- }
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