Steamer Lane Studio技術備忘録ユーティリティ

Google ビジネスプロフィールのクチコミと評価を取り込む

utility Google ビジネスプロフィールのクチコミと評価を取り込む
作成日: 2024年8月24日

嫌いなAPI使う系。
だがGoogleのクチコミ偏重に応じるためにどこかの案件で追加することにした。
追加とともに(今のアルゴリズムだとあまり意味はなさそうだが)descriptinに「クチコミを案内」とか書いておく。

必要要件として
Google cloudでPlace APIを有効にしてAPIkeyを得る。
登録してあるビジネスプロフィールのPlaceIDを取得。このIDは管理者でないものも得ようと思えば得られるがそれはどうなのかなと思うな。
ページの拡張子がphp。これは今回phpスクリプトでコード書いたからだが、ベースはWordpressってのもある。またサーバーサイドの方が安定するしSEO上の評価が上がる可能性もあるのでphp版、実装コードからIDなどを抜いたものをサンプルとして。

<?php // Google Places APIのキー $apiKey = 'APIkey'; // 場所ID (事前にGoogle Maps Platformで取得) $placeId = 'GBP PlaceID'; // APIのエンドポイント $endpoint = 'https://maps.googleapis.com/maps/api/place/details/json?place_id=' . $placeId . '&fields=name,rating,reviews,user_ratings_total&language=ja&key=' . $apiKey; // APIを呼び出し、結果をJSON形式で取得 $response = file_get_contents($endpoint); $data = json_decode($response, true); // エラー処理 if (!$data || !isset($data['result'])) {     echo 'API呼び出しに失敗しました。または、指定された場所が見つかりません。';     exit; } // 評価件数を取得 $reviewCount = isset($data['result']['user_ratings_total']) ? (int)$data['result']['user_ratings_total'] : 0; // 口コミ・評価が0の場合 if ($reviewCount === 0) {               echo '<p>クチコミ・評価はありません。</p>'; } else {     // 評価を取得     $rating = isset($data['result']['rating']) ? round($data['result']['rating'], 1) : 0;     // 星を表示する関数     function displayStars($rating) {         for ($i = 0; $i < 5; $i++) {             $fractionalPart = $rating - floor($rating);             if ($i < floor($rating)) {                 echo '<span class="star filled"></span>';             } elseif ($fractionalPart >= 0.7 && $i == floor($rating)) {                 echo '<span class="star three-quarters"></span>';             } elseif ($fractionalPart >= 0.4 && $i == floor($rating)) {                 echo '<span class="star half"></span>';             } elseif ($fractionalPart >= 0.1 && $i == floor($rating)) {                 echo '<span class="star quarter"></span>';             } else {                 echo '<span class="star"></span>';             }         }     }     // 評価の表示     echo '<div class="rating"><p>';     echo '<span class="rating-value">' . htmlspecialchars($rating, ENT_QUOTES, 'UTF-8') . '</span>';     displayStars($rating);     echo '<span>' . htmlspecialchars($reviewCount, ENT_QUOTES, 'UTF-8') . '件の評価</span>';     echo '</p></div>';     // クチコミ数をカウント     $actualReviewCount = 0;     if (isset($data['result']['reviews'])) {         foreach ($data['result']['reviews'] as $review) {             if (!empty($review['text'])) {                 $actualReviewCount++;             }         }     }     // クチコミを表示     echo '<div class="reviewsWrap">';     if ($actualReviewCount > 0) {         echo '<p>' . htmlspecialchars($actualReviewCount, ENT_QUOTES, 'UTF-8') . '件のクチコミ</p>';         $reviews = array_slice($data['result']['reviews'], 0, 5);         foreach ($reviews as $review) {             if (!empty($review['text'])) {                 echo '<div class="review">';                 echo '<p><b>' . htmlspecialchars($review['author_name'], ENT_QUOTES, 'UTF-8') . '</b>';                 echo '' . htmlspecialchars($review['text'], ENT_QUOTES, 'UTF-8') . '</p>';                 echo '</div>';             }         }     } else {               echo '<p>クチコミはありません。</p>';     } // クチコミが5件を超えている場合に「もっと見る」リンクを表示、次の行の5を変えれば表示件数が変わり同時に何件以上からリンク先での閲覧になるかも変わる if ($actualReviewCount > 5) {     $linkUrl = 'GBPを表示するページのURL'; // クチコミをもっと見るリンクのURLを指定     echo '<a class="form-btn" style="width:auto;margin-top:30px;padding:0 20px" href="' . $linkUrl . '" target="_blank">クチコミをもっと見る</a>';     }     echo '</div>'; } ?>

APIkeyとPlaceIDは別個で取得して記述。
入れ子のhtmlは適当に直せばOK。
星マークは画像作ってCSSで当てればOK。ちなみにこのコードでは、レートに対する星の欠け具合を0.1~0.3、0.4~0.6、0.7~0.9と少し大雑把にしている。小さいものの見た目だけだが、拘るなら // 星を表示する関数部分を細かくすればOK。
PlaceIDを誰でも取れるのはちょっとどうかなとも思うな、取れないとそれで色々あるのだろうが、なら管理者以外は制限かかるとかしてほしいな。