WordPress REST API を使ってレーダーチャートを作ってみた

この記事は、デジタルキューブ & ヘプタゴン Advent Calendar 2022 4日目の記事です。ちょっと遅くなっちゃいました。

デジタルキューブの保守チームでお客様のウェブサイトの運用・保守のお手伝いをしているフロントエンドエンジニアの西村です。主にテーマ・プラグインのカスタマイズをやっています。

ネジが好きです

元単車屋です。

単車屋といっても偏っていまして、旧車の修理やレストアがメインでした。最近また人気が再燃しているようですが、ヨンフォア、Z400FX、CBX400F などなど当時から旧車扱いだったものばかり触っていました。

今は諸事情で単車に乗ることができなくなり、フォルクスワーゲンゴルフ1 カブリオレに乗っています。1.8 リッター SOHC エンジンです。SOHC 最高です。
乗り始めて 18年目になります。とにかく丈夫でパーツも未だ豊富に入手できます。
車体やエンジンを分解して並べて、指でオイルを塗りながらゆっくり組み上げるのが至福の時です。

旧車に限らずですが、車・単車ってネジが固着して回らなかったり以前の整備でネジの頭が潰れて工具でスムーズに緩めることができないものなどがあります。

それらをバーナーで炙ったり、ハンマーで殴ったり、削ったり、溶接したり、ありとあらゆる方法で緩めます。分解整備というよりこういった厄介な奴らを攻略する事に喜びを感じます。緩めた後のネジ穴の復旧も好きですね。

自分が一番好きなものは何か?を突き詰めて考えてみると車に乗ることよりネジを締めたり緩めたりすることが好き、に行き着きました。車に限らず緩んでいるネジを見つけるとつい手締めで限界まで締めます。先日はコワーキングスペースの背もたれのネジが緩んでいたので締めしました。思いっきり締めました。しばらくは大丈夫なはずです。

WordPress REST API 使ってレーダーチャート作成

WordPress REST API https://developer.wordpress.org/rest-api/

すっかり前置きが長くなりましたが、先日 WordPress REST API を使ってデータに基づいてレーダーチャートを出力させるタスクがありました。レーダーチャートはこんなやつ。

レーダーチャート。いい感じです。

このレーダーチャートのフレームワークには vega を使用しています。
A Visualization Grammar | Vega https://vega.github.io/vega/

データを可視化できるツールでレーダーチャート以外にも様々なタイプのグラフやチャートを表示させることができます。データは json 形式で読み込ませるタイプ。今回はカスタムエンドポイントを追加して、https://private.hibou-web.com/wp-json/vega/v1/chart/投稿ID へアクセスすると、投稿に紐づいくカスタムフィールドの値を基にレーダーチャートを作ってみます。

json ファイルがあればそれで OK なんですが、投稿毎に物理ファイルを作成してしまうよりエンドポイントへアクセスして動的に json を返せば良いのでは?とチームからアイディアをもらって実装しました。
チームほんとありがたいです。チームはいい。

register_rest_route

register_rest_route() | Function | WordPress Developer Resources https://developer.wordpress.org/reference/functions/register_rest_route/

WordPress の場合サイト URL + /wp-json/ へアクセスするとデフォルトで様々なデータへアクセスできることがわかります。レスポンスは json 。
例えば、https://自分のサイト/wp-json/ へアクセスしてみてください。

routes を見るとわかりやすい

register_rest_route はこの routes に独自のエンドポイントを追加することができる関数です。
今回は、ゴルフの各パーツのボルト・ナットの規定トルクをピックアップして可視化するエンドポイントを追加します。

register_rest_route(
  $namespace, ← torque/v1
  $route, ← /vega/(?P<id>\d+) 
  [
    'methods' => 'GET',
    'callback' => 'get_torque_data_json', ← コールバック (ここで json 作成)
  ]
);

https://domain/torque/v1/vega/post_id/number へアクセスすると、vega 用の json を返すよう作成します。こんな感じ。

add_action ( 'rest_api_init', 'golf_bolt_nut_torque_toute' );
function golf_bolt_nut_torque_toute () {
  register_rest_route (
    'torque/v1',
    '/vega/(?P<id>\d+)' 
    [
      'methods' => 'GET',
      'callback' => 'get_torque_data_json',
    ]
  );
}

