Google マイビジネスの営業時間をPHPでウェブページに埋め込む方法

Google Maps Platform の、Places API を活用すると、Google マイビジネスに掲載している営業時間をウェブページに埋め込めます。

何かと営業時間に変化が起きがちな昨今ですが、店舗オーナーがGoogle マイビジネスを更新することで、自動的にウェブページの営業時間も更新できるようになります。

目次

免責

「やってみたら動いたよ」の段階で記事を書いています。何かを間違えている可能性もあります。試す場合は自己責任でお試しください🙇‍♀️

前提

  • PHPが動く環境(レンタルサーバーなど)がある
  • Google マイビジネスに営業時間を登録済み

STUDIOなどPHPを動かせない環境であっても、別途用意したレンタルサーバーにUPしたファイルをiframeで読み込むことで使えます。

Places APIについて

Places APIは有償のサービスです。

利用にあたり、クレジットカードを紐付ける必要があります。

ただし、毎月$200までは無料で使えますので、小規模なサイトであれば無料の範囲で使えそうです。

利用登録する

Google Maps Platformにアクセスして、「始める」をクリックします。

初めて利用する場合にはクレジットカードの紐付けをうながされます。

Google Maps Platformのトップページ

プロジェクトを作成する

まだ作成していない場合は、プロジェクトを作成します。

ウェブサイト名など、わかりやすいプロジェクト名で作りましょう。

Places APIを有効にする

作成したプロジェクトにて、Places APIを有効にします。

APIとサービス→ライブラリをクリックして「Places API」を検索し、有効にします。

APIとサービス→ライブラリ

キーを取得する

APIとサービス→認証情報→認証情報を作成→APIキーをクリックします。

「自分のAPIキー」をコピーするためのモーダルが出てきますので、コピーしてわかりやすい場所にメモしておきます。

テストが終わったらAPIキーには適切な制限をかけて、不正アクセスを予防しましょう。アクセス元のサーバのIPアドレス等を入力します。

APIとサービス→認証情報→認証情報を作成

Places IDを取得する

営業時間を表示したい場所のPlace IDを取得します。

Place IDsページにて、表示したい場所の名称(例:六義園、東京タワー)を入力し、出てきた場所をクリックします。

※リターンキーを押すのではなく、選択肢をクリックする

表示したい場所の名称(六義園)を入力中の様子

クリックすると その場所のPlace ID が表示されますので、わかりやすい場所にメモしておきます。

Place IDをハイライトしている

JSONを取得してみる

さて、営業時間のJSON情報を取得してみましょう。

【Place ID】と【APIキー】をメモしていた情報に書き換えて、ブラウザでアクセスします。

パラメータに関する詳細は Place Details に掲載されています。

https://maps.googleapis.com/maps/api/place/details/json?place_id=【Place ID】&key=【APIキー】&fields=opening_hours,business_status&language=ja

下記のような文字列が表示されたら成功です。

{
   "html_attributions" : [],
   "result" : {
      "business_status" : "OPERATIONAL",
      "opening_hours" : {
         "open_now" : true,
         "periods" : [
            {
               "close" : {
                  "day" : 0,
                  "time" : "2000"
               },
               "open" : {
                  "day" : 0,
                  "time" : "0900"
               }
            },
            {
               "close" : {
                  "day" : 1,
                  "time" : "2000"
               },
               "open" : {
                  "day" : 1,
                  "time" : "1000"
               }
            },
            {
               "close" : {
                  "day" : 2,
                  "time" : "2000"
               },
               "open" : {
                  "day" : 2,
                  "time" : "1000"
               }
            },
            {
               "close" : {
                  "day" : 3,
                  "time" : "2000"
               },
               "open" : {
                  "day" : 3,
                  "time" : "1000"
               }
            },
            {
               "close" : {
                  "day" : 4,
                  "time" : "2000"
               },
               "open" : {
                  "day" : 4,
                  "time" : "1000"
               }
            },
            {
               "close" : {
                  "day" : 5,
                  "time" : "2000"
               },
               "open" : {
                  "day" : 5,
                  "time" : "1000"
               }
            },
            {
               "close" : {
                  "day" : 6,
                  "time" : "2000"
               },
               "open" : {
                  "day" : 6,
                  "time" : "0900"
               }
            }
         ],
         "weekday_text" : [
            "月曜日: 10時00分~20時00分",
            "火曜日: 10時00分~20時00分",
            "水曜日: 10時00分~20時00分",
            "木曜日: 10時00分~20時00分",
            "金曜日: 10時00分~20時00分",
            "土曜日: 9時00分~20時00分",
            "日曜日: 9時00分~20時00分"
         ]
      }
   },
   "status" : "OK"
}

