Google Merchant Center- Verfügbarkeitsdatum, korrektes Format?

Hallo zusammen

Weiss jemand von Euch, wie man im Google Feed das „availability_date“ korrekt formatiert? Ich habe schon alles mögliche durchprobiert, doch im Google Merchant Center erhalte ich bei sämtlichen Produkten stehts den Hinweis (kein Fehler) Ungültiges Datum und/oder ungültige Zeit [Verfügbarkeitsdatum] Verwenden Sie das unterstützte Datums- und Zeitformat JJJJ-MM-DDThh:mm:ssZ (ISO 8601)

Und so siehts in meinem Template derzeit aus:

  {% if product.deliveryTime %}
        <g:availability_date>{{ "now"|date("Y-m-d\\TH:i:s\\Z") }}</g:availability_date>
    {% endif %}

Ich habe auch schon den von Google empfohlenen Link Datums- und Zeitangaben formatieren - Google Merchant Center-Hilfe angeschaut, komme aber trotzdem nicht weiter.

Irgendwo im Google Leitfaden habe ich auch mal gelesen, dass auf der Landing-Page ebenfalls das genaue Availability Date existieren muss. Da könnte ich dann allerdings kaum viel ausrichten, da Shopware dies nicht anbietet. Oder wo könnte sonst noch der Fehler liegen?

LG

Bei „now“ muss doch eigentlich die Variabel product.deliveryTime rein oder? Um das Datum richtig zu formatieren kann du |date("c") oder |date("Y-m-d\\TH:i:sP") ausprobieren:

{% if product.deliveryTime %}
        <g:availability_date>{{ product.deliveryTime|date("c")}}</g:availability_date>
{% endif %}

Oder so:

{% if product.deliveryTime %}
        <g:availability_date>{{ product.deliveryTime|date("Y-m-d\\TH:i:sP")}}</g:availability_date>
{% endif %}

Danke für Deine Hilfe. Allerdings erhalte ich bei beiden Möglichkeiten eine Fehlermeldung.

{"errors":[{"code":"0","status":"500","title":"Internal Server Error","detail":"Object of class Shopware\\Core\\System\\DeliveryTime\\DeliveryTimeEntity could not be converted to string"}]}

Passt die Formatierung denn wenn du wieder „now“ nimmst?

{% if product.deliveryTime %}
        <g:availability_date>{{ "now"|date("c")}}</g:availability_date>
    {% endif %}
{% if product.deliveryTime %}
        <g:availability_date>{{ "now"|date("Y-m-d\\TH:i:sP")}}</g:availability_date>
    {% endif %}

Ach, du musst glaube ich die variabel in Anführungszeichen setzen, wie bei „now“:

{% if product.deliveryTime %}
        <g:availability_date>{{ "product.deliveryTime"|date("c")}}</g:availability_date>
{% endif %}
{% if product.deliveryTime %}
        <g:availability_date>{{ "product.deliveryTime"|date("Y-m-d\\TH:i:sP")}}</g:availability_date>
{% endif %}

Mit dem „now“ funktionierts, doch mit „product.deliveryTime“ leider nicht. Hmmm

{"errors":[{"status":"400","code":"FRAMEWORK__STRING_TEMPLATE_RENDERING_FAILED","title":"Bad Request","detail":"Failed rendering string template using Twig: Failed rendering string template using Twig: An exception has been thrown during the rendering of a template (\u0022Failed to parse time string (product.deliveryTime) at position 0 (p): The timezone could not be found in the database\u0022) in \u0022ee28160dfacbd5679485c6a9cfa7d5bb\u0022 at line 30.","meta":{"parameters":{"message":"Failed rendering string template using Twig: An exception has been thrown during the rendering of a template (\u0022Failed to parse time string (product.deliveryTime) at position 0 (p): The timezone could not be found in the database\u0022) in \u0022ee28160dfacbd5679485c6a9cfa7d5bb\u0022 at line 30."}}}]}

Habt ihr schon einmal gelesen, für was das Feld ist? Meiner Meinung nach ist das hier völliger Unsinn, was ihr versucht umzusetzen.