function get_torque_data_json ( $data ) {
  $post_id = $data[id];
  $torque_data = get_post_meta( $post_id, 'torque_data', true );
  $vega_json = '';  

  if ( ! empty ( $torque_data ) ) {
    $connecting_rod_cap = $torque_data['connecting_rod_cap'];

    $vega_json .= '' . PHP_EOL;
    
    [vega の json 作成]
    ...
    ...
    ...
  }

  return $vega_json;
}

そしてチャート呼び出し。

<div id="view"></div>
<script>
  vegaEmbed(
    '#view',
    "<?php echo home_url( '/' ); ?>wp-json/torque/v1/vega/<?php echo get_the_ID(); ?>",
  );
</script>

カスタムエンドポイントをもっと使っていこう

カスタムエンドポイントを作成したら、パーマリンクのフラッシュが必要です。
ダッシュボード > 設定 > パーマリンク で更新ボタンをクリックすれば OK。

json ファイル作成はちょっと面倒ですが、物理ファイル不要なすっきりした構成にすることができました。

vega の json はこちらです。
興味ありましたら試してみてください。

https://vega.github.io/editor/#/url/vega/N4IgJAzgxgFgpgWwIYgFwhgF0wBwqgegIDc4BzJAOjIEtMYBXAI0poHsDp5kTykSArJQBWENgDsQAGhAATONABONHJnaT0AQQAEipLKSLtsQ5m1wAHkgQ4ANnCnaIMNgHca4stoQNbau3DasjQIcOIQ6hDaHtpIuvo0SLbatkgAnmwMmJTSIO6y9GgAzADsAAwy8DRkWGgATACcAGwyOPrBnmgNRTJIWWwRAF5waKCYaTgj6OISIzJQEphIHhBoIG2yHWQgAL4yEWTiSauoANqgR6FresEMqzIMOAaYU3k0BTDaBNp1lHUCuykF2sr1sHgUuUez1e+XoXx+uwAujJnigzsCruglkx7LliEkGBD0SAANZwNJrQAbDIBhhkAkwyAaoZAAsMgB+GPEEqZ1eZIF5kNiKCmoMp7UBkgUgemAA4ZALUMgGOGamAdYY2bZCcUuTy+QKhUDSeS1oB2hkAVwyAZ4ZAAMMgDWGQC3DNTAPUMSpVqE5ICg3PIGrQWpFuvQgGaGI1W2myhV2qYAFjVrv57uFOrFgCqGQAlDIBrhkAuwxGxUyfHKqYCcO8yOC6OitYJxOARYYjcG0GGnS685rC16QDSGSzK6gAIy5t0dhtiyWB9MgTP2no19X59u9-XG81W20Z9loTtjiMCyfaos+v10gdt6vO8drqfoEupwfD0NdifHkAl8tt5cH1dLnaI6OXUHgiAAWmxuIXWYnOcMZrKK35lA+ZQVCudZLlBN5ge2kHQU+sEdvBG6NmBdTIVea4YZ6YpgUUuEwd27YESB6BgSGpGoeRlGbjG34AgB9oUShtYMR6VHMRBbFTCUOZkfmQkIeS35IQJaBCXhMkCOJaTfjh0moLJIkCmJmFERJJGqep9GiQp2mgRJtH6cJhmacZhGmUprFDouamWVxRmKeBbYCJxh5oF57lSY5Wa+d5z6oH5JnURJKmBfaXlyWFPFMcRnkhWh4W2ZFSnmTF2apd26W8WBDkXsF8UFUlEn8Tl9QuT5Do2YVEkBSV9Xxf87nRS1-xtQ1FVKXp1WtRpNXudlXW1aF7URcxxVOd1w31a+74gnZ9wgGIDCKFArx-nMICYHo4QAGZ8ggaDAeMkxrEgZBkIofAvLkd2ZDgTACqcIFvm+2ofmsYLhN+oprRtW2fuICi-kgOJ7QdSDHad51jBMrw3XdD17c9jxvedn1Lci63OvYQEYijni+IYuSXa8OBsB4mC5IdZBTKABxHLYaynN+AAKACSji84igLrO0HjbIKlDCbIbDIB4oxyNyaL7VD-4gEdNBwLYsh2bsy2YiANyJOzMhU394IUzIjPM+t1RsxzFTxLcECC3sIDDIobBoAdhIyOINDbWgR3HA4cjS8sGigKiay7bkasa1r6AlS7Usy+IACyssFj9K3oAsth8pTyNrHyHRJLkydh3LkdYsre2x5raxWULlty1wiCvFZFE61nev-RDcNkOTigF1d6A03TDP91brOl+gnO8-zPPO60IudOLkuhxnEcK6b4M-tHMh1-HIE7LrYMQwbpfG4X6C9+b+uTy3NszyApz273TtC27HuoF7we+-7qBA62AgMHcum95ZLB3hDfeqt1b1wTouJOG804Zx4r9G+X5vy53zlfEeIBi4eEviHFOldt4YN3pDaGMc4FH0bi7ZuqAWawDbg3VyaRO4n3xmEBY8g5ZhBeEPRhIALCP0OM-d+QsBQsyfuzchEIT4u2QIoEkxN9rXxAJjHAuR0EiXVmtQYHh5AiI7Afd2Z0hGB22vTIRVclZUJ9tnVWSArFPXdljd6w03yKMMCoxGai8G920Y4qy35AmmOlqQyB6BLFwHpi7bhbBeFCP4XAQRoA6apJpqkR6QiWogFvooLBecQFaxdsY6RYjZEEySHAAAFAAcgvrYepjhngMAQJQC8ABKbQAAqYwAxanQBqQ0-ug8WlBG5O0ygoouldMkaI226Bhn2AaU0iZbSOndL6U4DwQzCZ1PqWM1IigNlTI6bM+ZLsIAHTYGSFuByG5sDzkPA+NDWE+WubcskAB1d4hRclOS1LA2wsimE1KeS86hccPnPhdmrUFAB5NoUA6BSMGmUSgRQFHRhNliSw9MHF6wvL+AlMczGRMViEwJ8TxA8KtiktJwjFnP02ZQERLt0XTyqWyikLsXgWGsRUpZIAhZJBtnLPJ21xACKFkwJAIDAmAqCugBA7xZC4nhTQUFkqnIgBxM4kkOtOG4vUYoXwe0dFNO-Hdd45KIk2LITGVYLsDHiCMe6GQCSkmgEZXLcpGLOW6pVcCiwOEhHcuuAkO4OyFgQH2SMo5ZMTlnMwNMy5kjw3CufgbGN-SIjiATaspNA8U2tPOTM8kcyhY3Pdvc5V9oQAAGIGitrbTW75cA-kfGDexHF2o8X7TJUS14YFUhMA1va8xW8onOs-oYywS4vV0sSQymVqT-UsqqbU3NUQADU2gBAlB6f0uNRbDnHMMKm9NVarkyC5TItYO7o37u0O2IoJ7dmFpWRe5NV7y1poubeoWAqhWwJhZlMVYJDh+JeDc66TB40-tGX+05AGb1pDmdoAAfNoXm8JOp6ulbK6MUq-WvhkPKxV4JYMKGsdU4tl60OTMA5WzDOHtBVTyZgNgWjcV0bWMhkt4z0NAfYwAXnE5xtsIA1WbE1dqPJTA2DYAiRRkFYLBr6tSFAI18LFg-LgNUWoDbXgzEUMgdm+mZUAGUaDDF7VMdsdR+1IwCTRkdRcsipNCR51WFLHWzutba0py76V8PXUyjJigskukc1AwwRSBhwFC8yix7z0BhoWeliDIA0g4S+XWq2eToNYDuukDtRXu0AtAC1ScCiB3qM0UEnumDDJ6NyG6j1gpwnTqcS4wLit36UJVjo4bMTCUaLca9DxjcvEyCUb44kg6wkgDG21thvnwZTspVAn8E2hberXbKoR0XYs5Nq3qgpSWSlCwDZG5ZByGnDfWaJzp7JP1nqE8Npj16xPVqDRGx9j3E0vYSEkP772syfoLee57mDftvYzYVu5xW9VNs2Jj1LtbUfVZgPFnsCivo7CAA

明日のアドベントカレンダーは?

@takagerbera さんで
「AWS re:Invent 5K RUN に参加しました」
です!

コメントを残す