この記事はWanoグループ Advent Calendar 2020 の11日目です。
他所との連携でjson形式でやり取りしたい!というパターンが増えて来たので備忘録がてら。
WP REST APIを使え?
当然そちらのほうがスマートなんですが、Wordpressがメジャーすぎてアップデートの度にすぐにゼロデイ攻撃の対象になるので__セキュリティをガッチガチに固めてからでないと__怖くて使えません…
(もう3年も前なんですねREST APIの脆弱性攻撃)
要件
- パラメータで「何件取得するか、何ページ目を取得するか」を設定可能にしたい
- カスタムフィールドごと突っ込みたい
コード
まず適当にjson_api
のような固定ページを作成し、
対象のテンプレートを下記のように記述。
<?php
//getパラメータを取得
$ppp = $_GET["ppp"]; // 1ページ当たりの取得件数
$cp = $_GET["cp"]; // 何ページ目を持ってくるか
$args = array(
'post_type' => array('post'), // 取得する投稿タイプをarray内に記載
'post_status' => 'publish',
'orderby' => 'post_date',
'order' => 'DESC',
'posts_per_page' => $ppp,
'paged' => $cp,
);
$the_query = new WP_Query($args);
if($the_query->have_posts()) {
$count = 0;
while ($the_query->have_posts()) {
$the_query->the_post();
setup_postdata($post);
$custom = get_post_custom($post->ID);
$json[$count] = $post;
$json[$count]->custom = $custom;
$count++;
}
}
header("Content-Type: application/json; charset=utf-8");
echo json_encode($json,JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
?>
出力
上記で /json-api/?ppp=10&cp=1
とパラメータを指定してアクセスすると出力されます。
[
{
"ID": 1,
"post_author": "1",
"post_date": "2020-12-10 12:12:12",
"post_date_gmt": "2020-12-10 12:12:12",
"post_content": "記事本文",
"post_title": "記事タイトル",
~~~
"custom": {
"post_thumb": [
"hoge"
],
}
},
{
"ID": 2,
"post_author": "1",
"post_date": "2020-12-10 12:12:12",
"post_date_gmt": "2020-12-10 12:12:12",
"post_content": "記事本文",
"post_title": "記事タイトル",
~~~
"custom": {
"post_thumb": [
"hoge"
],
}
}
}
最後に
これで大概のwordpressの投稿データはどこかしらにぶん投げられます。
WP_QUERY
のクエリの部分を変更すれば他にもカテゴリでのフィルタだったり投稿日時でのフィルタだったりをパラメータ指定できるようにも改造可能になっています。
くれぐれもセキュリティにはご用心を!
===================================
Wanoは積極的にエンジニア採用を行なっています!
まずはオンラインでVPoEとのカジュアル面談から。お好きな入り口からお気軽にお声がけください!
Wano Recruitページ https://group.wano.co.jp/recruit/
QiitaJobs https://jobs.qiita.com/employers/wano-inc/postings/1297
Wantedly https://www.wantedly.com/companies/wano/projects
Findy https://findy-code.io/companies/522