Objava cjenika na webshopu: XML i CSV, svaki dan
Odluka o objavi cjenika (NN 101/2026) traži cjenik u XML ili CSV obliku na mrežnoj stranici, osvježen svaki dan do 8:00 i dostupan 30 dana. Dodatak to radi sam, na stalnoj adresi i s arhivom.
Što propis traži
Odluka o objavi cjenika, objavljena u NN 101/2026 dana 11.9.2026., uvodi obvezu objave cjenika na mrežnoj stranici trgovca. Primjenjuje se od 1. listopada 2026. i vrijedi za one koji mrežnu stranicu imaju, što webshop po definiciji ima.
- Oblik: XML ili CSV, dakle pogodan za automatsku obradu. PDF i slika ne prolaze jer ih stroj ne može pročitati bez pogađanja.
- Osvježavanje: svaki dan, do 8:00 ujutro.
- Dostupnost: objavljeni cjenik ostaje dostupan 30 dana.
- Sadržaj: naziv i cijena artikla, sidrena cijena i podaci o posebnim oblicima prodaje, dakle o sniženjima.
Kazne su iste kao za sidrenu cijenu, jer dolaze iz istog zakona: 3.000 do 30.000 € trgovcu i 1.000 do 4.000 € odgovornoj osobi.
Kako to izgleda kad radi
Svaki dan, odmah nakon snimanja cijena, cijeli se katalog izveze u odabrane formate i objavi na stalnoj adresi. Dnevna datoteka ostaje kao arhiva, a uz nju stoji i datoteka bez datuma koja uvijek pokazuje najnoviji cjenik.
Time onaj tko cjenik povlači strojno ne mora pogađati kako se datoteka danas zove: može ciljati stalnu adresu i uvijek dobiti aktualno stanje, ili proći kroz arhivu ako mu treba određeni dan.
Početak adrese je postavka. Ako trgovina već ima stranicu na /cjenik/, promijenite ga i stranica ostaje netaknuta; dodatak sam provjerava postoji li takva stranica i prijavi sudar prije nego se dogodi.
https://vasa-trgovina.hr/cjenik/ ← popis i poveznice
https://vasa-trgovina.hr/cjenik/cjenik.csv ← uvijek najnoviji
https://vasa-trgovina.hr/cjenik/cjenik.xml
https://vasa-trgovina.hr/cjenik/cjenik.json
https://vasa-trgovina.hr/cjenik/cjenik-2026-09-21.csv
https://vasa-trgovina.hr/cjenik/index.json ← popis svih danaNaziv datoteke je propisan, sintaksa nije
Ovo se najčešće previdi. Točka VI. Odluke traži da naziv datoteke sadrži oblik prodajnog objekta, adresu, oznaku objekta, broj pohrane te datum i vrijeme objave. Datoteka nazvana cjenik.csv taj uvjet ne ispunjava.
Ono što Odluka ne propisuje jest kojim se redom i kojim razdjelnikom ti elementi spajaju, niti postoji XSD shema ili propisan redoslijed stupaca. Zato dodatak donosi jednu odluku i dokumentira je, umjesto da pogađa:
Podaci o objektu su postavka. Za webshop bez fizičke poslovnice zadano je internet trgovina, a adresa se uzima iz WooCommerce postavki trgovine.
Pojam broj pohrane Odluka ne definira. Ovdje se tumači kao redni broj objave, koji raste sa svakim izvozom i nikad se ne ponavlja. To tumačenje piše i u uputama, da trgovac zna što brani ako ga netko pita.
Uz propisanu datoteku ostaje i cjenik.csv bez vremenske oznake. Odluka je ne traži, ali bez nje onaj tko cjenik povlači automatski mora svaki dan pogađati novi naziv.
INTERNET-TRGOVINA_LUKORANSKA-17-ZAGREB_1_42_21092026_0315.csv
oblik_adresa_oznaka_brojPohrane_ddmmgggg_hhmmTri formata, isti sadržaj
CSV je razdvojen točkom-zarezom, jer je to zapis koji daju hrvatski ERP-ovi i Excel s hrvatskim regionalnim postavkama. Brojevi u njemu imaju decimalnu točku i nemaju razdjelnik tisuća: hrvatski zarez uz točku-zarez kao razdjelnik polja glavni je izvor pogrešnog čitanja.
XML nosi jedan element po artiklu i zaglavlje s nazivom trgovine, datumom i valutom. JSON ima isto to, plus broj artikala na kraju, pa se nepotpuna datoteka odmah prepozna.
Formati se biraju u postavkama. Isključite li sve, ostaje CSV, jer uključen cjenik bez ijednog formata ne bi proizveo ništa, a trgovac bi mislio da objavljuje.
Arhiva i popis u JSON-u
Uz cjenike stoji index.json, koji nabraja sve dostupne dane i adrese po formatima, uz naziv trgovine, datum zadnjeg izvoza, broj artikala i popis stupaca. To je ulazna točka za bilo koga tko cjenik povlači automatski.
Koliko se dana čuva je postavka; zadano devedeset, a ispod 30 se ne može jer toliko propis traži. Stariji dnevni cjenici se brišu, a najnoviji uvijek ostaje.
{
"trgovac": "Vaša trgovina",
"azurirano": "2026-09-21 03:22:14",
"dan": "2026-09-21",
"artikala": 4318,
"stupci": ["sifra", "naziv", "barkod", "…"],
"najnoviji": { "csv": "…/cjenik.csv", "xml": "…", "json": "…" },
"arhiva": [ { "dan": "2026-09-21", "formati": { … } } ]
}Zašto se poslužuje kroz PHP
Datoteka u mapi uploads javna je i na Apacheu i na nginxu, a pravilo u .htaccess vrijedi samo na Apacheu. Zato cjenik ne stoji na izravnoj adresi nego prolazi kroz WordPress, gdje se poštuje postavka o javnosti bez obzira na posluživač.
Time su i zaglavlja pod kontrolom: točan tip sadržaja, naziv datoteke i zabrana pogađanja tipa. Preglednik koji otvori CSV ne dobije stranicu, a alat koji ga povlači ne mora nagađati kodiranje.
Postavkom se cjenik može sakriti od javnosti. Tada adresu vide samo prijavljeni administratori trgovine, što je korisno dok se izvoz provjerava prije nego ga date dobavljaču.
Veliki katalozi
Izvoz ide u serijama, kao i snimanje cijena. Piše se u privremenu datoteku i preimenuje tek kad je cijeli katalog unutra, pa tko god cjenik dohvati usred izvoza dobije jučerašnji, cijeli, umjesto današnjeg polovičnog.
To je razlika koja se ne vidi dok ne zatreba: polovičan cjenik ne izgleda pokvareno, samo ima manje artikala, i nitko to ne primijeti dok netko ne pita zašto mu artikl nedostaje.
Prilagodba sadržaja
Redak prolazi kroz filter prije zapisivanja, pa se vrijednosti mogu promijeniti ili dopuniti iz teme ili vlastitog dodatka, bez diranja izvornog koda.
add_filter( 'klikoteka_cjenik_red', function ( $red, $product ) {
$red['kategorija'] = strtoupper( $red['kategorija'] );
return $red;
}, 10, 2 );Stupci izvoza (prvih jedanaest je točka III. Odluke)
| Stupac | Što sadrži |
|---|---|
| naziv | Naziv artikla kako stoji u trgovini |
| sifra | SKU artikla; kad ga nema, WooCommerce ID |
| marka | Iz WooCommerce taksonomije marki, ili iz atributa marka/brand |
| jedinica_mjere | Kad postoji. Odluka je traži samo ako je primjenjiva |
| cijena_za_jedinicu | Jedinična cijena, kad su poznati jedinica i sadržaj |
| maloprodajna_cijena | Cijena s PDV-om, onakva kakvu kupac vidi |
| posebni_oblik_prodaje | Prazno ili sniženje |
| sidrena_cijena | Cijena na referentni dan, kad postoji |
| sidrena_na_dan | Koji je to dan. Nije isti za sve artikle: hrana i kozmetika nose 2.5.2025., ostalo 10.9.2026. |
| barkod | GTIN/EAN iz WooCommerceova polja, kad je popunjen |
| dostupnost | dostupno ili nedostupno, uz količinu kad se vode zalihe |
| kategorija | Pune kategorije, odvojene kosom crtom |
| cijena_bez_pdv | Ista cijena bez PDV-a |
| valuta | Valuta trgovine, npr. EUR |
| najniza_30_dana | Najniža cijena u prozoru, kad ima pokrića |
| url | Adresa artikla na trgovini |
Često pitano
Koliko dugo traje izvoz kataloga od nekoliko tisuća artikala?
Ovisi o poslužitelju, ali obrada ide u serijama od zadanog broja artikala i svaka serija zakaže sljedeću. Tipično je gotovo u nekoliko minuta, a u međuvremenu je stari cjenik i dalje dostupan cijeli.
Mogu li izvoziti samo pojedine kategorije?
Izvoz zahvaća cijeli objavljeni katalog. Sadržaj svakog retka može se mijenjati kroz filter klikoteka_cjenik_red, a redak koji filter isprazni izlazi iz cjenika.
Ulaze li varijacije u cjenik?
Da, svaka varijacija ide kao vlastiti redak, sa svojom šifrom i cijenom. Varijabilni roditelj nema vlastitu cijenu pa se ne izvozi, jer bi njegov redak bio prazan ili proizvoljan.
Mora li cjenik nositi i sidrenu cijenu?
Da, propis traži i nju, uz podatke o sniženjima. U izvozu su to stupci sidrena_cijena, sidrena_na_dan, na_snizenju i najniza_30_dana. Kako Odluka ima dva referentna dana, stupac sidrena_na_dan se razlikuje od artikla do artikla, a jedna datoteka svejedno pokriva cijeli katalog.
Je li cjenik indeksiran na Googleu?
Stranica s popisom nosi noindex, a same datoteke su podaci, ne sadržaj za tražilice. Cjenik je namijenjen strojevima i ljudima koji ga traže, a ne rezultatima pretrage.
Što ako već imam feed za Google Shopping?
To je drugi posao. Feed za oglašavanje ima svoja polja i svoja pravila. Ovaj cjenik je izvoz cijelog kataloga s cijenama i povijesnim podacima, u obliku koji se daje dobavljaču, agregatoru ili onome tko zatraži cjenik.
Ostalo u istom dodatku
Najniža cijena u zadnjih 30 dana
Kako se računa, zašto WooCommerce to ne zna sam i što se prikazuje dok povijesti nema.
Sidrena cijena na referentni dan
Druga odluka iz istog NN 101/2026. Dva referentna dana i kako se postavlja koji vrijedi za koje artikle.
Sidrena cijena i cjenik za WooCommerce
Sve tri funkcije, jednokratno 20,00 € + PDV.