臨時休業中の場合は、下記のような結果になるでしょう。

{
   "html_attributions" : [],
   "result" : {
      "business_status" : "CLOSED_TEMPORARILY"
   },
   "status" : "OK"
}

PHPで処理する

あとはこのJSONを煮るなり焼くなりしてページに表示させます。

営業時間リストをそのまま表示する例

例えばこんな、営業時間のリストを表示するパターン。

phpファイルをインクルードするか、あるいはそのままページ中にPHPを書き込み、必要な場所に表示します。

※HTMLやPHPはいい感じに書き換えて使ってください。

<?php
$json = getJsonFromApi(); // JSONデータを取得

// 営業中なら営業時間を取得する
if ($json["result"]["business_status"] == 'OPERATIONAL'){
  $json = $json["result"]["opening_hours"]["weekday_text"];

  echo '<ul>';
  foreach ($json as &$line) {
    echo '<li>'. $line . '</li>';
  }
  echo '</ul>';

}

// 臨時休業中は臨時休業のお知らせを掲載
else if ($json["result"]["business_status"] == 'CLOSED_TEMPORARILY'){
  echo "臨時休業中";
}

// 状況を取得できなければエラーを表示する
else {
  echo $json["error_message"];
}


/*
 * JSON を Place API から取得する
 */
function getJsonFromApi()
{
  $apiUrl = 'https://maps.googleapis.com/maps/api/place/details/json?place_id=【Place ID】&key=【APIキー】&fields=opening_hours,business_status&language=ja';
  $ch = curl_init($apiUrl);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  $response = curl_exec($ch);
  curl_close($ch);
  $json = trim($response);
  return json_decode($json, true);
}
?>

今日の営業時間を表示する例

アクセスした日の営業時間を表示します。曜日を頼りに「本日」を決めています。

<?php

$today = date('w'); // 今日の曜日を取得
$json = getJsonFromApi(); // JSONデータを取得
$isOpen = $openHour = $openMin = $closeHour = $closeMin = null;
$message = null;

// 営業中なら営業時間を取得する
if ($json["result"]["business_status"] == 'OPERATIONAL'){
  $json =$json["result"]["opening_hours"]["periods"];
  // 今日と同じ曜日の営業時間を取得する
  for ($i = 0; $i < count($json); $i++) {
    if ($json[$i]["open"]["day"] == $today){
      $isOpen = true;
      $open = $json[$i]["open"]["time"];
      $openHour = substr($open, 0, 2);
      $openMin = substr($open, 2, 4);
      $close = $json[$i]["close"]["time"];
      $closeHour = substr($close, 0, 2);
      $closeMin = substr($close, 2, 4);
    }
  }
  if ($isOpen){
    $message = "本日営業しています(".$openHour.':'.$openMin. '〜' . $closeHour.':'.$closeMin.')';
  } else{
    $message = "本日はお休みです";
  }
}
// 臨時休業中は臨時休業のお知らせを掲載
else if ($json["result"]["business_status"] == 'CLOSED_TEMPORARILY'){
  $message = "本日は臨時休業です";
}
// 状況を取得できなければエラーを表示する
else {
  $message = $json["error_message"];
  echo $message;
  exit;
}

// メッセージを表示
echo $message;

/*
 * JSON を Place API から取得する
 */
function getJsonFromApi()
{
  $apiUrl = 'https://maps.googleapis.com/maps/api/place/details/json?place_id=【Place ID】&key=【APIキー】&fields=opening_hours,business_status&language=ja';
  $ch = curl_init($apiUrl);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  $response = curl_exec($ch);
  curl_close($ch);
  $json = trim($response);
  return json_decode($json, true);
}
?>

