NordicCode
Marknadsföring

Varför WooCommerce-produkter försvinner ur Googles Rich Results

Förra veckan fick jag ett mejl från en kund. Google Search Console hade skickat en varning om produkter. 65 produkter flaggades. Kritiskt fel: “Missing field lowPrice”.

Jag öppnade Search Console och tittade på rapporten. 65 invalid, 63 valid, 77 med varningar. Google hade crawlat allt det här samma dag.

Jag kollade schemat i källkoden på nio av de flaggade URL:erna. Varje enskild produkt hade lowPrice: "". Alla nio var variabla produkter. Och alla nio hade slut på alla varianter.

Det var hela felet.

Vad Google egentligen varnar om

När en WooCommerce-produkt har rätt strukturerat data kan Google visa priser direkt i sökresultaten. Det kallas Rich Results, eller produktutdrag. En rad med pris och ibland stjärnbetyg, direkt under länken.

Saknas lowPrice i schemat markerar Google produkten som invalid. Den syns fortfarande i sökresultaten. Men utan prisuppgiften och utan det extra utrymme som Rich Results ger.

Det påverkar klickfrekvensen. Din produkt tar mindre plats i resultatet och säger mindre. Står en konkurrent precis under dig med pris och stjärnbetyg synligt är det den raden ögat fastnar på. Du tappar klicket utan att något i butiken är fel. Det är ett av de vanligare skälen till att produkter tappar synlighet utan en uppenbar förklaring.

Varför slutsålda varianter tappar priset

WooCommerce har en lagerinställning under Produkter → Lager: “Dölj slutsålda varor från katalogen”.

Det som de flesta inte tänker på: den inställningen påverkar inte bara hur produkter visas i butiken. Den påverkar hur WooCommerce returnerar priser internt.

Standardmetoden för att hämta prisintervallet på en variabel produkt är get_variation_prices(). Den metoden filtrerar bort slutsålda varianter.

Är alla varianter i en produkt slut returnerar metoden en tom array. Ingen array, inget prisintervall. lowPrice blir en tom sträng.

Felet i koden

En vanlig implementation för variabla produkters schema ser ut ungefär så:

$prices    = $product->get_variation_prices();
$min_price = ! empty( $prices['price'] ) ? min( $prices['price'] ) : '';
$max_price = ! empty( $prices['price'] ) ? max( $prices['price'] ) : '';

För en produkt med varianter i lager fungerar det felfritt. Men för en produkt där alla varianter är slut returnerar get_variation_prices() en tom array. $min_price blir ''. Google ser lowPrice: "". Invalideringsfel.

Det är inte ett fel i koden i sig. Det är ett korrekt beteende för produkter i lager som ger fel beteende för slutsålda.

Lösningen: läs priset från barnprodukterna direkt

Varje variant är en barnprodukt i WooCommerce. Barnprodukterna lagrar priset i ett eget fält som inte påverkas av lagerinställningen. Det priset finns kvar, oavsett om varianten är slut.

Istället för att läsa via get_variation_prices(): hämta barnprodukterna med get_children() och läs priset direkt från varje barn.

$children     = $product->get_children();
$child_prices = [];

foreach ( $children as $child_id ) {
    $child = wc_get_product( $child_id );
    if ( $child && $child->get_price() !== '' ) {
        $child_prices[] = (float) $child->get_price();
    }
}

$min_price = ! empty( $child_prices ) ? min( $child_prices ) : '';
$max_price = ! empty( $child_prices ) ? max( $child_prices ) : '';

// Har ingen variant ett pris alls: hoppa över offers-blocket i schemat helt.
// Tomt värde är sämre än inget värde.

Det är det korrekta sättet att läsa priser för variabla produkter när du inte vet om alla varianter är i lager eller inte.

Hur du verifierar utan att störa cachen

Plugins som LiteSpeed eller W3 Total Cache serverar sparad HTML. En ändring i koden syns inte förrän cachen rensas.

Enklaste sättet att se live PHP-output utan att röra cachen: lägg till en parameter i URL:en som cachen aldrig sett.

https://din-butik.se/produkt/produktnamn/?nocache=1

Kör sedan URL:en genom Googles Rich Results Test. Ser du rätt prisintervall för en slutsåld produkt sitter fixen på plats.

För kunden gick det snabbt att bekräfta. En produkt med varianter för 399, 299 och 199 kronor visade lowPrice: 199 korrekt. De 63 produkterna som redan fungerade förblev opåverkade.

Vanliga frågor

Hur vet jag om min butik har det här problemet? Öppna Google Search Console och leta efter “Produkter” eller “Product snippets” under Rika resultat eller Förbättringar. Ser du fel av typen “Missing field lowPrice” och har variabla produkter med slutsålda varianter är det sannolikt det här. Kontrollera genom att titta på schemat i källkoden på en flaggad sida (högerklick → Visa sidkälla, sök på “schema.org”).

Påverkar det här produkternas ranking i Google? Rich Results påverkar klickfrekvens, inte ranking direkt. Men en produkt utan Rich Result syns mer anonymt. Det kan vara svårt att se kopplingen direkt, men det är ett av de vanligare skälen till att en butik tappar synlighet utan en uppenbar orsak.

Gäller det bara variabla produkter? Ja. Enkla produkter har inget prisintervall och påverkas inte. Det är specifikt kombinationen variabel produkt, alla varianter slut och “Dölj slutsålda varor från katalogen” aktiverat i WooCommerce-inställningarna.

Ska jag köra Validate Fix i Search Console direkt? Det är frivilligt. Google recrawlar flaggade sidor automatiskt. Kör du Validate Fix begär du att Google prioriterar recrawlen och snabbar på processen med dagar till veckor. Nödvändigt är det inte.

Funkar det här med alla schema-plugins? Det beror på hur pluginet läser priser internt. Plugin som anropar get_variation_prices() har samma beteende som beskrivs ovan. Testa specifikt mot en slutsåld variabel produkt och verifiera via Googles Rich Results Test, oavsett vilket plugin du använder.

Har din hemsida samma problem?

Skicka din URL. Jag kollar vad som kan förbättras och skickar tillbaka 3 till 5 konkreta punkter. Helt gratis.

Gratis SEO-koll

Relaterade artiklar