{"id":1187,"date":"2025-01-21T18:54:01","date_gmt":"2025-01-21T23:54:01","guid":{"rendered":"https:\/\/www.move-tastic.com\/blog\/?page_id=1187"},"modified":"2025-02-04T18:57:26","modified_gmt":"2025-02-04T23:57:26","slug":"reviews-sample","status":"publish","type":"page","link":"https:\/\/www.move-tastic.com\/blog\/reviews-sample\/","title":{"rendered":"Reviews Sample"},"content":{"rendered":"\n<div id=\"sl-reviews-public\">\n  <div id=\"sl-reviews-content\">\n\n    <!-- Intro Section -->\n    <div id=\"review_intro\" class=\"mb-5\">\n      <h4 style=\"font-weight: bold; font-size: 18px;\">Thanks for choosing Move-tastic! How did we do?<\/h4>\n      <p>We appreciate you trusting our team with your move. We\u2019d love to hear about your experience and how we can continue to provide top-notch service.<\/p>\n      <p>Please leave us a review on one of the following sites and let us know about your move.<\/p>\n    <\/div>\n\n    <!-- Suggestions for Review Content -->\n    <div id=\"review_what_to_write\" style=\"display: block;\" aria-hidden=\"true\">\n      <h4 style=\"font-weight: bold; font-size: 18px;\">Not sure what to write in your review?<\/h4>\n      <p>The most helpful reviews share details of your experience and even a tip or two for future customers.<\/p>\n      <p>Here are some questions you could cover in your review:<\/p>\n      <ul>\n        <li style=\"margin: 10px auto;\">Where were you moving from and to?<\/li>\n        <li style=\"margin: 10px auto;\">Did you look at other moving companies before choosing us?<\/li>\n        <li style=\"margin: 10px auto;\">Which Move-tastic crew members helped you, and how did they do?<\/li>\n        <li style=\"margin: 10px auto;\">Was this your first time hiring professional movers?<\/li>\n        <li style=\"margin: 10px auto;\">How does Move-tastic compare to other movers you\u2019ve heard about or used in the past?<\/li>\n        <li style=\"margin: 10px auto;\">Any tips or advice for future customers?<\/li>\n      <\/ul>\n      <p><strong>Whether it&#8217;s a detailed story or a quick shout-out, your feedback means a lot to us!<\/strong><\/p>\n    <\/div>\n\n    <!-- Review Links (Google \/ Facebook \/ Yelp) -->\n    <div id=\"sl-single-review\" class=\"my-4 py-4\">\n      <div class=\"sl-review\">\n        <div class=\"row\">\n          <!-- Google -->\n          <div class=\"sl-review-platform col\">\n            <a id=\"ctrl-rev1-google\" href=\"https:\/\/g.page\/r\/CX___yw3_2FuEAE\/review\" target=\"_blank\" title=\"Google Review\" rel=\"noopener\">\n              <figure>\n                <img decoding=\"async\" style=\"width: 150px; opacity: 1;\" src=\"https:\/\/searchlabdigital.com\/res\/searchLab-tools\/sl-app-reviews\/images\/logo-google.png\" alt=\"Google\" class=\"mb-3\">\n                <figcaption style=\"font-size: 24px;\">Google<\/figcaption>\n              <\/figure>\n            <\/a>\n          <\/div>\n          <!-- Facebook -->\n          <div class=\"sl-review-platform col\">\n            <a id=\"ctrl-rev1-facebook\" href=\"https:\/\/www.facebook.com\/movetastic\/reviews\" target=\"_blank\" title=\"Facebook Review\" rel=\"noopener\">\n              <figure>\n                <img decoding=\"async\" style=\"width: 150px; opacity: 1;\" src=\"https:\/\/searchlabdigital.com\/res\/searchLab-tools\/sl-app-reviews\/images\/logo-facebook.png\" alt=\"Facebook\" class=\"mb-3\">\n                <figcaption style=\"font-size: 24px;\">Facebook<\/figcaption>\n              <\/figure>\n            <\/a>\n          <\/div>\n          <!-- Yelp -->\n          <div class=\"sl-review-platform col\">\n            <a id=\"ctrl-rev1-yelp\" href=\"https:\/\/www.google.com\/search?q=yelp+move+tastic\" target=\"_blank\" title=\"Yelp Review\" rel=\"noopener\">\n              <figure>\n                <img decoding=\"async\" style=\"width: 150px; opacity: 1;\" src=\"https:\/\/searchlabdigital.com\/res\/searchLab-tools\/sl-app-reviews\/images\/logo-yelp.png\" alt=\"Yelp\" class=\"mb-3\">\n                <figcaption style=\"font-size: 24px;\">Yelp<\/figcaption>\n              <\/figure>\n            <\/a>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <!-- Add your CSS & Bootstrap Link -->\n  <style>\n    \/* 1. Constrain to a fixed max-width, centered for big screens *\/\n    #sl-reviews-public {\n      max-width: 1140px; \n      margin: 0 auto;\n      padding: 1rem;\n      box-sizing: border-box;\n    }\n    #sl-reviews-content {\n      max-width: 100%;\n      margin: 0 auto;\n    }\n\n    \/* Basic spacing for paragraphs, etc. *\/\n    #review_intro, #review_what_to_write {\n      margin-bottom: 2rem;\n    }\n\n    \/* Let the row center columns horizontally *\/\n    #sl-reviews-public .row {\n      display: flex;\n      flex-wrap: wrap;\n      justify-content: center;\n    }\n\n    \/* Each column forcibly centers its content *\/\n    #sl-reviews-public .sl-review-platform.col {\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      margin: 30px; \/* 30px spacing between logos *\/\n    }\n\n    #sl-reviews-public .sl-review figure {\n      text-align: center;\n      font-weight: 700;\n    }\n\n    \/* Single-column below 430px *\/\n    @media screen and (max-width: 430px) {\n      #sl-reviews-public .row {\n        flex-direction: column;\n        align-items: center;\n      }\n      #sl-reviews-public .sl-review-platform.col {\n        width: 100% !important;\n        margin: 10px auto;\n      }\n    }\n  <\/style>\n\n  <link\n    href=\"https:\/\/cdn.jsdelivr.net\/npm\/bootstrap@5.3.0-alpha3\/dist\/css\/bootstrap.min.css\"\n    rel=\"stylesheet\"\n    integrity=\"sha384-KK94HdvYe+M\/SXH301p5ILy+dN9+nJOZ\"\n    crossorigin=\"anonymous\"\n  >\n  <script\n    src=\"https:\/\/cdn.jsdelivr.net\/npm\/bootstrap@5.3.0-alpha3\/dist\/js\/bootstrap.min.js\"\n    integrity=\"sha384-Y4oOpwW3duJdCWv5ly8SCFYWqFDsfob\/3GkgExXKV4idmbt98QcxXYs9UoXAB7BZ\"\n    crossorigin=\"anonymous\"\n  ><\/script>\n<\/div>\n\n\n\n<!-- 1. Static JSON-LD for Move-tastic!, placeholders for rating=0 & reviewCount=0 -->\n<script type=\"application\/ld+json\" id=\"localBusinessSchema\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"LocalBusiness\",\n  \"name\": \"Move-tastic!\",\n  \"image\": \"https:\/\/cdn.trustindex.io\/companies\/a6\/a6ac8c108129g09a\/avatar.jpg\",\n  \"url\": \"https:\/\/www.move-tastic.com\",\n  \"telephone\": \"+1-773-715-3227\",\n  \"address\": {\n    \"@type\": \"PostalAddress\",\n    \"streetAddress\": \"3100 N Tripp Ave\",\n    \"addressLocality\": \"Chicago\",\n    \"addressRegion\": \"IL\",\n    \"postalCode\": \"60641\",\n    \"addressCountry\": \"US\"\n  },\n  \"openingHoursSpecification\": [\n    {\n      \"@type\": \"OpeningHoursSpecification\",\n      \"dayOfWeek\": [\n        \"Monday\",\n        \"Tuesday\",\n        \"Wednesday\",\n        \"Thursday\",\n        \"Friday\"\n      ],\n      \"opens\": \"08:00\",\n      \"closes\": \"17:00\"\n    }\n  ],\n  \"aggregateRating\": {\n    \"@type\": \"AggregateRating\",\n    \"ratingValue\": 5,\n    \"reviewCount\": 2233\n  }\n}\n<\/script>\n\n<!-- 2. Load Google Maps JS with Places using your actual key -->\n<script\n  src=\"https:\/\/maps.googleapis.com\/maps\/api\/js?key=AIzaSyDoEP36NSz3gptWw0auHWeWh7ojMRQj8RU&#038;libraries=places\"\n  async\n  defer\n><\/script>\n\n<!-- 3. Add CSS for a black & yellow Move-tastic! style -->\n<style>\n\/* Main container *\/\n#my-reviews-container {\n  max-width: 800px;\n  margin: auto;\n  font-family: \"Helvetica Neue\", Arial, sans-serif;\n  background: #fff;\n  color: #000;\n  padding: 20px;\n}\n\n\/* Title styling *\/\n#my-reviews-container h2 {\n  font-size: 1.8em;\n  text-align: center;\n  margin-bottom: 25px;\n  color: #000;\n  position: relative;\n}\n\n\/* Yellow underline under the title *\/\n#my-reviews-container h2::after {\n  content: \"\";\n  display: block;\n  width: 100px;\n  height: 4px;\n  background: #FFD100; \/* bright Move-tastic yellow *\/\n  margin: 8px auto 0;\n  border-radius: 2px;\n}\n\n\/* Each review \"card\" *\/\n.review-card {\n  border: 2px solid #FFD100;\n  border-radius: 6px;\n  margin-bottom: 20px;\n  padding: 15px;\n  box-shadow: 0 2px 5px rgba(0,0,0,0.07);\n  transition: transform 0.2s ease-in-out;\n}\n.review-card:hover {\n  transform: scale(1.01);\n}\n\n\/* Author name *\/\n.review-author {\n  font-weight: bold;\n  font-size: 1.1em;\n  color: #000;\n  margin-bottom: 5px;\n}\n\n\/* Stars in bright yellow *\/\n.review-stars {\n  font-size: 1.2em;\n  color: #FFD100;\n  margin: 5px 0;\n}\n\n\/* Time info *\/\n.review-time {\n  font-size: 0.9em;\n  color: #444;\n}\n\n\/* Review body text *\/\n.review-text {\n  margin-top: 8px;\n  line-height: 1.4em;\n}\n\n\/* \"View More Reviews\" button *\/\n#my-reviews-more-link {\n  display: inline-block;\n  text-decoration: none;\n  font-weight: bold;\n  margin-top: 20px;\n  padding: 12px 20px;\n  background: #000;       \/* black bg *\/\n  color: #FFD100;         \/* yellow text *\/\n  border-radius: 4px;\n  border: 2px solid #FFD100;\n  text-align: center;\n  transition: background 0.2s;\n}\n#my-reviews-more-link:hover {\n  background: #FFD100;    \/* invert on hover *\/\n  color: #000;\n}\n<\/style>\n\n<script>\n\/* 4. JavaScript: update rating\/reviewCount & display reviews *\/\nconst PLACE_ID = \"ChIJuRhz5jrMD4gRf___LDf_YW4\";\n\nfunction initMap() {\n  const mapElement = document.getElementById(\"map\");\n  if (!mapElement) return;\n\n  \/\/ Minimal hidden map\n  const map = new google.maps.Map(mapElement, {\n    center: { lat: 0, lng: 0 },\n    zoom: 1\n  });\n\n  \/\/ PlacesService\n  const service = new google.maps.places.PlacesService(map);\n\n  \/\/ Request rating and up to 5 reviews\n  const request = {\n    placeId: PLACE_ID,\n    fields: [\"rating\",\"user_ratings_total\",\"reviews\"]\n  };\n\n  service.getDetails(request, (place, status) => {\n    if (status === google.maps.places.PlacesServiceStatus.OK) {\n      \/\/ 4a. Update JSON-LD\n      const schemaEl = document.getElementById(\"localBusinessSchema\");\n      if (schemaEl) {\n        let data = JSON.parse(schemaEl.textContent);\n        data.aggregateRating.ratingValue = place.rating || 0;\n        data.aggregateRating.reviewCount = place.user_ratings_total || 0;\n        schemaEl.textContent = JSON.stringify(data, null, 2);\n      }\n\n      \/\/ 4b. Display top 5 reviews\n      const reviews = place.reviews || [];\n      \/\/ optional: newest first\n      reviews.sort((a,b) => b.time - a.time);\n\n      const list = document.getElementById(\"my-reviews-list\");\n      const moreLink = document.getElementById(\"my-reviews-more-link\");\n\n      if (reviews.length > 0) {\n        let html = \"\";\n        reviews.forEach(r => {\n          html += `\n            <div class=\"review-card\">\n              <div class=\"review-author\">${r.author_name || \"Anonymous\"}<\/div>\n              <div class=\"review-stars\">${getStarIcons(r.rating || 0)}<\/div>\n              <div class=\"review-time\">${r.relative_time_description || \"\"}<\/div>\n              <div class=\"review-text\">${r.text || \"\"}<\/div>\n            <\/div>\n          `;\n        });\n        list.innerHTML = html;\n\n        moreLink.href = \"https:\/\/search.google.com\/local\/reviews?placeid=\" + PLACE_ID;\n        moreLink.style.display = \"inline-block\";\n      } else {\n        list.innerHTML = \"<p>No reviews found.<\/p>\";\n      }\n    } else {\n      console.error(\"PlacesService getDetails failed:\", status);\n      document.getElementById(\"my-reviews-list\").innerText =\n        \"Unable to load reviews at this time.\";\n    }\n  });\n\n}\n\n\/* Helper: convert numeric rating to star icons *\/\nfunction getStarIcons(rating) {\n  const rounded = Math.round(rating);\n  let stars = \"\";\n  for (let i = 1; i <= 5; i++) {\n    stars += i <= rounded ? \"\u2605\" : \"\u2606\";\n  }\n  return stars;\n}\n\n\/\/ Load the map after window loads\nwindow.addEventListener(\"load\", initMap);\n<\/script>\n\n<!-- 5. Container for your black & yellow review section -->\n<div id=\"my-reviews-container\">\n  <h2>Our Google Reviews<\/h2>\n  <div id=\"my-reviews-list\">Loading reviews...<\/div>\n\n  <a id=\"my-reviews-more-link\" href=\"#\" target=\"_blank\" style=\"display:none;\" rel=\"noopener\">\n    View More Reviews\n  <\/a>\n<\/div>\n\n<!-- Invisible map container (required by Places) -->\n<div id=\"map\" style=\"width:1px; height:1px; display:none;\"><\/div>\n\n\n\n<!-- 1. Load the Google Maps API with Places library -->\n<script\n  src=\"https:\/\/maps.googleapis.com\/maps\/api\/js?key=AIzaSyDoEP36NSz3gptWw0auHWeWh7ojMRQj8RU&#038;libraries=places\"\n  async\n  defer\n><\/script>\n\n<!-- 2. Script to update the JSON\u2011LD with dynamic review data from the API -->\n<script>\nfunction updateReviewsFromAPI() {\n  const PLACE_ID = \"ChIJuRhz5jrMD4gRf___LDf_YW4\";\n  \/\/ Create a hidden map element (required by the Places API)\n  const hiddenMapEl = document.createElement(\"div\");\n  hiddenMapEl.style.display = \"none\";\n  document.body.appendChild(hiddenMapEl);\n  const map = new google.maps.Map(hiddenMapEl, { center: { lat: 41.85, lng: -87.65 }, zoom: 12 });\n  const service = new google.maps.places.PlacesService(map);\n  const request = { placeId: PLACE_ID, fields: [\"rating\", \"user_ratings_total\", \"reviews\"] };\n  \n  service.getDetails(request, function(place, status) {\n    if (status === google.maps.places.PlacesServiceStatus.OK) {\n      const schemaEl = document.getElementById(\"localBusinessSchema\");\n      if (schemaEl) {\n        let data = JSON.parse(schemaEl.textContent);\n        data.aggregateRating.ratingValue = place.rating || 0;\n        data.aggregateRating.reviewCount = place.user_ratings_total || 0;\n        if (place.reviews && Array.isArray(place.reviews)) {\n          data.review = place.reviews;\n        }\n        schemaEl.textContent = JSON.stringify(data, null, 2);\n        \/\/ Once updated, build the carousel from the new review data.\n        buildCarousel();\n      }\n    } else {\n      console.error(\"Google Places API error:\", status);\n    }\n  });\n}\n\nfunction buildCarousel() {\n  \/\/ Retrieve the updated JSON\u2011LD data from Block 2\n  const schemaEl = document.getElementById(\"localBusinessSchema\");\n  let reviews = [];\n  if (schemaEl) {\n    try {\n      const data = JSON.parse(schemaEl.textContent);\n      if (data.review && Array.isArray(data.review)) {\n        reviews = data.review;\n      } else {\n        console.warn(\"No review array found in the JSON\u2011LD.\");\n      }\n    } catch (e) {\n      console.error(\"Error parsing localBusinessSchema JSON\u2011LD:\", e);\n    }\n  }\n  \n  \/\/ Get the carousel container\n  const carouselInner = document.getElementById(\"carousel-inner\");\n  if (!carouselInner) {\n    console.error(\"Carousel container not found.\");\n    return;\n  }\n  \n  if (reviews.length === 0) {\n    carouselInner.innerHTML = \"<p>No reviews available.<\/p>\";\n    return;\n  }\n  \n  \/\/ Optional: sort reviews by published date (newest first) using datePublished if available\n  reviews.sort((a, b) => new Date(b.datePublished || 0) - new Date(a.datePublished || 0));\n  \n  \/\/ Clear any existing content\n  carouselInner.innerHTML = \"\";\n  \n  \/\/ Helper function: convert numeric rating to star icons\n  function getStarIcons(rating) {\n    const maxStars = 5;\n    let stars = \"\";\n    const rounded = Math.round(parseFloat(rating) || 0);\n    for (let i = 1; i <= maxStars; i++) {\n      stars += (i <= rounded) ? \"\u2605\" : \"\u2606\";\n    }\n    return stars;\n  }\n  \n  \/\/ Create a slide for each review\n  reviews.forEach((review, index) => {\n    const slide = document.createElement(\"div\");\n    slide.className = \"carousel-slide\";\n    if (index === 0) {\n      slide.classList.add(\"active\");\n    }\n    \n    const author = review.author || \"Anonymous\";\n    const rating = (review.reviewRating && review.reviewRating.ratingValue) ? review.reviewRating.ratingValue : 0;\n    const stars = getStarIcons(rating);\n    const date = review.datePublished || \"\";\n    const text = review.reviewBody || \"\";\n    \n    slide.innerHTML = `\n      <div class=\"carousel-author\" style=\"font-weight:bold; font-size:1.1em; margin-bottom:6px;\">${author}<\/div>\n      <div class=\"carousel-rating\" style=\"color:#FFD100; font-size:1.2em; margin-bottom:4px;\">${stars}<\/div>\n      <div class=\"carousel-time\" style=\"font-size:0.9em; color:#444; margin-bottom:6px;\">${date}<\/div>\n      <div class=\"carousel-text\" style=\"line-height:1.4em; margin-bottom:8px;\">${text}<\/div>\n    `;\n    carouselInner.appendChild(slide);\n  });\n  \n  \/\/ Set up carousel navigation\n  let currentIndex = 0;\n  const slides = document.querySelectorAll(\".carousel-slide\");\n  const totalSlides = slides.length;\n  const prevBtn = document.getElementById(\"prev-btn\");\n  const nextBtn = document.getElementById(\"next-btn\");\n  \n  function showSlide(index) {\n    slides.forEach(slide => slide.classList.remove(\"active\"));\n    if (slides[index]) {\n      slides[index].classList.add(\"active\");\n    }\n  }\n  \n  prevBtn.addEventListener(\"click\", function() {\n    currentIndex = (currentIndex === 0) ? totalSlides - 1 : currentIndex - 1;\n    showSlide(currentIndex);\n  });\n  \n  nextBtn.addEventListener(\"click\", function() {\n    currentIndex = (currentIndex + 1) % totalSlides;\n    showSlide(currentIndex);\n  });\n}\n\ndocument.addEventListener(\"DOMContentLoaded\", function() {\n  updateReviewsFromAPI();\n});\n<\/script>\n\n<!-- Carousel Display Container -->\n<div id=\"carousel-container\" style=\"max-width:600px; margin:2rem auto; padding:20px; border:2px dashed #FFD100; border-radius:8px; background:#fff; box-sizing:border-box;\">\n  <div id=\"carousel-inner\"><\/div>\n  <div class=\"carousel-nav\" style=\"text-align:center; margin-top:10px;\">\n    <button id=\"prev-btn\" style=\"background:#f5cb45; border:none; padding:10px 15px; margin:0 5px; border-radius:4px; font-size:16px; cursor:pointer; color:#000;\">&laquo; Prev<\/button>\n    <button id=\"next-btn\" style=\"background:#f5cb45; border:none; padding:10px 15px; margin:0 5px; border-radius:4px; font-size:16px; cursor:pointer; color:#000;\">Next &raquo;<\/button>\n  <\/div>\n<\/div>\n\n<div id=\"view-more-links\" style=\"text-align:center; margin-top:20px;\">\n  <a href=\"https:\/\/search.google.com\/local\/reviews?placeid=ChIJuRhz5jrMD4gRf___LDf_YW4\" target=\"_blank\" rel=\"noopener\" style=\"display:inline-block; margin:0 10px; padding:10px 14px; border:2px solid #FFD100; border-radius:4px; text-decoration:none; color:#000; background:#FFD100; font-weight:bold; transition: background 0.2s;\">View More on Google<\/a>\n  <a href=\"https:\/\/www.yelp.com\/biz\/move-tastic-chicago\" target=\"_blank\" rel=\"noopener\" style=\"display:inline-block; margin:0 10px; padding:10px 14px; border:2px solid #FFD100; border-radius:4px; text-decoration:none; color:#000; background:#FFD100; font-weight:bold; transition: background 0.2s;\">View More on Yelp<\/a>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Thanks for choosing Move-tastic! How did we do? We appreciate you trusting our team with your move. We\u2019d love to hear about your experience and how we can continue to provide top-notch service. Please leave us a review on one of the following sites and let us know about your move. Not sure what to [&hellip;]<\/p>\n","protected":false},"author":12,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"rop_custom_images_group":[],"rop_custom_messages_group":[],"rop_publish_now":"initial","rop_publish_now_accounts":[],"rop_publish_now_history":[],"rop_publish_now_status":"pending","footnotes":""},"_links":{"self":[{"href":"https:\/\/www.move-tastic.com\/blog\/wp-json\/wp\/v2\/pages\/1187"}],"collection":[{"href":"https:\/\/www.move-tastic.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.move-tastic.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.move-tastic.com\/blog\/wp-json\/wp\/v2\/users\/12"}],"replies":[{"embeddable":true,"href":"https:\/\/www.move-tastic.com\/blog\/wp-json\/wp\/v2\/comments?post=1187"}],"version-history":[{"count":62,"href":"https:\/\/www.move-tastic.com\/blog\/wp-json\/wp\/v2\/pages\/1187\/revisions"}],"predecessor-version":[{"id":1265,"href":"https:\/\/www.move-tastic.com\/blog\/wp-json\/wp\/v2\/pages\/1187\/revisions\/1265"}],"wp:attachment":[{"href":"https:\/\/www.move-tastic.com\/blog\/wp-json\/wp\/v2\/media?parent=1187"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}