APIへのアクセス数を減らしたい場合

Places APIは従量課金のため、アクセスが多くなるほど利用料金が高くなっていきます。

できるだけAPIからの情報取得を頻度を減らしたい場合、下記の方法も取れます。

  • PHPファイルでインクルード用の静的ファイルを書き出す
  • 表示したい場所にてインクルード用の静的ファイルを読み込む
  • CRONで定期的に静的ファイルの情報を書き換える(1日に1回、1時間に1回など)

インクルード用のファイルを出力する

空の today.inc ファイルを作成し、書き込めるようにtoday.incの権限設定を変更します(おそらく必要な作業だと思います…666?)

today.inc に対して、本日の営業時間と、HTMLコメントにて更新時刻を出力する内容です。

<?php
$updatedTime = date('Y年m月d日 H時i分s秒 時点の営業時間');
$today = date('w'); // 今日の曜日を取得
$json = getJsonFromApi(); // JSONデータを取得
$isOpen = $openHour = $openMin = $closeHour = $closeMin = null;
$message = null;

// 営業中なら営業時間を取得する
if ($json["result"]["business_status"] == 'OPERATIONAL'){
  $json =$json["result"]["opening_hours"]["periods"];
  // 今日と同じ曜日の営業時間を取得する
  for ($i = 0; $i < count($json); $i++) {
    if ($json[$i]["open"]["day"] == $today){
      $isOpen = true;
      $open = $json[$i]["open"]["time"];
      $openHour = substr($open, 0, 2);
      $openMin = substr($open, 2, 4);
      $close = $json[$i]["close"]["time"];
      $closeHour = substr($close, 0, 2);
      $closeMin = substr($close, 2, 4);
    }
  }
  if ($isOpen){
    $message = "本日営業しています(".$openHour.':'.$openMin. '〜' . $closeHour.':'.$closeMin.')';
  } else{
    $message = "本日はお休みです";
  }
}
// 臨時休業中は臨時休業のお知らせを掲載
else if ($json["result"]["business_status"] == 'CLOSED_TEMPORARILY'){
  $message = "本日は臨時休業です";
}
// 状況を取得できなければエラーを表示する
else {
  $message = $json["error_message"];
}

/*
 * 掲示内容をインクルード用ファイルに書き込む
 */
$message = $message . '<!-- '. $updatedTime . '-->';
$result = file_put_contents("today.inc", $message);
if ($result){
  echo "更新しました";
}else{
  echo "ファイルに書き込めませんでした";
}

/*
 * JSON を Place API から取得する
 */
function getJsonFromApi()
{
  $apiUrl = 'https://maps.googleapis.com/maps/api/place/details/json?place_id=【Place ID】&key=【APIキー】&fields=opening_hours,business_status&language=ja';
  $ch = curl_init($apiUrl);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  $response = curl_exec($ch);
  curl_close($ch);
  $json = trim($response);
  return json_decode($json, true);
}
?>

インクルードする

上記のPHPにアクセスして、無事に today.inc が出力できたら、表示したい場所にて today.inc をインクルードします。

CRONを設定する

レンタルサーバのコントロールパネル等で、CRONを設定します。

例として、さくらサーバの新コントロールパネルではスクリプト設定→CRON設定から、新しいCRON設定を追加できます。


さくらサーバにてwgetで更新する場合は下記のような設定を追加します。

/usr/local/bin/wget 'https://○○○/getSchedule.php' -q -O /dev/null

これを適切な時刻に動作させて、営業時間情報を定期的に書き換えます。

2021年12月30日追記

Google マイビジネスはGoogle ビジネス プロフィールに名称が変わったようです。

また、Google Maps APIでは「特別営業時間(special hours)」の取得に対応していないようです。

2016年から特別営業時間への対応を求める声が上がっていますが、いまだリクエストが通っていないようです。

Google My Business API(こちらは名称そのまま?)では「特別営業時間」を取得できそうですが、利用するには審査が必要なようです。

  1. 雑記
  2. Google マイビジネスの営業時間をPHPでウェブページに埋め込む方法