Denis Market 97 — sajt za market u Nikolincima i proizvodnju kora u Ledinama
Ista firma prodaje deterdžent komšinici iz sela i tanke kore pekari u Beogradu. Trebalo je napraviti jedan sajt koji obojicu vodi tamo gde treba, bez mešanja poruka i bez ijedne strane koja postoji samo zato da bi je pretraživač izbrojao.
- Klijent
- Denis Market 97, Nikolinci
- Delatnost
- Market mešovite robe i proizvodnja kora za pitu
- Područje
- Opština Alibunar · Beograd
- Tip
- Višestrani sajt, 37 strana
- Tehnologije
- PHP 8.3 · sopstveni ruter · bez baze · JSON-LD
- Sajt
- denismarket.rs
- Status
- Živ sajt, u održavanju
U ovom tekstu
- Čime se Denis Market 97 bavi
- Dva posla, jedno ime, jedan sajt
- Struktura: 37 strana koje se nisu pravile odjednom
- Market: od police do radnog vremena
- Kore: od proizvoda ka poslu
- Recepti kao ulaz za ljude koji još ne traže kore
- Lokacije: razdaljine koje su izmerene, ne procenjene
- Tehnička izvedba
- Brzina, animacije i to da se sajt vidi bez obzira na sve
- Strukturirani podaci, meta i vidljivost
- Šta klijent na kraju ima
Čime se Denis Market 97 bavi
Denis Market 97 je mala firma iz Nikolinaca koja radi dva posla pod istim imenom. Prvi je market na Glavnoj 49, u centru sela u opštini Alibunar, otvoren svaki dan od 6 do 23 h, i vikendom i praznikom. Drugi je proizvodnja tankih kora za pitu i gibanicu u Ledinama, na Surčinskoj, za pekare, restorane, markete i domaćinstva.
Radnja je otvorena 2025. godine, sa idejom koju u selu svako razume: da ima svega i da ne zatvara u sedam uveče. Roba stiže svakodnevno, hleb i mlečni proizvodi ujutru, police se dopunjuju preko dana. Na polici stoje prehrana, suhomesnato i delikatesi, kućna hemija, slatkiši i grickalice, pića, pa pekarski i gotovi proizvodi.
Drugi deo posla ima sasvim drugu publiku. Kore se prodaju pekari koja svako jutro peče pite i restoranu koji ih drži na jelovniku, a taj razgovor je o količini, o dinamici isporuke i o tome da kora bude ista i u ponedeljak i u subotu. Ista firma, isti broj telefona, ali kupac koji ni po čemu ne liči na komšiju iz Nikolinaca.
Iza oba posla stoji jedan čovek koji se javlja na telefon i za radnju i za kore. To je bio i polazni podatak za ceo projekat: sve što sajt uradi, mora da uradi bez centrale, bez tiketa i bez toga da neko sedi za panelom.
Dva posla, jedno ime, jedan sajt
Prvi razgovor je otvorio pitanje koje je odredilo sve ostalo: dva sajta ili jedan. Dva sajta znače dva domena, dva hostinga, dva SEO posla i dva mesta koja neko mora da održava, za firmu koju vodi jedan čovek. Jedan sajt nosi drugi rizik: da pekara iz Beograda sleti na stranu o deterdžentima, a komšinica iz sela na stranu o veleprodaji.
Rešenje je jedan brend sa dve odvojene grane. Naslovna nosi obe i razdvaja ih odmah, u dva dugmeta ispod naslova. Posle toga se putanje ne mešaju: sve o radnji stoji pod /market/, sve o korama pod /kore/, a zajedničko ostaje samo ono što je stvarno zajedničko — kontakt, o nama, lokacije i česta pitanja.
Druga odluka je bila da sajt ne bude prodavnica. Nema korpe, nema cena, nema naplate. Cene u radnji stoje na polici i menjaju se češće nego što bi se sajt ažurirao, a cena kora zavisi od količine i dinamike, pa se dogovara u razgovoru. Sajt ima jedan zadatak: da čoveka dovede do vrata radnje ili do poziva o korama, sa svim podacima koji mu za to trebaju.
Ta odluka je oslobodila ceo projekat od jedne velike obaveze. Sajt bez cena ne zastareva kad se cene promene, a to za seosku radnju znači sajt koji je tačan i za godinu dana.
Struktura: 37 strana koje se nisu pravile odjednom
Prva verzija je imala sedam strana — naslovna, market, kore, o nama, kontakt i dva pravna teksta. Kada je vlasnik video kako to radi, tražio je više strana i više sadržaja. Zahtev je bio dobar, jer se pri pisanju pokazalo da svaka grupa robe i svaki tip kupca kora ima svoje pitanje koje se ne postavlja isto.
Danas sitemap nabraja 37 adresa u pet grana:
- Market — pregledna strana, radno vreme i šest strana po grupama robe: prehrana, delikatesi, kućna hemija, slatkiši i grickalice, pića, pekara i gotova jela.
- Kore — pregledna strana i devet podstrana: za pitu, za gibanicu, za pekare, za ugostitelje, za markete, za domaćinstva, veleprodaja, kako nastaju, čuvanje i upotreba.
- Recepti — pregledna strana i šest recepata: gibanica, sirnica, zeljanica, krompiruša, baklava i štrudla sa jabukama.
- Lokacije — pregledna strana sa tabelom razdaljina, pa Nikolinci i Ledine, pa tri okolna mesta.
- Zajedničko — o nama, kontakt, česta pitanja, politika privatnosti i uslovi korišćenja.
Nijedna od tih strana nije nastala iz šablona sa zamenjenim imenom. Svaka nosi svoj tekst, svoj naslov, svoj opis i svoja česta pitanja. Strana koja postoji samo da bi je pretraživač izbrojao ne donosi ni posetioca ni rang, a nosi rizik za ceo domen.
Dubina je ostala plitka: do svake strane se sa naslovne stiže u najviše dva klika, jer podnožje nabraja sve. Sitemap se ispisuje iz istih podataka iz kojih se strane iscrtavaju, pa nova strana ne može da postoji a da izostane iz sitemap-a.
Market: od police do radnog vremena
Strana Market u Nikolincima radi ono što bi radio dobar prodavac: kaže šta ima, kako radi i gde je. Ponuda je podeljena u šest grupa, svaka ima svoju stranu, a na njoj primere onoga što se stvarno drži.
Ono čega na tim stranama namerno nema jesu cene, gramaže i imena brendova. Umesto toga stoji rečenica koja je i tačna i korisna: cene su u radnji, na polici, a ako nečega nema, recite pa se poruči za sledeću turu. To je istovremeno i opis usluge i poziv na razgovor, i ne zastareva.
Radno vreme je dobilo svoju stranu. To nije preterivanje: radno vreme je jedina informacija zbog koje neko u pola jedanaest uveče vadi telefon iz džepa, i jedina koja mora da bude vidljiva pre nego što taj čovek sedne u auto. Na strani stoji raspored za svih sedam dana, rečenica o praznicima i napomena da pogon za kore radi po dogovoru, radnim danima.
Isto radno vreme je zapisano i u strukturiranim podacima, kroz openingHoursSpecification za svih sedam dana. To je ono što pretraživaču dozvoljava da pored rezultata ispiše „otvoreno" ili „zatvoreno" u tom trenutku, bez ulaska na sajt.
Kore: od proizvoda ka poslu
Grana o korama je bila teži deo. Proizvod je jednostavan, posao nije. Kore za pitu i gibanicu imaju devet podstrana, a one se dele na dve vrste. Jedne opisuju proizvod: kora za pitu, kora za gibanicu, kako nastaju, čuvanje i upotreba. Druge opisuju kupca: pekare i poslastičarnice, restorani i ketering, marketi, domaćinstva.
Podela ima razlog. Pekara i domaćinstvo od iste kore traže različite stvari. Pekari je važno da ujutru ne fali i da količina bude dogovorena unapred; domaćinstvu je važno koliko kora ide u tepsiju i kako da se ne osuše dok se pita savija. Jedna strana koja pokušava oba posla ne uverava nijednog.
Deseta strana je nastala kasnije, iz rupe koju je otkrilo poređenje sadržaja sa onim što se stvarno kuca u pretragu: reč veleprodaja nije postojala nigde na sajtu, a to je krovni pojam pod kojim se ovaj posao traži. Postojeće strane su govorile kome se prodaje. Nova strana veleprodaja kora govori kako ide dogovor: šta reći u prvom pozivu, kako izgleda probna tura, kako se dogovaraju dinamika i preuzimanje, i zašto cene nisu na sajtu. Tekst odgovara na drugo pitanje od ostalih strana o korama, pa se nigde ne ponavlja.
Kore su, sa druge strane, i najveći deo posla u kome se lako pretera. Sve što se na sajtu tvrdi o njima moglo je da se proveri kod vlasnika: postupak, namena, način pakovanja, šta se od njih pravi. Ono što se nije moglo proveriti — gramaže, rokovi i cene — nije napisano, i strana zbog toga nije slabija.
Recepti kao ulaz za ljude koji još ne traže kore
Šest recepata na sajtu ima svoj razlog. Čovek koji traži „gibanicu sa gotovim korama" ne traži dobavljača — on kuva pitu u nedelju ujutru. Ali on je i jedini razlog zbog kog bi za pogon u Ledinama ikada čuo neko van struke, a među tim ljudima su i oni koji vode kafanu ili prave pite za slavu.
Zato recepti sa gotovim korama nose gibanicu, sirnicu, zeljanicu, krompirušu, baklavu i štrudlu sa jabukama. Svaki ima sastojke za jednu tepsiju, korake redom, savete i svoja pitanja, i svaki radi i bez kora iz Ledina. Recept koji je u stvari reklama prepozna se iz prve i ne deli se dalje.
Tehnički, svaki recept nosi Recipe podatke sa koracima kao HowToStep, vremenom pripreme, vremenom pečenja i brojem porcija. To je jedan od retkih tipova rezultata gde pretraživač i danas prikazuje sliku i vreme pripreme direktno u listi.
Sitnica koja se lako previdi: autor recepta mora da bude čista referenca na firmu preko @id, bez ponovljenog @type i imena. Ako se tip ponovi, spajanjem po @id se firmi u grafu dopiše treći tip koji tamo ne pripada, i entitet postane nešto što nije.
Lokacije: razdaljine koje su izmerene, ne procenjene
Nikolinci imaju oko 990 stanovnika po popisu iz 2022. Sajt koji računa samo na to selo ima publiku koja se teško meri, pa lokacijska grana pokriva i okolna mesta iz kojih se u radnju dolazi. Ali ne sva, i to je bila najteža odluka na projektu.
Traženo je osam strana okolnih mesta. Napravljene su tri: Banatski Karlovac, Uljma i Alibunar. Razlog je jednostavan. Za mesto udaljeno preko sedamnaest kilometara ne postoji nijedna iskrena rečenica kojom bi se ta strana napunila — radnja je u Nikolincima, ne dostavlja, i nema ništa posebno da ponudi baš tom mestu. Osam skoro istih strana tipa „market za kupce iz X" je obrazac koji pretraživači prepoznaju kao doorway, a posledica ne pada na te strane nego na ceo domen. Ostala mesta su dobila red u tabeli razdaljina na preglednoj strani, gde im je i mesto.
Svaka strana mesta nosi pitanje „Da li dostavljate u X?" i odgovor „Ne". Bolje da posetilac to sazna na sajtu nego posle vožnje. Nijedna od tih strana nema Place u strukturiranim podacima, jer bi Place tvrdio da tamo postoji objekat, a ne postoji.
Razdaljine u tekstu su izmerene, a ne procenjene: adrese kroz Nominatim, ruta kroz OSRM, pa u tekst ide kilometraža puta i vreme vožnje. Razlika se oseti. Do Beograda je vazdušnom linijom oko 55 km, a putem 63,8 km; sajt koji piše prvu cifru ispada netačan svakome ko je tu vožnju vozio. Isto važi za bliža mesta: Banatski Karlovac 4,2 km, Uljma 7,5 km, Alibunar 9,8 km, Vršac 21,7 km.
Uz to je proverena i administrativna sitnica koju je lako pogrešiti: Uljma ne pripada opštini Alibunar nego gradu Vršcu. Na sajtu je to jedna rečenica, ali je razlika između sajta koji poznaje kraj i sajta koji ga prepisuje sa tuđe strane.
Tehnička izvedba
Sajt je pisan u PHP-u 8.3, sa sopstvenim ruterom u index.php. Nema WordPress-a, nema dodataka i nema baze podataka. Sav sadržaj — grupe robe, podstrane o korama, recepti, lokacije, česta pitanja i pravni tekstovi — stoji u običnim PHP fajlovima u data/, a pogledi ih iscrtavaju.
Zašto bez baze: sajt sa 37 strana i sadržajem koji se menja nekoliko puta godišnje nema šta da dobije od MySQL-a osim još jednog servisa koji može da padne i još jedne rezervne kopije koju treba praviti. Ovako je ceo sadržaj tekst koji se otvori i pročita, a selidba na drugi server je kopiranje foldera. Ako se obim jednog dana promeni, baza se dodaje ispod istog sloja za podatke.
Adrese su čiste i sa kosom crtom na kraju: /market/ponuda/pekara/, /kore/za-pekare/, /recepti/gibanica/. Ruter ih razlaže na sekciju i podstranu i bira odgovarajući pogled. Verzije bez kose crte se preusmeravaju, a preusmerenja sa http, sa www i sa starog probnog poddomena čuvaju putanju, pa nijedan podeljen link ne završi na naslovnoj.
Sajt ima dnevnu i noćnu temu, izvedene preko CSS tokena, sa prelazom koji ne treperi pri promeni. Naslovi idu u fontu Fraunces, tekst u Manrope, oba sa sopstvenog servera, bez poziva ka Google Fonts-u. Jedan detalj koji se na srpskom sajtu često promaši: slova č, ć, š, ž i đ nisu u osnovnom latiničnom rezu fonta nego u proširenom, pa preload mora da pokrije oba fajla — inače se ceo tekst jednom prekroji čim stigne pravi font.
Kontakt forma je jedna za obe grane, sa izborom teme upita: pitanje za radnju, upit za kore ili nešto drugo. Umesto CAPTCHA-e stoji bodovanje neželjene pošte sa skrivenim mamcem, jer CAPTCHA na sajtu seoske radnje odbije više pravih ljudi nego robota. Svaki upit ide u dnevnik, i onaj koji prođe i onaj koji filter odbije, da nijedna poruka ne nestane bez traga.
Brzina, animacije i to da se sajt vidi bez obzira na sve
Mereno na PageSpeed Insights: performanse 98 na mobilnom i 100 na desktopu, CLS 0, TBT 0, SEO 100. Iza toga stoji zbir sitnica: slike u WebP formatu sa srcset i tačnim sizes, širina i visina na svakoj slici da se raspored ne pomera dok se učitava, preload hero slike koji nosi i imagesrcset (bez toga preload povuče pogrešnu veličinu i posao je uzaludan), i statika sa dugim kešom i verzijom u imenu.
Posle prve verzije vlasnik je tražio više pokreta na sajtu. To je zahtev koji lako obori merenje, pa je izveden pažljivo. Zavesa sa brojem 97 ide samo pri prvoj poseti i pamti se u sesiji. Sekcije se otkrivaju pri skrolu, slike imaju paralaks vezan za skrol, prelaz između strana kliza. Sve animacije rade nad slojevima koji ne dodiruju raspored, pa posle njih merenje nije palo.
Jedna stvar se u ovakvim sajtovima previdi redovno: ako se sadržaj krije dok ga JavaScript ne otkrije, a JavaScript iz bilo kog razloga ne stigne, posetilac dobija belu stranu. Zato u zaglavlju stoji kratak stražar koji posle dve i po sekunde skida to skrivanje ako se skripta nije javila. Sajt se u tom slučaju vidi bez animacija, što je jedini prihvatljiv ishod.
Statika se servira sa kešom od trideset dana, pa svaka izmena stila ili skripte nosi novu verziju u adresi. Bez toga se izmena vidi tek onome ko prvi put dolazi, a vlasnik gleda stari sajt i pita zašto ništa nije promenjeno.
Strukturirani podaci, meta i vidljivost
JSON-LD je pisan kao jedan @graph, ne kao gomila nezavisnih blokova. Firma je GroceryStore sa punim pravnim imenom, matičnim podacima, adresom, radnim vremenom za svih sedam dana i spiskom mesta iz kojih kupci dolaze. Pogon u Ledinama je department sa svojom adresom i koordinatama, vezan na firmu preko @id. Kore su jedan entitet sa istim @id na svim stranama gde se pominju, pa se u grafu ne pojave kao tri različita proizvoda istog imena.
Jedna stavka je namerno ostavljena nedovršena. Product nema offers, jer cene zavise od količine i nisu javne. Alat za proveru zbog toga trajno prijavljuje upozorenje, i to je prihvaćeno svesno: Offer bez cene daje isto upozorenje, a izmišljena cena bi bila gora od upozorenja. Kada klijent odluči da objavi cene, upozorenje nestaje samo od sebe.
Naslovi i opisi su mereni u pikselima, ne u znakovima. Opis od 158 znakova se u rezultatu preseče ako su reči široke, a duži opis sa uskim slovima stane ceo. Posle merenja se na sajtu ne seče nijedan naslov ni opis.
Ostalo je zanatski deo: kanonici koji pokazuju sami na sebe, pravi 404 bez kanonika ka naslovnoj, lastmod u sitemap-u po izvornom fajlu strane umesto zajedničkog datuma za sve, i robots.txt koji imenuje i AI robote sa ponovljenim pravilima — imenovana grupa u potpunosti gazi opštu, pa se pravilo mora ponoviti da bi važilo.
Domen je verifikovan u Google Search Console-u kao domensko svojstvo i sitemap je poslat. Bing i ostali pretraživači su obavešteni preko IndexNow, sa ključem objavljenim na domenu; sve adrese su prijavljene istog dana kada je sajt pušten, pa indeksiranje nije čekalo da robot slučajno naiđe.
Šta klijent na kraju ima
Sajt na sopstvenom domenu koji radi dva posla bez mešanja. Komšija iz Nikolinaca nađe radno vreme, adresu i šta stoji na polici. Pekara iz Beograda nađe stranu o veleprodaji, opis postupka i broj na koji zove. Upit sa forme stiže na mejl, bez panela u koji treba da se prijavljuje i bez mesečne pretplate ikome.
Nema WordPress-a koji traži ažuriranje svake druge nedelje i nema dodataka koji se raspadnu pri sledećoj verziji. Sadržaj stoji u fajlovima, sajt je prenosiv, a svaka izmena ide preko skripte koja prvo napravi rezervnu kopiju, pa proveri sintaksu, pa tek onda isporuči.
Ostaje ono što sajt ne može umesto vlasnika: fotografije iz radnje i iz pogona, Google profil firme za obe lokacije, i cene kora ako jednog dana postanu javne. Sve troje je zapisano i čeka njega.
Ono što je već izvesno: pre ovog sajta se firma nalazila samo preko agregatora, na tuđim stranama sa tuđim rasporedom i tuđim podacima. Sada postoji jedno mesto na kome piše šta je tačno, i to mesto je njegovo.
Sajt u slikama
Denis Market 97
Market na Glavnoj 49 u Nikolincima i kore za pitu i gibanicu iz pogona u Ledinama.
denismarket.rsČesto postavljana pitanja
Zašto jedan sajt za dva posla, a ne dva odvojena sajta?
Zašto sajt nema cene ni korpu?
Može li se dodati nova strana ili nova grupa robe?
Zašto bez WordPress-a i bez baze podataka?
Zašto nisu napravljene strane za sva okolna mesta?
Koliko traje izrada ovakvog sajta?
Treba vam ovakav sajt?
Recite mi čime se bavite i šta sajt treba da uradi za vas — dobijate fiksnu ponudu i rok, u pisanoj formi.