Liquid, JavaScript, themes, sales channels
Hi
I'm getting the following error showing against all my products in the Google search console.
Either "offers", "review", or "aggregateRating" should be specified.
Anyone seen this before / know how to resolve?
Damian
If shopping bot does not run javascript (though I can't test right now) , then just omitting metafield content as I've said would solve the problem.
As reviews app keeps an instance of json in metafield.
When it runs its javascript code, it rewrites contents of this div with different html, which includes json again, plus review form and actual reviews.
That's where it's possible to intercept it, pull the reviews out and add them to our structured data.
This way I was able to produce product structured data without warnings.
Hello Tim, ah yes very good point. I overlooked that fact. Thanks for sharing your experience! Much appreciated.
Just want to highlight a spelling error in the closing div
Instead of
<div id="shopify-product-reviews" data-id="{{product.id}}">/div>
it should be
<div id="shopify-product-reviews" data-id="{{product.id}}"></div>
not easy question because the review data are not stored in metafields of product but in spr directly. This is the reason why this DON'T WORK
<script>
function getData() {
$.ajax({
url : '\/\/productreviews.shopifycdn.com\/assets\/v4\/spr.js?shop=[SHOPNAME].myshopify.com',
type: 'GET',
success : handleData
})
}
loadReviewsScript() {
const baseUrl = this.data.get('url');
const shop = this.data.get('shop');
const productId = this.data.get('productId');
const tag = document.createElement('script');
window.callback = this.handleReviewData.bind(this);
tag.src=`${baseUrl}?callback=callback&shop=${shop}&product_id=${productId}`;
tag.async = true;
document.body.appendChild(tag);
}
handleReviewData(data) {
const reviewData = this.parseReviewData(data);
}
parseReviewData(data) {
return $(data.reviews).map((i, el) => {
const $el = $(el);
return {
'author': $el.find('.spr-review-header-byline').text(),
'body': $el.find('.spr-review-content-body').text(),
'title': $el.find('.spr-review-header-title').text()
};
});
}
review:
{
"@type": "Review",
"author": "{{ review.id }}",
"datePublished": "{{ product.metafields.spr.reviews | split: 'review.date" content="' | last }}",
"description": "{{ product.metafields.spr.reviews | split: 'review.content" content="' | last }}",
"name": "{{ product.metafields.spr.reviews | split: 'review.id" content="' | last }}",
"itemReviewed": "{{ product.metafields.spr.reviews | split: 'review.product.name" content="' | last }}",
"reviewRating": {
"@type": "Rating",
"bestRating": "5",
"ratingValue": "{{ product.metafields.spr.reviews | split: 'reviewCount" content="' | last }}",
"worstRating": "1"
}
}
</script>
Note the difference, the only array arrived is reviewCount because this is the only date stored in metafields
@tim wrote:If shopping bot does not run javascript (though I can't test right now) , then just omitting metafield content as I've said would solve the problem.
As reviews app keeps an instance of json in metafield.
When it runs its javascript code, it rewrites contents of this div with different html, which includes json again, plus review form and actual reviews.
That's where it's possible to intercept it, pull the reviews out and add them to our structured data.
This way I was able to produce product structured data without warnings.
@EmmanuelFlossie, thanks for noticing this -- phone is not the best device for posting.
@Hobby-shop I'd recommend using the 'code' button to post you code -- it difficult to read otherwise.
I do not quite get it why do you want to do Ajax'ing yourself -- it's still javascript. I'd rather wait for Shopify app to do it's job and call your code via SPRCallbacks, where you can parse DOM and collect review data.
Now, you can read the structured data json (prepared in liquid) JSON.parse it to a javascript variable, add the data on actual reviews and then overwrite that structured data json with updated information.
Sorry, can't share my code ATM as I have no access from my phone.
@timsomething like this?
<script> var SPRCallbacks = { onProductLoad: function( e ) { $('[itemprop="itemreviewed"]').remove(); $('[itemprop="itemReviewed"]').remove(); $('[type="application/ld+json"]').filter(':contains("itemReviewed")').remove(); return { 'author': $el.find('.spr-review-header-byline').text(), 'body': $el.find('.spr-review-content-body').text(), 'title': $el.find('.spr-review-header-title').text() }; }, onReviewsLoad: function( e ) { $('[itemprop="itemreviewed"]').remove(); $('[itemprop="itemReviewed"]').remove(); $('[type="application/ld+json"]').filter(':contains("itemReviewed")').remove(); return { 'author': $el.find('.spr-review-header-byline').text(), 'body': $el.find('.spr-review-content-body').text(), 'title': $el.find('.spr-review-header-title').text() }; } } </script>
Hi, Tim can you help me with issue on my shop?
Email me at hello@ecoroots.us
Thanks a lot,
Alin
@tim ,
Looking through the forum trying to find solutions to multiple issues I am looking to address I was wondering if you hire out custom work. I can do basic HTML but not in depth for what I'm looking for for the site I'm building for myself:
Would you please contact me if interested at vbsunglassshack@gmail.com. I'm new to the forum and Private Messaging privileges have yet to be unlocked
@ToplineEyewear
Akshay is here as a Shopify Partner.
Please let me know how can I help you? Also please check your email I have sent you an email for this.
Hi @Akshay_V
Encountering the same problem here since I started syncronising with Google:
I've been through this topic and it's not very clear what I should do to get resolve this...
I know all is in dutch, but I think you can tell by the looks of it what it is?
If not let me know...
Hello, How can I solve the issues?
By installing structured data. You can use my free tutorial here: https://feedarmy.com/kb/shopify-microdata-for-google-shopping/
I saw your code. your schema code for Shopify product review app. but I use Judge.me.
For custom coding ie, other review apps, you can contact me on my website, and I am happy to help you.
Hi 🙋🏽♀️
im a new Shopify user only went live last week I have the judge.me app & have 2 errors & 7 warnings on my google console regarding the above error topics.
im not technically minded but can follow instructions I think!
can I ask why Shopify support these apps if they are not supported automatically!
Can you advise me how I can please resolve this issue, I would be very grateful
If Shopify would be able to resolve everything, then there would be no need for apps. Shopify simply can't do everything themselves, how basic you may thing it is.
Everyone has different needs, if all possibilities would exist, you Shopify account would have 10000's of apps prebuild, and you would see thousands of menus, and would not be able to navigate or use your store.
Here is a guide: https://feedarmy.com/kb/shopify-microdata-for-google-shopping/
Thank you for your prompt reply & the time you take to help it’s much appreciated, I noticed it says to contact you if on Judge.me which I am. Can you also confirm if I need to remove any existing code?
kind regards
It's possible, I would not know. As each merchant is different. If you contact me on my website, I am happy to help.
Hello,
hope this message finds you safe. We have currently approximately 400 reviews for 20% of the products on the web site www.luxuria.com.tr.
I am using debut theme and using the standard shopify review app.
Currently I have for 1082 products missing "ratingCount" "reviewCount" and "ratingValue" problem in Google Search Console.
Can anyone please help me with this problem?
Best
Aydin
product-template looks like:
and here how the product.liquid looks like:
{% comment %}
The contents of the product.liquid template can be found in /sections/product-template.liquid
{% endcomment %}
{% section 'product-template' %}
{% section 'product-recommendations' %}
{% if collection %}
<div class="text-center return-link-wrapper page-width">
<a href="{{ collection.url }}" class="btn btn--secondary btn--has-icon-before return-link">
{% include 'icon-arrow-left' %}
{{ 'products.product.back_to_collection' | t: title: collection.title }}
</a>
</div>
{% endif %}
<script>
// Override default values of shop.strings for each template.
// Alternate product templates can change values of
// add to cart button, sold out, and unavailable states here.
theme.productStrings = {
addToCart: {{ 'products.product.add_to_cart' | t | json }},
soldOut: {{ 'products.product.sold_out' | t | json }},
unavailable: {{ 'products.product.unavailable' | t | json }}
}
</script>
{% assign current_variant = product.selected_or_first_available_variant %}
<script type="application/ld+json">
{
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "{{ product.metafields.manysales.review_avg_rating }}",
"reviewCount": "{{ product.metafields.manysales.review_count }}"
},
"@context": "http://schema.org/",
"@type": "Product",
"name": {{ product.title | json }},
"url": {{ shop.url | append: product.url | json }},
{%- if product.featured_media -%}
{%- assign media_size = product.featured_media.preview_image.width | append: 'x' -%}
"image": [
{{ product.featured_media | img_url: media_size | prepend: "https:" | json }}
],
{%- endif -%}
"description": {{ product.description | strip_html | json }},
{%- if current_variant.sku != blank -%}
"sku": {{ current_variant.sku | json }},
{%- endif -%}
"brand": {
"@type": "Thing",
"name": {{ product.vendor | json }}
},
"offers": [
{%- for variant in product.variants -%}
{
"@type" : "Offer",
{%- if variant.sku != blank -%}
"sku": {{ variant.sku | json }},
{%- endif -%}
"availability" : "http://schema.org/{% if product.available %}InStock{% else %}OutOfStock{% endif %}",
"price" : {{ variant.price | divided_by: 100.00 | json }},
"priceCurrency" : {{ cart.currency.iso_code | json }},
"url" : {{ shop.url | append: variant.url | json }}
}{% unless forloop.last %},{% endunless %}
{%- endfor -%}
]
}
</script>
You seem to have multiple codes, make sure to combine and only show one code. It looks like you use someone to do this for you.
I recommend getting back in touch with Added on December 8 2020 by Jonathan L at Shopify
To help you resolve this issue.
SImply copy pasting a few pages, does not work. Structured data can be installed from many different areas.
Thank you very much for your response.
We had problem with shopify review app, that snippet was not working, even if we had the code for snippet.
I will contact shopify support. Lets see if they recommend something.
Is there any news about this case? Our structured data is set up correctly in our theme. And Google's rich snippet test says everything is perfect.
Until someone creates a product review using Shopify's product review app. Then it gets ugly because of the extra ld+json code added by the product review app. I tried to remove the ld+json code from the product review app via JS, but the JS code doesn't work (and I'm not a JS developer, so I'm lost). That's the only problem I have with structured data. I don't want a product review app to interfere with me and embed structured data into our HTML code itself.
So, how can I remove this extra structured data from the Shopify Product Review app? Does anyone have any ideas? Thank you.
You can simply ignore how ugly it looks. As long as there are no errors.
Warnings are ok as these are optional.
Google Merchant Center will read only the first product container.
Google Search Console will merge all containers together.
Thank you for your reply @EmmanuelFlossie !
Our structured data code in theme is at the top of the page and includes all necessary (and unnecessary) data, including review and breadcrumb data. And in the middle of the HTML code there is the inserted code from the review app which only includes a simple product object (with a lot of missing information) and the review data.
When I look at the rich result testing tool from Google then the order is wrong and the information are double. But at least everything is green. 😄
However, if I go to snippet preview then the search result doesn't contain any rich result information.
If a product doesn't have any reviews then everything works and also the rich result is shown with all information in the preview:
What do you think?
I recommend looking through your code to ensure the complete data is first, ie at the top.
You will need to sift through the theme and see how everything is built.
Every theme is different, and even with the same theme, the coding will be different depending on custom edits.
Hi Emmanuel.
Yeah. I know and we know our theme as well. 😄
Our structured data starts at line 630 in source code and the structured data from the review app starts at line 1811. That's why I'm wondering about the wrong order in the rich result testing tool from Google.
Structured data created and handled by us:
Structured data from review app:
Seems correct (imho). And I don't know why Google is showing it wrong in the rich result testing tool.
I have added code fromhttps://feedarmy.com/kb/shopify-microdata-for-google-shopping/ , which is working good except that is doesn't have review snippets, so google search console is reporting a warning and as result, it's showing products = 0.
I understand that code should be something like bellow, but I am not sure which code to place instead of ???. I spent days to find/figure out this, without progress, so would appreciate any help.
,"review":
[{"@context":"https://schema.org/",
"@type":"Review",
"description":"Shopify Product Reviews",
"reviewRating":[{"@type":"Rating","ratingValue":"???"}],
"reviewBody":"???",
"name":"???",
"author":[{"@type":"Person","name":"K???"}],
"datePublished":"???"
}]
In my code only aggregateRating is included. For reviews themselves they should be included by the review app you are using.
The codes do not need to be all in 1 code.
Hi Emmanuel, Thank your for your reply. I am using Shopify Product Review app, and no, review snippets do not exist (checked on https://search.google.com/test/rich-results), or I did something wrong on the way. I am quite sure that I did it as per your explanation. Thank you for that code and instruction.
So it would be great if someone can point me out to what is the exact structure of product.metafields.spr.reviews, then I can probably use text parser to take it out.
Or if there is even easier way to extract review snippets - that would be amazing.
If you are using Shopify review app, then I don't think they generate what you want. I recommend you contact Shopify directly for support.
My code, does not include reviews, only aggregateRating.
Dear Emmanuel, thanks for your reply. Yes, both Shopify Product Review app and your code do not provide review snippets - otherwise, you code would be perfect. I know it's possible to extract review snippets from SPR, because I saw it. But I cannot find how to do it. I read everything I could find as Shopify help and a everything else I could find online.
So it would be great if someone can point me out to what is the exact structure of product.metafields.spr.reviews, then I can probably use text parser to take it out.
Or if there is even easier way to extract review snippets - that would be amazing.
Anybody who needs help with this, you can check my solution here or you can contact me directly. I've already helped 5 people with this issue.
Leysam | The Shopify Guy
- Was my reply helpful? Click Like to let me know!Hi Tim and all! This last code patch works, no more warning both in GST classic and in beta version (also inside GSC). Have you idea how to capture each single review in json-ld? We would like not to make API callback, perhaps would it possible trying via css the capture?
Something like this ..
{% if breadcrumb_entity_microdata != blank %}
<script type="application/ld+json">
{
"@context": "http://schema.org",
{{ reviews_entity_microdata }}
}
</script>
{% endif %}
Tks everyone, this community post is very useful with each contribution.
Just want to make sure nobody misses Emmanuels post at https://community.shopify.com/c/Technical-Q-A/Either-quot-offers-quot-quot-review-quot-or-quot-aggre... which has a solution that worked for me.
@EmmanuelFlossie wrote:Hello all, I have updated the aggregatedRatings issue for Shopify reviews. You can copy the latest code here: Easy To Follow Structured Data Tutorial With Updated AggregatedRatings resolved
I have checked the link and I found there are few errors and one more thing is review app repeating schema code the second time and it needs to be fixed.
Reference Screenshots:
https://prnt.sc/qllt1a
Reference Link:
https://search.google.com/structured-data/testing-tool/u/0/#url=https%3A%2F%2Fseegang.berlin%2Fprodu...
For this I need your store admin collaborator access and this issue is chargeable because it is time consuming task. Moreover, Once I submit update you can check solution on above reference link because Google search console take time for update its data around 15 to 20 days.
So please let me know.
Hi Akshay,
I'm new to Shopify - just switching from Etsy and don't fully understand the Shopify "ways of doing things" yet.
Let me describe my perspective:
- I'm paying for a shop system that allows me to create a shop without advanced coding skills.
- after some days I discover that fundamental functions like customer communication, translations, review are not part of the deal
- I am forced to pay more for third party plugins which I all have to evaluate individually for their quality and performance - overall I'm now paying something like 50$/month for this.
- some missing features (i.e. reviews) are kindly provided by Shopify
- I am very careful in not messing up my theme and not installing too many plugins
- after I made my selection, I actually restarted the entire shop from scratch to make sure I have no code garbage in my theme
- then I run into a *confirmed* bug caused by a policy change of Google not supported by Shopify's free review plugin.
And now I'm asked to pay again to have this bug fixed!?
I assume you can do nothing about this, because you are a freelancer paid by Shopify to manage the bushfires, but is this perception of mine correct?
Two constructive questions to move forward:
1. Could I solve the problem myself by simply deleting the affected products and recreating them from scratch?
2. Why are not all my products affected by this bug? Even more weird: one of the products in my list above (the number 9...) is showing up on Google totally fine:
So Google *IS* finding all information it needs and has even indexed it.
Cheers,
Jenny
Re: Question 2
DAMMED - I did a few more tests with Google Structured Data Testing Tool on other of my products not mentioned by the Google Search Console and it looks like ALL of my 244 products have the same issue.
Not good!
I feel your pain.
You may read through my posts in this thread, where I tried to explain why the problem exists and why it's not easy to come up with universal fix.
I know that Shopify tried to solve the problem once and recently once more, this time they moved away from microdata formatting to JSON-LD, but this, imho, does not fix it properly (as it creates an unnecessary extra object on the page with its own warnings and sometimes errors). Unfortunately, with this change the fixes I suggested do not work anymore out of the box.
The way your structured data is output depends on the theme you're using and there is more than one way to do it, some are incompatible. If your theme does not include the code to pull review data from the App(s), it would be necessary to modify it (DIY or hire a developer) to implement structured data properly.
Re-creating your products would not help.
However, I'd like to point out that it's a store-wide fix and not per-product as was suggested several posts earlier.
Regarding your question 2: Note that Google is usually very slow to recognise the changes (in most cases) and may still keep old data in its index(es). My impression is that there are several independent processes and one may still serve your products with proper reviews while another complains about wrong structured data in your search console. Synchronisation between them is slow, but will eventually happen, so I'd suggest fixing the problem ASAP.
in the attempt to understand what has happened and what options do I have - here are few more questions:
1. Is the only way do get the "few errors and the code duplication error" out of my code to hire a developer like you?
2. Will this error not occur again, when I create new products or new collections once you have removed it from my code?
3. Will this problem occur again, if I switch to another theme?
4. Do you have a list of Themes/Review App s that do not run into this problem, in case I am willing to switch theme?
5. Can you (privately) send me a cost-estimate for the fix on my current theme?
Best,
Jenny
Hi Everyone,
I have been reading through this article. I have looked at the structured data tool which shows an issue but the information is in place so Im not sure what the issue is. Any suggestions?
@NaturalWraps_RB
I have checked the link which you have attached with your concern. I found there is lots of error https://prnt.sc/qpd941. One more thing you have not used any product review app and as per new google rich snippet aggregate rating or review is required so do you want to add product review app.
For fixing these errors you can hire me I will do it. If you want a faster response you can contact me directly on below contact information.
Or here is an idea: the Shopify Development team behind the Product Reviews App could just fix their broken code?!
For the record, I followed Tim's great advice (further above) and that has worked for me — so thank you, Tim! 🙂 I'm no coder (nor expert by any long stretch of the imagination) but I managed to figure it out from his advice (albeit with many a coffee!) so it definitely does work!
If you can't fix it yourself (and Shopify simply aren't interested in fixing their app for us) then Tim definitely knows his stuff, if you need to hire someone I guess.
@seegang-berlin
Sorry, there is no way to remove unwanted code or fixing that code. You need to hire an expert like us to fix the theme issue or you can contact theme support to fix this error.
I have read through all of the posts concerning Google Either "offers", "review", or "aggregateRating" should be specified error, but could not find a solution to this issue.
I have one error on all of my product pages. According to Google Structured Data Testing Tool this error is the product type.
"@type": "ListItem",
"position": 3,
"item": {
"@type": "Product",
Any help would be greatly appreciated.
https://inspiredbytheoutdoors.com/products/deer-family-42-metal-wall-art
What exactly would have to be deleted ? Thank you Sabine.
Hello, can you help me please?
I can't find the file to clear the code.
Same message received
Search Console
Products issues detected on https://am81.net/
To the owner of https://am81.net/:
Search Console has identified that your site is affected by 1 Products issues:
Top Errors
Errors can prevent your page or feature from appearing in Search results. The following errors were found on your site:
Either "offers", "review", or "aggregateRating" should be specified
We recommend that you fix these issues when possible to enable the best experience and coverage in Google Search.
@ureb
please read above comments.
Either 'offers', 'review' or 'aggregateRating' should be specified
i have read the comments but still unclear, i have a single page with this problem and i cannot fix it
https://am81.net/products/2-5d-anti-glare-matte-frosted-tempered-glass-screen-protector-for-iphone-x...
@ureb
You can not fix it by own because it is code error and it is not on a single page. It is for all the product pages.
Portrait of Stephen positioned next to an image of planet Earth, with the Stephen's World ...
By JasonH Mar 18, 2024Digital marketers and app developers have tracked activity in apps and websites for yea...
By Ollie Mar 13, 2024February was an exciting month with Shopify Editions, informative webinars, and more! F...
By JasonH Mar 7, 2024