Place reviews lets you add user reviews and ratings to your web pages. This page
explains the differences between place reviews as used in the Place
class
(new) and PlacesService
(legacy), and provides some code snippets for
comparison.
PlacesService
(legacy) returns an array ofPlaceReview
instances as part of thePlaceResult
object for anygetDetails()
request if thereviews
field is specified in the request.Place
(new) returns an array ofReview
instances as part of afetchFields()
request if thereviews
field is specified in the request.
The following table lists some of the main differences in the use of place
reviews between the Place
class and PlacesService
:
PlacesService (Legacy) |
Place (New) |
---|---|
PlaceReview interface |
Review class |
Methods require the use of a callback to handle the results object and
google.maps.places.PlacesServiceStatus response. |
Uses Promises, and works asynchronously. |
Methods require a PlacesServiceStatus check. |
No required status check, can use standard error handling. |
PlacesService must be instantiated using a map or a
div element. |
Place can be instantiated wherever needed, without a
reference to a map or page element. |
PlaceReview returns attribution data for the review using
the author_name , author_url , and
profile_photo_url fields. |
Review returns attribution data for the review using
an
AuthorAttribution instance. |
Code comparison
This section compares code for text search methods to illustrate the differences
between Place reviews in the legacy PlacesService
and the newer Place
class.
Places service (legacy)
The following snippet calls getDetails()
to request place details including
reviews, and displays the first review result in an infowindow.
const request = {
placeId: "ChIJpyiwa4Zw44kRBQSGWKv4wgA", // Faneuil Hall Marketplace, Boston, MA
fields: ["name", "formatted_address", "geometry", "reviews"],
};
const service = new google.maps.places.PlacesService(map);
service.getDetails(request, (place, status) => {
if (
status === google.maps.places.PlacesServiceStatus.OK &&
place &&
place.geometry &&
place.geometry.location
) {
// If there are any reviews display the first one.
if (place.reviews && place.reviews.length > 0) {
// Get info for the first review.
let reviewRating = place.reviews[0].rating;
let reviewText = place.reviews[0].text;
let authorName = place.reviews[0].author_name;
let authorUri = place.reviews[0].author_url;
// Format the review using HTML.
contentString =`
<div id="title"><b>${place.name}</b></div>
<div id="address">${place.formatted_address}</div>
<a href="${authorUri}" target="_blank">Author: ${authorName}</a>
<div id="rating">Rating: ${reviewRating} stars</div>
<div id="rating"><p>Review: ${reviewText}</p></div>`;
} else {
contentString = `No reviews were found for ${place.name}`;
}
const infowindow = new google.maps.InfoWindow({
content: contentString,
ariaLabel: place.displayName,
});
// Add a marker.
const marker = new google.maps.Marker({
map,
position: place.geometry.location,
});
// Show the info window.
infowindow.open({
anchor: marker,
map,
});
}
});
Place class (new)
The following snippet calls fetchFields()
method to request place details including reviews, and displays the first review
result in an infowindow.
// Use a place ID to create a new Place instance.
const place = new google.maps.places.Place({
id: "ChIJpyiwa4Zw44kRBQSGWKv4wgA", // Faneuil Hall Marketplace, Boston, MA
});
// Call fetchFields, passing 'reviews' and other needed fields.
await place.fetchFields({
fields: ["displayName", "formattedAddress", "location", "reviews"],
});
// If there are any reviews display the first one.
if (place.reviews && place.reviews.length > 0) {
// Get info for the first review.
let reviewRating = place.reviews[0].rating;
let reviewText = place.reviews[0].text;
let authorName = place.reviews[0].authorAttribution.displayName;
let authorUri = place.reviews[0].authorAttribution.uri;
// Format the review using HTML.
contentString =`
<div id="title"><b>${place.displayName}</b></div>
<div id="address">${place.formattedAddress}</div>
<a href="${authorUri}" target="_blank">Author: ${authorName}</a>
<div id="rating">Rating: ${reviewRating} stars</div>
<div id="rating"><p>Review: ${reviewText}</p></div>`;
} else {
contentString = `No reviews were found for ${place.displayName}`;
}
// Create an infowindow to display the review.
infoWindow = new google.maps.InfoWindow({
content: contentString,
ariaLabel: place.displayName,
});
// Add a marker.
const marker = new google.maps.marker.AdvancedMarkerElement({
map,
position: place.location,
title: place.displayName,
});
// Show the info window.
infoWindow.open({
anchor: marker,
map,
});