- カスタム投稿タイプ
- 投稿者情報
- カスタムフィールド
- カスタムカテゴリー(カスタムタクソノミー)
- その他必要な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の投稿情報が同期されるはずです。