Blog

WordPressでオリジナルAPI(エンドポイント)を作って、GASでスプレッドシートに書き出す方法

  • カスタム投稿タイプ
  • 投稿者情報
  • カスタムフィールド
  • カスタムカテゴリー(カスタムタクソノミー)
  • その他必要なWordpress内の情報

WordPress内の指定した全ての投稿の、上記のようなデータをスプレッドシートに書き出して、Wordpressとリアルタイム同期出来たら、とても汎用性が広がると思いませんか?

簡単にできるので、今回は、そのやり方を説明します。

STEP.1:プラグイン「Code Snippets」をインストールして有効化する

Code Snippets をWordpressにインストールします。インストール方法や使い方は、ググったら出てきますので、色んな方が投稿してる記事をご参照ください。

functions.phpにとあるコードを記述する必要があるのですが、そのfunctions.phpに記述する方法として、筆者が一番推奨している方法となるため、Code Snippets をインストールしてください。

STEP.2:「Code Snippets」に以下のコードをコピペして有効化する

function add_rest_original_endpoint(){
    
    //エンドポイントを登録(カスタムAPIとなるURLのこと)
    //ここで設定したページが「あなたのサイトトップページURL/wp-json/wp/custom/posts_meta_array」
    register_rest_route( 'wp/custom', '/posts_meta_array', array(
    'methods' => 'GET',
    //エンドポイントにアクセスした際に実行される関数
    'callback' => 'get_posts_meta_array',
    ));
    
}
add_action('rest_api_init', 'add_rest_original_endpoint');

//この下の関数が、上のエンドポイントアクセス時に呼び出される関数です
function get_posts_meta_array() {
    $postargs = array(
        'post_type' => 'task', //指定した投稿タイプ※今回は「task」というカスタム投稿タイプ
        'posts_per_page' => -1 // 全ての投稿を取得※件数指定するなら、その指定数値を入力
    );
    $post_list = get_posts($postargs);
    
    $result = array();
    foreach ($post_list as $tmppost) {
        $memo = get_post_meta($tmppost->ID, 'memo', true); //memo というカスタムフィールドのデータを取得
		$salesman = get_post_meta($tmppost->ID, 'salesman', true); //salesman というカスタムフィールドのデータを取得
		$company_kana = get_post_meta($tmppost->ID, 'company_kana', true); //company_kana というカスタムフィールドのデータを取得
		
		 $recruitment_terms = wp_get_post_terms($tmppost->ID, 'recruitment'); //recruitment というカスタムカテゴリーのデータを取得

        // ユーザー名を取得
        $author_name = get_userdata($tmppost->post_author)->display_name;
        $last_modified_author_name = get_userdata(get_post_meta($tmppost->ID, '_edit_last', true))->display_name;

        array_push($result, array(
            'post_id' => $tmppost->ID, //投稿ID
            'author_name' => $author_name, // 投稿者のユーザー名
            'last_modified_author_name' => $last_modified_author_name, // 最終更新者のユーザー名
            'title' => $tmppost->post_title, //投稿タイトル
            'date' => $tmppost->post_date, //投稿日
            'last_modified_date' => $tmppost->post_modified, //最終更新日
			'recruitment' => array_map(function($term){ return $term->name; }, $recruitment_terms), // 「recruitment」タクソノミーの名前,
           	'memo' => $memo, //memo というカスタムフィールドの値
			'salesman' => $salesman, //salesman というカスタムフィールドの値
			'company_kana' => $company_kana //最後はカンマをつけないように注意
        ));
    }

    // 結果を最終更新日で並べ替え※筆者がそうしたかっただけなので、並べ替えの必要が無ければ、下の3行は削除してOK
    usort($result, function($a, $b) {
        return strtotime($b['last_modified_date']) - strtotime($a['last_modified_date']);
    });

    return json_decode(json_encode($result, JSON_UNESCAPED_UNICODE), true);
}

筆者は、カスタム投稿タイプ「task」の投稿情報に含まれる、カスタムフィールドだったり、カテゴリーだったりと、各種情報を取得したかったので、上記の設定になっています。過不足があれば、該当の個所をコピーして増やしたり、削除したり、してください。

ここでの操作で、上記5行目で設定したURLにアクセスすると、テキストが羅列されたページにアクセスできます。

カスタムAPI(エンドポイント)の完成です。

そして次は、APIとスプレッドシートを接続する作業です。

STEP.3:スプレッドシートとGASを用意しよう

同期先のスプレッドシートとして、スプレッドシートを用意してください。新規でも、既存でもどちらでもOK。
GAS(スクリプト)の立ち上げは、「GAS 始め方」などでググってください。

とりあえず、挙動を確認するために、新規でスプレッドシートを立ち上げることをお勧めします。

STEP.4:GASに以下のコードをコピペして、実行してみよう

function fetchValues() {
  var requestUrl = "あなたのサイトトップページURL/wp-json/wp/custom/posts_meta_array";
  var response = UrlFetchApp.fetch(requestUrl);
  var res = JSON.parse(response.getContentText());
  var values = res.map(content => {
    return [
      content.post_id,
      content.title,
      content.recruitment,
      content.author_name,
      content.last_modified_author_name,
      content.date,
      content.last_modified_date,
      content.memo,
      content.salesman,
      content.company_kana,
    ]
  });
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  sheet.getRange(2,1,values.length,values[0].length).setValues(values);
};

7行目からが、大事なポイントです。

細かい理解は不要なので、「content. ~」の部分が、STEP.2の35行目からとリンクしていると思ってください。

「content. ~」の数と、STEP.2の35行目からの「’post_id’ => $tmppost->ID,」の個数が一致するように、確認したら、保存してください。

そして、実行しましょう。

新しく立ち上げたスプレッドシートに、Wordpressの投稿情報が同期されるはずです。