Inddel egne feeds i flere sider
Sådan deler du et selvbygget XML-feed fra en landingsside op i flere sider. Parameteren bestemmes af din egen feed-template.
Bygger du dit eget feed via en landingsside, kan det blive stort. Rigtig stort. Nogle feed-modtagere vil derfor gerne hente det i mindre portioner i stedet for som én kæmpe fil, og det kalder man paginering: du deler feedet op i flere sider, som hentes én ad gangen.
Denne guide forklarer, hvordan paginering fungerer i selvbyggede feeds, hvordan du sætter det op i din feed-template, og hvad du skal være opmærksom på, når du giver URL'erne videre til fx DataFeedWatch, Partner Ads eller Google Merchant Center.
Det vigtigste først: Der findes ikke én fast paginerings-parameter til selvbyggede feeds. Det er din egen feed-template, der bestemmer, hvad parameteren hedder, og hvor mange produkter der er på en side. Shoporama sender simpelthen alle parametre fra URL'en videre til templaten.
Sådan hænger et selvbygget feed sammen
Et selvbygget feed består af to dele:
- En landingsside, der bestemmer hvilke produkter der er med. Du finder den under Indhold, Landingssider.
- En XML-template i dit tema, der bestemmer hvordan feedet ser ud. Filnavnet skriver du i feltet XML-filnavn under overskriften Eget XML, når du redigerer landingssiden.
Feedet ligger derefter på landingssidens adresse med .xml sat bagpå, fx https://dinshop.dk/mit-feed.xml.
Fordi det er din template, der bygger indholdet, er det også den, der skal kunne dele feedet op. Der er ingen indbygget sideopdeling, som slår til af sig selv.
Sådan paginerer du dit feed
Alle parametre i URL'en er tilgængelige i templaten via variablen $get. Henter du fx ?page=2, kan templaten læse værdien som $get.page. Du vælger selv navnet: page, side, offset eller noget helt fjerde virker lige godt.
Herunder er et minimalt eksempel med 500 produkter pr. side, hvor sidetællingen starter ved 0:
<{$per_page = 500}>
<{$page = $get.page|default:0}>
<{$offset = $page * $per_page}>
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:g="http://base.google.com/ns/1.0">
<channel>
<{foreach $landing_page->getProducts($per_page, $offset) as $product}>
<item>
<g:id><{$product->getProductId()}></g:id>
<title><{$product->getName()|escape}></title>
</item>
<{/foreach}>
</channel>
</rss>
De to tal, du sender til getProducts(), er antal produkter og hvor mange der skal springes over. Side 0 springer 0 over, side 1 springer 500 over, side 2 springer 1000 over og så videre. Når en side ikke returnerer flere produkter, er du nået til enden.
Bemærk: I feed-templates skal du bruge $get. Skriver du $smarty.get, får du ingenting, fordi webshop-templates kører i sikker tilstand. Kører dit tema på Smarty 2, skal tildelingerne desuden skrives som <{assign var="page" value=$get.page}>.
Hvor mange produkter skal der være pr. side?
Det bestemmer du selv i templaten. Feltet Antal produkter på landingssiden styrer visningen af landingssiden som almindelig HTML-side, men det bruges ikke automatisk i dit eget XML-feed.
Et fornuftigt udgangspunkt er 300 til 1000 produkter pr. side. Har du mange varianter, tunge beskrivelser eller mange billeder pr. produkt, så vælg det lave tal. Husk at en side i feedet godt kan indeholde flere linjer end produkter, hvis din template skriver en linje pr. variant.
Hent alle sider i et script
Skal du selv hente feedet fra en anden server, kan du loope, indtil en side ikke længere indeholder produkter:
$page = 0;
while (true) {
$url = "https://dinshop.dk/mit-feed.xml?page=".$page;
$xml = file_get_contents($url);
if (empty(trim($xml)) || stristr($xml, "<item>") === false) {
break;
}
// gem eller forarbejd indholdet her
$page++;
}
Brug det tag, der markerer et produkt i netop dit feed. I eksemplet er det <item>, men det kunne også være <product> eller noget helt tredje.
Pas på forskydningen mellem side 0 og side 1
Den hyppigste fejl i praksis er, at feedet og modtageren ikke er enige om, hvor tællingen starter. Starter din template ved 0, mens feed-modtageren henter side 1, 2, 3 og fremefter, så mangler de første produkter i feedet helt uden at nogen får en fejlbesked.
Vær derfor opmærksom på to ting:
- URL'en uden parameter svarer til den første side, fordi templaten typisk falder tilbage til 0. Nogle feed-modtagere henter netop den som første side, og starter derefter ved 1.
- Vil du hellere tælle fra 1, så træk 1 fra i templaten: <{$offset = ($page - 1) * $per_page}>. Så passer det med modtagere, der altid begynder ved side 1.
Tjek altid efter opsætning, at det første produkt på første side rent faktisk er det første produkt på landingssiden.
Hastighed: feedet bygges automatisk i baggrunden
Henter du feed-URL'en uden parametre, serverer Shoporama en færdigbygget fil. Den bliver bygget automatisk i baggrunden, når dine produkter er blevet ændret, og den bliver også ryddet, når du retter i selve landingssiden. Derfor er den parameterløse hentning både hurtig og skånsom, uanset hvor stort feedet er.
Sender du parametre med, kan svaret ikke komme fra den fil, for så beder du om noget andet end hele feedet. Den slags hentninger bygges derfor på stedet. Det er helt i orden, når hver side kun indeholder en portion af kataloget, men det er også grunden til, at det ikke kan betale sig at dele feedet op, hvis modtageren fint kan tage det i ét stykke.
Tip: Har din feed-modtager ikke brug for sideopdeling, så giv dem den rene URL uden parametre. Det er den hurtigste og mest stabile måde at hente et stort feed på.
Feeds der ikke kan paginere
Sideopdeling gælder kun feeds, du selv bygger med en XML-template. To andre feed-typer i Shoporama kan ikke deles op, og det er der heller ikke brug for:
- Google Shopping-feedet på en landingsside (adressen der ender på .rss) indeholder altid alle produkter på landingssiden og bygges automatisk i baggrunden.
- Produktfeeds under Produkter, Produktfeeds bygges også i baggrunden og leveres altid som én samlet fil. Læs mere i artiklen Byg dine egne feeds.
Sideopdeling på landingssider og blog
Almindelige landingssider og din webshops blog har derimod en fast parameter, der virker uden at du skal gøre noget: ?p=, hvor tællingen starter ved 0.
https://dinshop.dk/min-landingsside (samme som ?p=0)
https://dinshop.dk/min-landingsside?p=1 (anden side)
https://dinshop.dk/blog?p=1 (anden side i bloggen)
På landingssider styres antallet pr. side af feltet Antal produkter, dog højst 500 ad gangen. Bloggen viser 10 indlæg pr. side. Det er kun disse HTML-sider, der bruger ?p=. I dit eget XML-feed betyder parameteren ingenting, medmindre din template selv læser den.
Ofte stillede spørgsmål
Hvilken parameter skal jeg bruge til mit feed?
Den, din feed-template læser. Har du fået temaet lavet af en udvikler, så spørg dem, eller kig i den XML-fil, der er nævnt i feltet XML-filnavn på landingssiden. De mest almindelige er ?page= og kombinationen ?limit= og ?offset=.
Jeg får det samme indhold på alle sider. Hvad er galt?
Så læser din template ikke parameteren. Hent to sider og sammenlign de første produkter i hver: er de ens, ignorerer templaten sideopdelingen og skriver hele kataloget hver gang. Det skal rettes i selve templaten, som vist i eksemplet ovenfor. Alternativt kan du bare hente feedet uden parametre som én fil.
Starter sidetællingen ved 0 eller 1?
Det bestemmer din template. Standard-eksemplet ovenfor starter ved 0, hvor den parameterløse URL er første side. Vær sikker på, at feed-modtageren begynder samme sted, ellers springes den første portion produkter over.
Hvordan ved jeg, at jeg har hentet alle sider?
Når en side ikke længere indeholder produkter, er der ikke flere. Stop loopet der. Du kan også lade templaten skrive det samlede antal ud med $landing_page->getProductCount(), så modtageren kan regne antallet af sider ud på forhånd.
Får jeg dubletter, hvis et produkt skifter side undervejs?
Det kan ske, hvis produkter oprettes eller fjernes, mens du henter siderne. Sandsynligheden er lille, men vil du være helt sikker, så hent alle sider tæt på hinanden, eller fjern dubletter på produkt-id efter at have samlet dem. Bemærk at nogle feed-værktøjer ikke selv fjerner dubletter, og at et gentaget produkt-id kan få fx Meta til at afvise hele feedet.
Kan jeg sende én samlet URL til Google Merchant Center?
Ja. Send feed-URL'en uden parametre, så får du hele feedet som én fil. Sideopdeling er kun nødvendig, hvis modtageren udtrykkeligt beder om det.
Skal jeg overhovedet dele mit feed op i dag?
Sjældent. Fordi den parameterløse hentning serveres som en færdigbygget fil, er selv meget store feeds hurtige at hente. Del kun op, hvis din modtager kræver det, eller hvis du henter feedet ind i et system, der ikke kan holde til én stor fil.
Kan jeg bruge det samme til CSV eller JSON?
Feltet på landingssiden hedder XML-filnavn, men templaten kan skrive lige det format, du vil, herunder CSV eller JSON. Skal du bruge et rigtigt CSV- eller JSON-feed uden selv at skrive en template, er Produktfeeds som regel den nemmere vej.
Hvad gør jeg, hvis min annoncepartner ikke kan håndtere flere URL'er?
Så giv dem den parameterløse URL, der indeholder hele feedet. Skal siderne endelig samles hos dig selv, skal du huske at fjerne XML-headeren fra side to og fremefter, så filen forbliver gyldig XML.
Har du brug for hjælp? Kontakt os på support@shoporama.dk.
Relaterede artikler
Byg dine egne feeds
Guide til at bygge dine egne produkt-feeds i CSV, XML eller JSON-format med Shoporamas custom feed-funktion.
Opsæt Google Shopping Feed
Guide til at opsætte Google Shopping Feed i Shoporama: kategorier, custom labels, produkt-id og katalogmatch samt lands- og sprogfeeds.
Priceshape feed
Guide til at opsætte et Priceshape-feed på din Shoporama-webshop via en XML-fil og en landingsside.
Medtag farve og størrelse i Partner Ads feed
Guide til at tilføje farve, størrelse og køn til dit Partner Ads feed i Shoporama via produktprofiler og ekstrafelter.
Billeder på landingssider
Sådan uploader du billeder til en landingsside i Shoporama og viser dem korrekt i dit tema med getImages() og getSrc().
Blog tilknyttet din shop
Komplet guide til blogfunktionen i Shoporama – opret indlæg, planlæg publicering, tilknyt produkter, optimér til søgemaskiner og brug dynamiske...