Zašto sinkronizacija udvostručuje slike artikala i kako to ispravno zaustaviti
Medijska knjižnica u WooCommerceu puni se sama, nazivi datoteka nižu se s -1, -2, -3 i disk se puni. Zašto REST sučelje pri svakoj sinkronizaciji učita novi prilog i što provjera mora znati da se slika poveže, a ne udvostruči.
Simptom: medijska knjižnica puni se sama
Trgovina ima tri tisuće artikala i pet tisuća slika. U medijskoj knjižnici ih je trideset tisuća. Nazivi se ponavljaju: proizvod.jpg, proizvod-1.jpg, proizvod-2.jpg, proizvod-3.jpg. Autor svih je korisnik koji je nekad unio podatke za povezivanje s poslovnim sustavom.
Datum učitavanja je svaki dan, pri češćoj sinkronizaciji svaki sat. Slike izgledaju jednako jer su jednake. Galerija artikla prikazuje jednu sliku, server čuva dvadeset četiri kopije dnevno.
To nije greška WordPressa ni greška servera. Posljedica je toga kako REST sučelje razumije polje images, a tu posljedicu ne uklanja nijedan dodatak za čišćenje. Čišćenje uklanja nakupljeno; uzrok ostaje i sutra učita novu seriju.
Zašto se slike učitavaju, a ne samo povezuju
Kad poslovni sustav preko REST sučelja pošalje artikl s poljem images u kojem je unos s ključem src i bez ključa id, WooCommerce taj unos ne razumije kao vezu na postojeću sliku. Razumije ga kao naredbu: preuzmi datoteku s te adrese i dodaj je u medijsku knjižnicu.
Posljedica je novi prilog. Novi identifikator, novi zapis u bazi, nova datoteka na disku, nove izvedene veličine. Pri svakoj sinkronizaciji ponovno, jer unos s src i bez id znači uvijek isto.
S gledišta WooCommercea to je ispravno ponašanje. Sučelje nema načina pogoditi koji ste postojeći prilog mislili, pa radi ono što ste napisali. Pogrešna je pretpostavka pošiljatelja da će primatelj sliku prepoznati.
Cijena za server razmjerna je učestalosti sinkronizacije, a ne veličini kataloga. Trgovina s petsto artikala i satnom sinkronizacijom stvara više datoteka od trgovine s pet tisuća artikala i dnevnom.
Zašto se nazivi nižu s -1, -2, -3
WordPress ne dopušta dvije datoteke s istim nazivom u istoj mapi. Kad učitana datoteka naiđe na postojeći naziv, funkcija za jedinstven naziv dodaje brojač: proizvod-1.jpg, zatim proizvod-2.jpg.
Upravo taj brojač skriva problem. U galeriji artikla je jedna slika jer galerija prikazuje posljednju. U medijskoj knjižnici ih je onoliko koliko je bilo sinkronizacija. Niz s crticom i rastućim brojem nad istom osnovom naziva zato je najpouzdaniji znak da nešto učitava slike programski i bez provjere.
Brojač znači i to da usporedba po točnom nazivu datoteke nije dovoljna. Provjera mora prepoznati da je proizvod-7.jpg ista slika kao proizvod.jpg, inače će pri osmoj sinkronizaciji učitati još jednu.
Pazite i na izvedene veličine. Uz izvornik WordPress zapisuje datoteke s dimenzijama u nazivu, primjerice -300x300. One nisu duplikati i ne smiju se tretirati kao kopije.
Što se dogodi kad slike izostavite iz zahtjeva
Druga zamka je obrnuta i skuplja. Polje images koje pošaljete galeriju ZAMJENJUJE. Ne dopunjuje je.
Ako artikl u trgovini ima pet slika a pošaljete jednu, imat će jednu. Ako pošaljete prazno polje, neće imati ni jednu. Zato odgovor na udvostručavanje nije da slike jednostavno prestanete slati; to iz galerija odnosi i ono što je urednik dodao ručno.
Ispravan odgovor je poslati cijelu galeriju, u kojoj su postojeće slike navedene s id i bez src, a nove s src. Unos s id i bez src postojeći prilog samo povezuje i ne učitava ništa.
Posljedica tog pravila je da pošiljatelj mora znati stanje galerije u trgovini prije nego je pošalje. Sinkronizacija koja samo piše i nikad ne čita to ne može ispravno.
Shopify se ponaša jednako, drugim riječima
Shopify koristi drugo imenovanje i istu logiku. Ažuriranje proizvoda koje sadrži polje slika zamjenjuje skup. Unos s src i bez id stvara novu sliku.
Razlika je u tome što Shopify izvornik čuva na vlastitoj mreži za dostavu sadržaja, a ne u mapi koju vidite preko protokola za prijenos datoteka. Zato se problem ne pokazuje kao puna particija diska, nego kao rastući broj slika na proizvodu i sporije učitavanje stranice proizvoda.
Budući da je logika ista, provjera mora biti ista. Trgovini koja ima oba kanala ne isplati se pisati dva rješenja. Smisleno je jedna provjera koja vraća isti odgovor za obje platforme i dva tanka prevoditelja u oblik koji pojedino sučelje očekuje.
Kako razlikovati sinkronizaciju od ručnog uređivanja
Prije nego okrivite sinkronizaciju, provjerite. Tri pokazatelja su dovoljna i sva tri vidite u medijskoj knjižnici.
Autor. Prilozi koje je stvorila sinkronizacija imaju za autora korisnika čijim je podacima veza postavljena. Pri ručnom učitavanju autor je onaj koji je datoteku učitao.
Ritam. Vremena učitavanja u jednakim razmacima, primjerice svaki sat u istoj minuti, su stroj. Čovjek ne učitava u 3.00, 4.00 i 5.00.
Naziv. Niz s crticom i rastućim brojem nad istom osnovom naziva je programsko učitavanje. Urednik koji sliku zamijeni datoteku obično nazove drugačije.
Ako se sva tri pokazatelja poklapaju, uzrok nije kod urednika i čišćenje medijske knjižnice nije rješenje.
Kako je provjera napravljena ispravno
Provjera mora odgovoriti na jedno pitanje: postoji li u medijskoj knjižnici već prilog za tu sliku. Pouzdan odgovor moguć je bez usporedbe sadržaja datoteka.
Osnova je naziv datoteke iz adrese slike, normaliziran onako kako ga normalizira WordPress pri učitavanju: bez nastavka, bez dijakritike, mala slova, interpunkcija zamijenjena crticom. Normalizirani ključ je ono što se usporeduje.
Zatim se uklanja trag udvostručavanja: brojač na kraju naziva. proizvod-7 i proizvod su isti ključ, proizvod-7-sivi i proizvod nisu.
Kad provjera nađe postojeći prilog, unos u galeriji nosi njegov id i nema src. Kad ne nađe ni jedan, unos nosi src i novi prilog nastaje jednom, a ne svaki sat.
Cijela galerija sastavlja se prije slanja jer polje images skup zamjenjuje. Ručno dodane slike time se čuvaju, postojeće se samo povezuju, a nova datoteka nastaje samo kad je slika stvarno nova.
Tri zamke pri usporedbi naziva datoteka
Prva je normalizacija. WordPress pri učitavanju naziv čisti: uklanja dijakritiku i posebne znakove. Slika s čšž u nazivu u medijskoj knjižnici nije pod tim nazivom. Usporedba s neobradenim nazivom iz adrese zato ne nalazi ništa i učitava novu datoteku.
Druga su izvedene veličine. Uz izvornik postoje datoteke s dimenzijama u nazivu. One nisu kandidati za podudaranje i provjera ih ne smije ponuditi kao postojeću sliku artikla.
Treća je zamjena nastavka. Dodaci za sažimanje slika pri učitavanju stvaraju varijantu u novijem formatu. Osnova naziva ostaje, nastavak se mijenja, zato se usporeduje osnova bez nastavka, a ne cijeli naziv.
I jedna zamka koja nije vezana na nazive: raščlanjivanje adresa s viševajtnim znakovima. Standardne funkcije za raščlanjivanje adrese i putanje nisu sigurne za viševajtne znakove, zato ključ gradite izrazima koji rade na bajtovima koji su sigurno unutar skupa ASCII.
Što učiniti s duplikatima koji su već nastali
Ispravak uzroka zaustavlja nastajanje novih, postojeće ne uklanja. Uklanjanje je brisanje podataka, pa nije posao skripte koja se pokrene usput.
Postupak koji ne završava praznim galerijama: prvo napravite sigurnosnu kopiju mape s učitavanjima i baze. Zatim sastavite popis priloga koji odgovaraju uzorku udvostručavanja i na koje se ne poziva ni jedan artikl, ni jedan zapis o sadržaju i ni jedna galerija. Popis pregledajte prije nego što bilo što izbrišete.
Brisanje treba ići preko WordPressove funkcije za brisanje priloga, a ne brisanjem datoteka u mapi. Brisanje datoteke ostavlja zapis u bazi i galerija prikazuje prazan okvir.
Radite u serijama i između serija provjerite nekoliko artikala u trgovini. Deset tisuća brisanja u jednoj transakciji je loša ideja i kad je popis točan.
Kako često sinkronizacija treba teći
Učestalost je odluka o tome što se stvarno mora osvježiti. Zaliha i cijena mijenjaju se više puta dnevno i moraju se sinkronizirati često. Slika artikla mijenja se kad je netko zamijeni.
Zato razdvojite tokove. Česta sinkronizacija nosi zalihu i cijenu. Slike idu samo kad se galerija stvarno promijenila, što sustav zna iz vremena posljednje promjene artikla.
To nije optimizacija radi brzine. To je smanjenje površine za pogreške: tok koji slike ne šalje ne može ih ni udvostručiti.
Kad slike ipak šaljete, provjera treba teći uvijek i bez mogućnosti isključivanja. Postavka koja provjeru isključuje put je do iste pune medijske knjižnice za pola godine.
Usporedba
| Unos u images[] | Što radi WooCommerce | Posljedica |
|---|---|---|
| src bez id | preuzima datoteku s adrese i stvara novi prilog | nova slika pri svakoj sinkronizaciji |
| id bez src | povezuje postojeći prilog | ništa se ne učitava |
| id s name ili alt | ažurira opis postojećeg priloga | bez nove datoteke |
| jedan unos umjesto cijele galerije | zamjenjuje galeriju tim jednim unosom | gubitak ručno dodanih slika |
| prazno polje [] | briše slike artikla | artikl ostaje bez slike |
Pogledajte kako Entexia prije svake sinkronizacije provjeri postoji li slika u trgovini i poveže je umjesto da je udvostruči.
Počni besplatno →