Use the availability date [availability_date] attribute to tell customers when a preordered or backordered product will be shipped.

Ehrlich gesagt nein. Ich habe die Vorlage von Shopware übernommen und da stand eben das Availability Date drin. Ich selber führe kein grösseres Lager, sondern bestelle jeweils direkt bei meinen Lieferanten. Somit wäre ich zufrieden, wenn Google einfach „Lieferzeit 1-3“ Tage eintragen würde. Doch wenn ich das availability Datum weglasse, reklamiert er, weil er dieses möchte.

Ich möchte einfach, dass dieses "Abgelehnte Attribute " verschwindet

Dann lösche das Feld doch einfach aus dem Template.

Mach ich doch. :slight_smile:

Drei Stunden für die Katz verbraten. :crazy_face:

Verfügbarkeitsdatum 1-3 Tage

:sweat_smile:

Aber immerhin wissen wir jetzt wie man in Twig ein Datum nach ISO 8601 formatiert, ist bestimmt immer hilfreich :wink:

1 „Gefällt mir“

@Max_Shop
Aber wieso erhalte ich denn nach dem Löschen des Attributs und neu Starten des Feeds weiterhin im Merchant Center die Meldung:

Ungültiges Datum und/oder ungültige Zeit [Verfügbarkeitsdatum]

Verwenden Sie das unterstützte Datums- und Zeitformat JJJJ-MM-DDThh:mm:ssZ (ISO 8601)

Oder muss ich zuerst alle Daten löschen und erst dann nochmals den Feed starten?

Wenn das Attribute in dem Feed ist und der Inhalt fehlerhaft, dann meckert Google. Wenn das Attribut nicht existiert, dann interessiert es Google auch nicht.

Nein, die Daten musst du eigentlich nicht löschen. Das macht alles Google für dich.

Das ist aber nicht mehr im Feed. :thinking:

<item>
    <g:id>{{ product.productNumber }}</g:id>
    <title>{{ product.translated.name|escape }}</title>
    <description>
        {% if product.translated.metaDescription is defined %}
            {{ product.translated.metaDescription|escape }}
        {% else %}
            {{ product.translated.description|escape }}
        {% endif %}
    </description>
    <g:google_product_category>950{# change your Google Shopping category #}</g:google_product_category>
    {%- if product.categories.count > 0 -%}
        <g:product_type>
            {% set breadcrumb = product.categories.first.getBreadCrumb|slice(1)|join(' > ')|raw %}
            {% if "Kosmetik" in breadcrumb %}
                Kosmetik > {{ product.categories.first.name|escape }}
            {% elseif "Gesundheitsprodukte" in breadcrumb %}
                Gesundheitsprodukte > {{ product.categories.first.name|escape }}
            {% elseif "Gartenprodukte" in breadcrumb %}
                Gartenprodukte > {{ product.categories.first.name|escape }}
            {% else %}
                {{ product.categories.first.name|escape }}
            {% endif %}
        </g:product_type>
    {%- endif -%}
    <link>{{ seoUrl('frontend.detail.page', {'productId': product.id}) }}</link>
    {% if product.cover.media is defined %}<g:image_link>{{ product.cover.media.url }}</g:image_link>{% endif %}
    <g:condition>new</g:condition>
    {% set price = product.calculatedPrice %}
    {%- if product.calculatedPrices.count > 0 -%}
        {% set price = product.calculatedPrices.last %}
    {%- endif -%}
    <g:price>{{ price.unitPrice|number_format(context.currency.itemRounding.decimals, '.', '') }} {{ context.currency.isoCode }}</g:price>
    {% if product.manufacturer is not null %}
        <g:brand>{{ product.manufacturer.translated.name|escape }}</g:brand>
    {% endif %}
    <g:gtin>{{ product.ean }}</g:gtin>
    <g:mpn>{{ product.manufacturerNumber }}</g:mpn>
    <g:shipping>
        <g:country>CH</g:country>
        <g:service>Standard</g:service>
        {% set weight = product.weight %}
        {% if weight <= 2 %}
            <g:price>7.00 CHF</g:price>
        {% elseif weight <= 10 %}
            <g:price>9.70 CHF</g:price>
        {% elseif weight <= 30 %}
            <g:price>20.50 CHF</g:price>
        {% endif %}
    </g:shipping>
</item>

Da fehlt wohl ein else?

Das wird auch nicht funktionieren. Die 950 darf da nicht fix drin stehen, sonst sind alle Produkte in der gleichen Kategorie.

Herzlichen Dank für Deine Korrekturen. :slightly_smiling_face:
Manchmal sieht man von lauter Bäumen den Wald nicht mehr. Die Kategorie habe ich nun mal etwas umgebaut. Wäre das so i.O.?

<g:google_product_category>
        {% set defaultCategoryId = 950 %}
        {% if product.categories.count > 0 %}
            {% set categoryId = product.categories.first.id %}
            {{ categoryId }}
        {% else %}
            {{ defaultCategoryId }}
        {% endif %}
    </g:google_product_category>

    {%- if product.categories.count > 0 -%}
        <g:product_type>
            {% set breadcrumb = product.categories.first.getBreadCrumb|slice(1)|join(' > ')|raw %}
            {% if "Kosmetik" in breadcrumb %}
                Kosmetik > {{ product.categories.first.name|escape }}
            {% elseif "Gesundheitsprodukte" in breadcrumb %}
                Gesundheitsprodukte > {{ product.categories.first.name|escape }}
            {% elseif "Gartenprodukte" in breadcrumb %}
                Gartenprodukte > {{ product.categories.first.name|escape }}
            {% else %}
                {{ product.categories.first.name|escape }}
            {% endif %}
        </g:product_type>
    {%- endif -%}

Und bei den Versandkosten stehe ich gerade etwas auf dem Schlauch. Klar da fehlt ein „else“. Doch welche Bedingung macht Sinn?

{% if weight <= 2 %}
    <g:price>7.00 CHF</g:price>
{% elseif weight <= 10 %}
    <g:price>9.70 CHF</g:price>
{% elseif weight <= 30 %}
    <g:price>20.50 CHF</g:price>
{% else %}
    <g:price>0.00 CHF</g:price> 
{% endif %}

Ich habe z.B. auch ab einer Betragsgrenze Versandkostenfrei. Aber ob dann 0.00 korrekt wäre.

Wie kommst du denn auf diese wahnwitzige Idee? Das sind nicht Shopwares uuids sondern Google Category Ids.

In ein else kommt immer das default rein. Sonst meckert Google ggf. wieder. falls du nun über 30 kg versandkostenfrei versenden möchtest, dann wäre es korrekt. Wenn es um die Bestellsumme geht, dann solltest du kein Gewicht als Referenz nehmen.

<g:availability>
{if isset($sArticle.active) && !$sArticle.active}auf Lager
{elseif $sArticle.sReleaseDate && $sArticle.sReleaseDate|date_format:„%Y%m%d“ > $smarty.now|date_format:„%Y%m%d“}vorbestellbar
{elseif $sArticle.esd}auf Lager
{elseif {config name=„instockinfo“} && $sArticle.modus == 0 && $sArticle.instock > 0 && $sArticle.quantity > $sArticle.instock}auf Lager
{elseif $sArticle.instock >= $sArticle.minpurchase}auf Lager
{elseif $sArticle.shippingtime}auf Lager
{else}auf Lager
{/if}
</g:availability>

Mit diesem Datumformat, s.o. funktioniert bei uns der Feed einwandfrei.

@Max_Shop
Ooooh… tja, schon etwas neben der Spur. :face_with_open_eyes_and_hand_over_mouth:

Betreffend Google IDs. Sind das diese hier? Google Product Category Taxonomy: The Definitive Guide - WebAppick

Das sieht dann z.B. wie folgt aus:
113 Heim & Garten Rasen & Garten Gartenbau Dünger

Wie verlinkt man das dann genau? Und wie weiss Merchant Center welche ID zu welchem Produkt gehört? Irgendwie ist mir das jetzt überhaupt nicht logisch.