Google Rezension Feed Merchant Center erstellen

Hallo zusammen,

beim erstellen des Rezension Feed (nicht Shopping Feed) für das Google Merchant Center komme ich leider nicht weiter. Ich möchte in dem Feed die von Google erforderlichen Pflichtfelder bereitstellen.

Anbei der Auszug aus dem Template:

<review>
      {%- if product.productReviews.count > 0 -%}
      {%- for reviewer in product.productReviews -%}
            <reviewer>
                <name>
                Anonymous
                </name>
                {%- if product.productReviews.id is defined -%}
                <reviewer_id>
                {{ product.productReviews.id }}
                </reviewer_id>
                {%- endif -%}
            </reviewer>
            {%- if product.productReviews.createdAt is defined -%}
                <review_timestamp>
                 {{ product.productReviews.createdAt|date('Y-m-dTH:i:s') }}
            </review_timestamp>
            {%- endif -%}
            <title>
                {{ product.productReviews.first.title }}
            </title>
            <content>
                {{ product.productReviews.first.content }}
            </content>
            <products>
                <product>
                   <product_url>
                    {{ seoUrl('frontend.detail.page', {'productId': product.id}) }}
                    </product_url>
                </product>
            </products>
            <ratings>
                <overall min="1" max="5">
                    {{ product.productReviews.first.points }}
                </overall>
            </ratings>
            <review_url type="singleton">
                {{ seoUrl('frontend.detail.page', {'productId': product.id}) }}
            </review_url>

            {%- endfor -%}              
{%- endif -%}
</review>

Vielleicht kann mir jemand 2 Dinge erklären. Warum wird bei der Abfrage {%- if product.productReviews.id is defined -%} nichts ausgegeben obwohl ich ohne IF-Schleife einen Wert erhalte?
Zweitens möchte ich die For-Schleife verstehen. Da ein Produkt ja auch mehrere Bewertungen haben kann, habe ich die Schleife so eingebaut. Würde es so funktionieren?

Ich habe es ohne die eingeschlossenen IF-Schleifen probiert. Dann erhalte ich jedoch die Fehlermeldung:

Failed rendering string template using Twig: Failed rendering string template using Twig: Neither the property „id“ nor one of the methods „id()“, „getid()“/„isid()“/„hasid()“ or „__call()“ exist and have public access in class „Shopware\Core\Content\Product\Aggregate\ProductReview\ProductReviewCollection“ in „bbb14dfb263fe69e7b83262fefb5e899“ at line 9.

Zeile 9 lautet dabei : {{ product.productReviews.id }}

Wenn ich jedoch dieses änder auf: {{ product.productReviews.first.id }} erhalte ich in der Ausgabe die erste Bewertung so oft, wie die Bewertungsanzahl des Artikels ist.

Ich würde ich freuen, wenn mir das jemand erklären kann. Ich bin mit SW 6.4.20.2 unterwegs.

Viele Grüße,
André

Hallo,
Genau auch mein Problem.
Man kann mit {{ product.productReviews.first.content }} oder {{ product.productReviews.last.content }} anzeigen.
Wie kommt man an die zwischen dem ersten und letzten Review?
Mit {% set anzahl = product.productReviews|length %} zähle ich die Anzahl der Reviews, aber das hilft nur bedingt. Es scheint nur first/last zu geben. [0] oder [1] etc. funktioniert leider nicht.

Wenn jemand weiß, wie es geht, bitte nicht geheim halten :wink:
Gruß
Gunnar

Ich antworte mir mal :wink:
Vielleich kann es ja wer brauchen.
Verkaufskanal->Template->Produktzeile

{% for review in product.productReviews.getElements() %}
    <name>{{ product.translated.name|escape }}</name>
    <review>
        <review_id>{{ review.id }}</review_id>
        <reviewer>
            {% if  review.customer is not null %}
                <name>{{ review.customer.firstName }}</name>
                <reviewer_id>{{ review.customer.id }}</reviewer_id>
            {% else %}
                <name>{{ review.externalUser }}</name>
                <reviewer_id>{{ review.customerId}}</reviewer_id>
            {% endif %}
        </reviewer>
        <review_timestamp>{{ review.createdAt.getTimestamp()|date('y-m-d') }}</review_timestamp>
        <title>{{ review.title }}</title>
        <content>{{ review.content }}</content>
        <review_url type="singleton">{{ seoUrl('frontend.detail.page', {'productId': product.id}) }}</review_url>
        <ratings>
            <overall min="1" max="5">{{ review.points }}</overall>
        </ratings>
            <products>
                <product>
                    <product_ids>
                        <gtins>
                            <gtin>{{ product.ean }}</gtin>
                        </gtins>
                        <mpns>
                            <mpn>{{product.manufacturerNumber}}</mpn>
                        </mpns>
                        <skus>
                            <sku>{{product.productNumber}}</sku>
                        </skus>
                        <brands>
                            <brand>{{ product.manufacturer.translated.name|escape }}</brand>
                        </brands>
                        <asins>
                            <asin></asin>
                        </asins>
                    </product_ids>
                    <product_name>{{ product.translated.name|escape|replace({'&':"und",'?':"",'\\':":",';':","}) |u.truncate(70, '...') }}</product_name>
                    <product_url>{{ seoUrl('frontend.detail.page', {'productId': product.id}) }}</product_url>
                </product>
            </products>
    </review>
{% endfor %}

Aus irgendeinem Grund werden dutzende Leerzeilen zwischen den Rezensionen verschiedener Artikel ausgegeben. Wenn Google das egal ist, ist es mir das auch.
Gruß
Gunnar

2 Likes

Hallo,
das hat mir viel Arbeit erspart. Google möchte die Zeitangabe der Rezension inzwischen in einer genauer definierten Art und Wiese haben:

<review_timestamp>{{ review.createdAt.getTimestamp()|date('Y-m-d\\TH:i:s') }}</review_timestamp>

So wird es akzeptiert.