Dokumentacija

M Cart Recovery

M Cart Recovery for WooCommerce – įskiepis, kuris dar prieš pirmą prekės įdėjimą į krepšelį paprašo pirkėjo el. pašto adreso, išsaugo krepšelio kopiją jūsų pačių duomenų bazėje ir siunčia priminimus su nuoroda, grąžinančia tiksliai tą patį krepšelį. Vadovas skirtas 1.0.0 versijai ir rašytas administratoriui, ką tik jį įdiegusiam: kas pradeda veikti aktyvavus, kokie yra visi nustatymai ir jų numatytosios reikšmės ir kurios operacijos gali sustabdyti pardavimus, toliau rinkti pirkėjų duomenis, nors manote, kad rinkimą išjungėte, ištrinti įrašus arba tyliai nutraukti laiškų siuntimą.

Parašyta 1.1.2 versijai. WordPress 7.0+ PHP 7.4+

Ką daro ir kam skirtas

Įskiepis blokuoja pirmą įdėjimą į krepšelį tiems lankytojams, kurių el. pašto adreso dar nėra, kol adresas pateikiamas, išsaugo krepšelį, po nustatyto neveiklumo laiko pažymi jį paliktu ir išsiunčia iki trijų priminimų su nuoroda, kuri atkuria krepšelį su tais pačiais variantais bei kiekiais ir nuveda pirkėją į atsiskaitymo puslapį. Pirkėjai, kurių adresas jau žinomas, o tai apima kiekvieną prisijungusį naudotoją, įrašomi nė karto nepamatę lango. Ataskaitose matote sekamus, paliktus ir susigrąžintus krepšelius bei susigrąžintas pajamas. Jis skirtas parduotuvėms, kurios nori susigrąžinti paliktus krepšelius neperduodamos duomenų išorės paslaugai: viskas saugoma dviejose jūsų pačių duomenų bazės lentelėse ir siunčiama jūsų svetainės paštu. WooCommerce turi būti įdiegtas ir įjungtas: įskiepio antraštėje nurodyta Requires Plugins: woocommerce, o be WooCommerce kodas sustoja ir parodo pranešimą administratoriui.

Reikalavimai, diegimas, aktyvavimas

readme.txt nurodo WordPress 7.0 arba naujesnę, WooCommerce 10.0 arba naujesnę ir PHP 7.4 arba naujesnę versiją. Rekomendacijos naudoti HTTPS jame nėra: ta eilutė yra tik kūrėjams skirtame README.md faile. Kode tikrinama tik PHP versija: aktyvuojant su senesne nei 7.4 įskiepis vėl išjungiamas ir parodomas pranešimas „M Cart Recovery requires PHP 7.4 or newer“. WordPress ar WooCommerce versijos veikimo metu netikrinamos.

  1. Pirmiausia įdiekite ir įjunkite WooCommerce.
  2. Įkelkite katalogą m-cart-recovery į wp-content/plugins/ arba įdiekite ZIP failą per Plugins > Add New.
  3. Skiltyje Plugins aktyvuokite M Cart Recovery for WooCommerce.
  4. WordPress vieną kartą automatiškai nukreipia į WooCommerce > Cart Recovery > Settings. Nukreipimas įvyksta kitą kartą atidarius administravimo puslapį, naudoja 30 sekundžių galiojantį transient ir reikalauja manage_woocommerce teisės, tad jei atsidūrėte kitur, atsidarykite puslapį iš WooCommerce meniu.
  5. Prieš imdamiesi ko nors kito perskaitykite kitą skyrių: el. pašto rinkimas jūsų parduotuvėje jau veikia.

Kas nutinka iškart aktyvavus

Aktyvavus sukuriamos dvi lentelės su jūsų duomenų bazės prefiksu, wp_mcr_carts ir wp_mcr_email_log, įrašoma mcr_db_version, pridedamos parinktys mcr_settings ir mcr_templates, jei jų dar nėra, ir nustatomas 30 sekundžių nukreipimo transient. Jokių užduočių aktyvavimas neplanuoja. Dvi pasikartojančios užduotys sukuriamos MCR_Scheduler::ensure_scheduled() metode per init su 20 prioritetu, tai yra kitos užklausos metu po aktyvavimo, nesvarbu, ar ta užklausa bus administravimo puslapis, ar parduotuvės apsilankymas. Numatytoji nustatymo enabled reikšmė yra 1, todėl el. pašto langas parduotuvėje veikia nuo pirmo puslapio užkrovimo, angliškai, su kode įrašytu tekstu. Įskiepyje yra tik languages/m-cart-recovery.pot ir nėra sukompiliuoto lietuviško ar lenkiško vertimo, tad ir langas, ir administravimo ekranai bus angliški, kol nustatymuose neperrašysite parduotuvės tekstų.

  • Enable cart capture and recovery emails: įjungta. Lango HTML kodas įterpiamas kiekviename parduotuvės puslapyje, o skriptas perima paspaudimus „į krepšelį“.
  • Trys priminimo laiškai: visi įjungti, siuntimo delsos 0, 1440 ir 4320 minučių nuo krepšelio pažymėjimo paliktu.
  • Mark abandoned after: 60 minučių.
  • Retain recovery records: 90 dienų.
  • Sender name: svetainės pavadinimas. Sender email: WordPress administratoriaus el. paštas.
  • mcr_process_abandoned_carts: kas penkias minutes, pirmas kartas maždaug po minutės nuo užduoties sukūrimo.
  • mcr_cleanup_old_data: kartą per parą, pirmas kartas maždaug po valandos nuo užduoties sukūrimo.
  • Show optional marketing consent: įjungta, bet MailWizz sinchronizacija išjungta (mailwizz_enabled yra 0), tad niekur niekas nesiunčiama.
  • Permanently delete plugin tables and settings on uninstall: išjungta.
Atsargiai

Nuo aktyvavimo akimirkos nė vienas svečias negali nieko įdėti į krepšelį neįvedęs el. pašto adreso. Nėra nei pereinamojo laikotarpio, nei peržiūros režimo. Aktyvuokite bandomojoje aplinkoje arba ramiu metu ir būkite pasiruošę iš karto atžymėti Enable cart capture and recovery emails kortelėje Settings, į kurią būsite nukreipti.

Kur wp-admin rasite įskiepio ekranus

Viskas telpa viename puslapyje, WooCommerce > Cart Recovery (puslapio slug m-cart-recovery), suskaidytame į penkias korteles. Reikalinga teisė manage_woocommerce, kurią pagal numatytuosius nustatymus turi Administrator ir Shop manager vaidmenys. Plugins sąraše taip pat atsiranda nuoroda Settings, atverianti Settings kortelę. Antraštėje rodomas ženklelis Recovery active arba Recovery paused, priklausomai nuo nustatymo enabled, ir jis nusako tik tą nustatymą, o ne tai, ar krepšeliai įrašinėjami.

  • Reports: 30 dienų rodikliai, 14 dienų stulpelinė diagrama ir trumpas paaiškinimas, kaip veikia susigrąžinimas. Ši kortelė atveriama pirmoji.
  • Abandoned carts: visi išsaugoti krepšelių įrašai, filtruojami pagal būseną ir ieškomi pagal el. paštą ar vardą, po 20 eilučių puslapyje, kiekvienoje eilutėje nuoroda Delete.
  • Email templates: priminimų seka, kiekvienam laiškui po redaktorių.
  • Settings: susigrąžinimo variklis, parduotuvės lango tekstai ir duomenų trynimo jungiklis šalinant įskiepį.
  • Integrations: MailWizz prisijungimo duomenys, mygtukas Test connection ir kabliukas kitoms platformoms.

Settings: Recovery engine

Pirmasis Settings kortelės blokas valdo laiką, saugojimo trukmę ir siuntėjo tapatybę. Už leistinų ribų įvestos reikšmės išsaugant apkarpomos, o ne atmetamos, todėl išsaugoję patikrinkite, kas laukelyje liko. Neteisingas siuntėjo el. paštas tyliai pakeičiamas WordPress administratoriaus adresu.

  • Enable cart capture and recovery emails. Numatyta: įjungta. Išjungus lango HTML kodas neįterpiamas, parduotuvės CSS ir JavaScript nekraunami, krepšeliai nepažymimi paliktais ir priminimai nesiunčiami. Krepšeliai vis tiek įrašinėjami, o kasdienis valymas veikia toliau. Žiūrėkite skyrių apie tai, ko šis laukelis nesustabdo.
  • Mark abandoned after (minutes). Numatyta: 60. Leidžiama: nuo 5 iki 43200 (30 parų). Laikas skaičiuojamas pagal krepšelio įrašo stulpelį updated_at, kuris perrašomas kiekvienos užklausos metu, kai suveikia vienas iš keturių krepšelio kabliukų. Vienas jų yra woocommerce_cart_updated, kurį WooCommerce iškviečia įrašydamas krepšelį į sesiją, tad daugumoje parduotuvių įprastas naršymas palikimo momentą stumia į priekį. Nelaikykite šio skaičiaus laiku nuo paskutinio krepšelio pakeitimo.
  • Retain recovery records (days). Numatyta: 90. Leidžiama: nuo 7 iki 3650. Valymo užduotis bet kuriuo atveju taiko savo 7 parų apatinę ribą.
  • Sender name. Numatyta: svetainės pavadinimas.
  • Sender email. Numatyta: WordPress administratoriaus adresas. Įrašomas tiesiai į kiekvieno priminimo From antraštę.

Settings: Email capture dialog

Kol rinkimas įjungtas, lango HTML kodas įterpiamas kiekvieno parduotuvės puslapio apačioje, taip pat prisijungusiems lankytojams ir visiems, kurių adresas jau žinomas. Ar langas apskritai atsivers, lemia viena žymė, mcrCapture.captured, kurią wp_localize_script įrašo į puslapį jo atvaizdavimo metu. Ji yra teigiama, kai adresą jau pateikia WooCommerce sesija, kliento įrašas arba prisijungusi paskyra, ir tada skriptas nieko neperima. Skriptas stebi WooCommerce įdėjimo į krepšelį valdiklius: klasikinius ir AJAX mygtukus, prekės puslapio formas, blokų mygtukus ir paprastas add-to-cart nuorodas. Uždarius langą atidėtas įdėjimas atšaukiamas: prekė į krepšelį nepatenka. Žemiau redaguojami septyni valdikliai: šeši teksto laukeliai ir vienas žymimasis laukelis. Užrašas Cart protection, laukelio pavadinimas Email address ir uždarymo mygtuko tekstas imami ne iš nustatymų, o iš vertimo failo, o įskiepyje yra tik languages/m-cart-recovery.pot, tad šie trys liks angliški, kad ir ką čia parašytumėte.

  • Title. Numatyta: Save your cart.
  • Message. Numatyta: Enter your email to add this item and keep your cart available if you leave.
  • Email placeholder. Numatyta: you@example.com.
  • Button. Numatyta: Continue shopping.
  • Show optional marketing consent. Numatyta: įjungta. Prideda nepažymėtą žymimąjį laukelį; sutikimu laikomas tik pažymėtas.
  • Marketing consent label. Numatyta: Send me occasional product news and offers.
  • Privacy note. Numatyta: We use your email to save this cart and send recovery reminders. Marketing emails are optional.
Atsargiai

Kadangi captured įrašoma į HTML atvaizdavimo metu, viso puslapio talpykla, išsaugojusi kopiją, sugeneruotą lankytojui, kurio adresas jau buvo žinomas, vėliau tą captured=true pateikia kiekvienam svečiui, gavusiam tą pačią kopiją, ir jiems langas tyliai nieko nedaro. Tai kainuoja ne pardavimus, o surinktus adresus, ir wp-admin apie tai nepraneša. Pašalinkite parduotuvės puslapius iš viso puslapio talpyklos arba priimkite, kad rinkimas veikia tik iš dalies, ir palyginkite rodiklį Tracked carts su tikruoju srautu.

Settings: Data removal

Vienas žymimasis laukelis, Permanently delete plugin tables and settings when the plugin is uninstalled, pagal numatytuosius nustatymus išjungtas. Kol įskiepis įdiegtas, jis nieko nekeičia. Jį vieną kartą nuskaito uninstall.php tuo metu, kai WordPress šalina įskiepį. Palikta išjungta nuostata ir apsaugo jus perdiegiant.

Email templates: priminimų seka

Trys laiškai iš karto įjungti. Kiekvienas turi vidinį pavadinimą, įjungimo jungiklį, delsą minutėmis (nuo 0 iki 43200), temą, antraštę ir HTML tekstą, redaguojamą supaprastintame WordPress redaktoriuje. Delsos yra absoliučios, skaičiuojamos nuo krepšelio pažymėjimo paliktu, o ne nuo ankstesnio laiško, todėl numatytosios reikšmės ir yra 0, 1440 bei 4320: iš karto, po 24 valandų, po 72 valandų. Išjungti šablonai praleidžiami, o kitas įjungtas išlaiko savo delsą. Tekstai išsaugant ir siunčiant praleidžiami per wp_kses_post, tad skriptai ir neleistinas žymėjimas pašalinami.

  • First reminder, delsa 0, tema: You left something in your cart at {site_name}.
  • Second reminder, delsa 1440 minučių, tema: Still thinking it over?
  • Final reminder, delsa 4320 minučių, tema: A final reminder about your saved cart.
  • Temoje, antraštėje ir tekste galimi kintamieji: {first_name}, {last_name}, {site_name}, {cart_items}, {cart_total}, {checkout_url}, {unsubscribe_url}.
  • Kai vardas nežinomas, {first_name} pakeičiamas žodžiu „there“. {cart_items} sugeneruoja HTML lentelę su prekėmis, kiekiais ir sumomis.
  • Kiekviename laiške automatiškai pridedama poraštė su nuoroda Stop cart reminders, net jei tekste {unsubscribe_url} nenaudojate.
Atsargiai

Kadangi delsos skaičiuojamos nuo palikimo momento, apdorojimo užduotis vienam krepšeliui per kartą pastumia lygiai vieną šabloną, o pati užduotis vykdoma kas penkias minutes, nustačius visoms trims tą pačią delsą tas pats pirkėjas gaus tris laiškus maždaug kas penkias minutes, visus per maždaug dešimt minučių. Prieš išsaugodami palikite prasmingus tarpus.

Integrations: MailWizz ir kitos platformos

MailWizz sinchronizacija pagal numatytuosius nustatymus išjungta. Ją įjungus ir nurodžius API URL, API raktą bei sąrašo UID, pirkėjas, pažymėjęs sutikimo laukelį, patenka į foninę eilę, iš kurios jo el. pašto adresas POST metodu siunčiamas adresu <api url>/lists/<list uid>/subscribers su antrašte X-Api-Key. Nepažymėjusių sutikimo pirkėjų duomenys nesiunčiami, o patys priminimai nuo MailWizz nepriklauso. Test connection atlieka tik skaitymo užklausą dėl vieno prenumeratoriaus ir parodo HTTP kodą; paskutinės tikros sinchronizacijos rezultatas saugomas parinktyje mcr_mailwizz_status ir rodomas po laukeliais. Bet kurią kitą platformą galima prijungti per surinkimo kabliuką, kuris suveikia po kiekvieno sėkmingo surinkimo, o antrasis jo argumentas yra sutikimo reikšmė.

  • Iš parduotuvės pusės svetainę palieka tik el. pašto adresas. MCR_Capture::ajax_capture_email() kviečia queue_sync( $email, '', '' ), o MCR_MailWizz::sync() užklausos turinį praleidžia per array_filter, kuris prieš POST pašalina tuščius FNAME ir LNAME. Vardas neperduodamas, nes surinkimo langas jo net neprašo.
  • Sąrašo UID išsaugant praleidžiamas per sanitize_key: raidės paverčiamos mažosiomis, o viskas, kas nepatenka į a-z, 0-9, pabraukimą ir brūkšnelį, pašalinama. UID su didžiosiomis raidėmis išsaugomas pakeistas, laukelis ekrane vis tiek atrodo tikroviškai, o kiekviena sinchronizacija nepavyksta ir mcr_mailwizz_status rodo klaidą, kurios su tuo laukeliu nesusiesite. Po kiekvieno išsaugojimo perskaitykite laukelį List UID iš naujo.
  • Test connection nėra pasirinktinis veiksmas. Tik jis įrodo, kad URL, raktas ir UID išsaugant nepasikeitė.
  • Būsenos eilutė po laukeliais rodo paskutinę tikrą sinchronizaciją, o ne paskutinį bandymą. Sėkmingas bandymas ir raudona būsenos eilutė vienu metu reiškia, kad prisijungimo duomenys veikia, bet kažkas negerai su siunčiamu turiniu arba sąrašu.
add_action(
	'mcr_customer_email_captured',
	function ( $email, $marketing_consent ) {
		if ( ! $marketing_consent ) {
			return;
		}
		// Queue your own provider sync here.
	},
	10,
	2
);
Atsargiai

MailWizz API raktas saugomas atviru tekstu parinktyje mcr_settings ir įrašomas į puslapio HTML kaip paslėptas laukelis kortelėje Settings bei kaip slaptažodžio laukelio reikšmė kortelėje Integrations. Jį gali perskaityti kiekvienas, turintis manage_woocommerce teisę, ir kiekvienas, turintis duomenų bazės kopiją. Naudokite raktą, ribotą iki to vieno sąrašo, ir pakeiskite jį išėjus parduotuvės administratoriui.

Ataskaitos ir krepšelių sąrašas

Kiekvienas Reports rodiklis filtruoja pagal created_at per pastarąsias 30 dienų, tai yra pagal krepšelio įrašo sukūrimo datą, o ne pagal veiksmų su juo datą. Prieš 40 dienų sukurtas ir šįryt paliktas krepšelis nepatenka į jokį rodiklį, įskaitant susigrąžintas pajamas. Tame lange: tracked carts yra visi įrašai (įrašas atsiranda tik tada, kai žinomas el. pašto adresas), Currently abandoned rodo, kiek tų įrašų dabar yra būsenos abandoned, Recovered skaičiuoja būseną recovered, o konversijos rodiklis yra susigrąžinti, padalyti iš paliktų ir susigrąžintų sumos. Susigrąžintos pajamos sudedamos iš recovered įrašų stulpelio cart_total, o cart_total, priskyrus užsakymą, perrašomas užsakymo suma. Paantraštė skaičiuoja laiškų žurnalo eilutes, kurių būsena sent, per tas pačias 30 dienų. Diagrama apima 14 dienų, taip pat pagal sukūrimo datą. Abandoned carts rodo kiekvieną įrašą nepriklausomai nuo amžiaus: būseną, dviejų prekių santrauką, sumą, tikrai išsiųstų laiškų skaičių ir paskutinio veiksmo laiką svetainės laiko juostoje. Užsakymas su krepšeliu pirmiausia siejamas pagal esamos sesijos raktą, o jei nepavyksta, pagal vėliausiai atnaujintą aktyvų ar paliktą krepšelį su tuo pačiu atsiskaitymo el. pašto adresu.

Pirmasis nustatymas iš eilės

Padarykite tai iš karto, nedarydami pertraukos. Kol dirbate, įskiepis jau veikia, tad pirmasis žingsnis ir yra tas, kuris suteikia laiko.

  1. Kortelėje Settings atžymėkite Enable cart capture and recovery emails ir išsaugokite. Taip langas iš karto dingsta iš parduotuvės. Krepšelių įrašinėjimo tai nesustabdo; jei norite sustabdyti ir jį, kol derinate, geriau išjunkite patį įskiepį ir vėl įjunkite baigę.
  2. Nustatykite Sender name ir Sender email į tikrą parduotuvės domeno pašto dėžutę, kurią leidžia jūsų SPF ir DKIM įrašai.
  3. Nustatykite Mark abandoned after. 60 minučių yra protingas startas. Traktuokite tai kaip laiką nuo paskutinio užfiksuoto krepšelio veiksmo, o daugumoje parduotuvių tai apima ir naršymą.
  4. Nustatykite Retain recovery records tokiam laikotarpiui, kurį galėsite pagrįsti pirkėjui ir kurio vėliau nereikės trumpinti.
  5. Perrašykite Title, Message, Email placeholder, Button ir Privacy note savo pirkėjų kalba ir nepamirškite, kad trys nekintami lango tekstai liks angliški.
  6. Nuspręskite, ar apskritai rodyti rinkodaros sutikimo laukelį, o jei paliekate, perrašykite jo tekstą taip, kad būtų aišku, su kuo pirkėjas sutinka.
  7. Atsidarykite Email templates, perrašykite visus tris laiškus, išsaugokite vieną kartą, tada iš naujo atidarykite kortelę ir patikrinkite, ar visi trys tebėra.
  8. Jei naudojate MailWizz, užpildykite Integrations, išsaugokite, dar kartą perskaitykite laukelį List UID, tada paspauskite Test connection ir palaukite sėkmės pranešimo.
  9. Vėl įjunkite Enable cart capture and recovery emails ir išsaugokite.
  10. Patikrinkite privačiame naršyklės lange be WordPress sesijos: įdėkite prekę, pateikite laikiną adresą, uždarykite kortelę. Palaukite palikimo delsos ir dar penkių minučių, tada Abandoned carts patikrinkite įrašą bei priminimą.
  11. Mažo srauto parduotuvėje serverio lygiu išjunkite užklausomis paremtą WP-Cron ir kvieskite wp-cron.php tikruoju cron kas penkias minutes, kitaip priminimai vėluos.

Pavojus: el. pašto langas gali sustabdyti visus pardavimus

Kol rinkimas įjungtas, svečias negali nieko įdėti į krepšelį nepateikęs galiojančio el. pašto adreso. Skriptas atšaukia paspaudimą, atveria langą ir pakartoja pradinį veiksmą tik tada, kai serveris patvirtina duomenų priėmimą. Jei ta užklausa nepavyksta, pirkėjas įstringa: uždarius langą įdėjimas atšaukiamas, o paspaudus dar kartą jis tiesiog atsiveria iš naujo. Kode matyti du gedimo scenarijai. Nonce sugeneruojamas atvaizduojant puslapį ir tikrinamas pateikiant formą, tad pakankamai ilgai talpykloje laikytas puslapis gali nešti nonce, kurio WordPress nebepriima. O užklausų dažnio ribotuvas skaičiuoja pateikimus tik pagal $_SERVER['REMOTE_ADDR'] ir netikrina tarpinio serverio antraščių. Penkiolika pateikimų per penkias minutes, galiojančių ar ne, ir šešioliktas grąžina „Too many attempts. Please wait a few minutes.“ Kiekvienas suskaičiuotas pateikimas skaitikliui suteikia naujas penkias minutes, tad langas slenka pirmyn, kol pateikimai vis ateina; atmestas pateikimas jo nepratęsia, todėl blokas atsileidžia praėjus penkioms minutėms nuo penkiolikto suskaičiuoto bandymo. Už CDN ar reverse proxy, kuris neperrašo REMOTE_ADDR, visi lankytojai dalijasi vienu skaitikliu, o tai visą parduotuvę apriboja iki penkiolikos surinkimų per penkias minutes ir tarp jų blokuoja visus kitus.

  1. Greičiausias sprendimas turint prieigą prie administravimo: WooCommerce > Cart Recovery > Settings, atžymėkite Enable cart capture and recovery emails, išsaugokite. Langas iš karto nustoja rodytis, įdėjimas į krepšelį vėl veikia, o išsaugoti krepšeliai lieka.
  2. Neturint prieigos prie administravimo, per WP-CLI: pakeiskite nustatymą parinktyje nieko neišjungdami arba išjunkite įskiepį.
  3. Be WP-CLI: per SFTP pervadinkite wp-content/plugins/m-cart-recovery. WordPress išjungia įskiepį, kurio failas dingo. Lentelės ir parinktys lieka nepakitusios.
  4. Jei kaltas buvo užklausų dažnio ribotuvas, pirmiausia palaukite. Atmestas pateikimas skaitiklio nepratęsia, tad blokas atsileidžia pats praėjus penkioms minutėms nuo penkiolikto suskaičiuoto bandymo; talpyklą valykite tik tada, jei pateikimai vis ateina ir skaitiklį nuolat atnaujina. Raktai yra mcr_rate_ plius adreso maiša, tad pavienio nepasieksite: wp transient delete --all ištrina visus svetainės transient įrašus, ne tik šiuos skaitiklius, o svetainėje su nuolatine objektų talpykla, Redis ar Memcached, skaitiklių duomenų bazėje apskritai nėra, tad ši komanda jų visai nepasiekia. wp cache flush juos pasiekia, bet ištuština visą objektų talpyklą: WooCommerce transient įrašus, sesijų duomenis ir viską kita, kas naudoja tą pačią Redis duomenų bazę, įskaitant kitas svetaines toje pačioje sistemoje. Judrioje parduotuvėje prie ir taip sugedusio atsiskaitymo prisideda dar ir šaltos talpyklos antplūdis. Tada, prieš vėl įjungdami, sutvarkykite REMOTE_ADDR tarpinio serverio arba hostingo lygiu.
  5. Jei kalta buvo talpykla, pašalinkite parduotuvės puslapius ir admin-ajax.php iš viso puslapio talpyklos, tada pakartokite bandymą privačiame lange.
wp option patch update mcr_settings enabled 0
wp plugin deactivate m-cart-recovery
wp cache flush
wp transient delete --all
Atsargiai

Būtent šis gedimas kainuoja pinigus. Jei duomenų priėmimo užklausa nepavyksta, jokio atsarginio kelio į krepšelį nėra: sugedęs nonce, bendras ribotuvo skaitiklis, JavaScript klaida ar užblokuotas admin-ajax.php reiškia, kad niekas nieko nenupirks, o wp-admin apie tai nepraneša. Pirmą parą po rinkimo įjungimo stebėkite užsakymų srautą.

Pavojus: enable laukelis nesustabdo duomenų rinkimo

Atžymėjus Enable cart capture and recovery emails sustoja trys dalykai: lango HTML kodas puslapio apačioje, parduotuvės CSS bei JavaScript ir penkių minučių apdorojimo ciklas, kuris iš karto baigiasi. Daugiau nesustoja niekas. MCR_Capture::register() prikabina woocommerce_add_to_cart, woocommerce_cart_item_removed, woocommerce_cart_item_restored, woocommerce_cart_updated ir išsaugojimą per shutdown, nė karto nepažvelgdamas į tą nustatymą, o MCR_Capture::capture_current_cart() jo irgi netikrina. Kiekvienas krepšelis, priklausantis pirkėjui, kurio adresas jau žinomas, o tai apima kiekvieną prisijungusį naudotoją, ir toliau įrašomas į wp_mcr_carts. Tos eilutės atsiranda su būsena active, apdorojimo užduotis, kuri jas pastumtų toliau, praleidžiama, o MCR_Cart_Repository::cleanup() šalina tik eilutes, kurių būsena abandoned, completed, recovered ar unsubscribed. Taigi pristabdytas įskiepis kaupia pirkėjų el. pašto adresus, kurių jame niekas niekada nepašalins, ilgiau nei numatėte saugojimo trukmėje ir pažadėjote pirkėjams.

  • Ką laukelis sustabdo: langą, jo CSS ir JavaScript, palikimo žymėjimą ir visus priminimus.
  • Ko nesustabdo: krepšelių įrašymo per shutdown, wp_ajax_mcr_capture_email galinio taško, atkūrimo nuorodų, atsisakymo nuorodų, užsakymų susiejimo, atsiskaitymo formos užpildymo, kasdienio valymo ir administravimo ekranų.
  • Vienintelis tikras sustabdymas yra įskiepio išjungimas. Išjungus atkabinama viskas ir panaikinamas užduočių planavimas, o lentelės, parinktys, nustatymai, šablonai ir visi išsaugoti krepšeliai lieka vietoje.
  • Eilutės, įrašytos pristabdžius įskiepį, būsenos active lieka neribotai. Aktyvią eilutę pašalina tik pirkėjo ištuštintas WooCommerce krepšelis, nuoroda Delete kortelėje Abandoned carts, WordPress asmens duomenų šalinimo įrankis ir jūsų pačių SQL.
wp plugin deactivate m-cart-recovery
wp db query "SELECT status, COUNT(*) FROM wp_mcr_carts GROUP BY status"
wp db query "DELETE l FROM wp_mcr_email_log l JOIN wp_mcr_carts c ON c.id = l.cart_id WHERE c.status = 'active'"
wp db query "DELETE FROM wp_mcr_carts WHERE status = 'active'"
Atsargiai

Jei laukelį atžymėjote dėl privatumo klausimo, atžymėjimas jo neišsprendė. Išjunkite įskiepį, suskaičiuokite active eilutes ir jas ištrinkite. Komandose įrašykite savo duomenų bazės prefiksą ir prieš tai pasidarykite kopiją: trinant active eilutes pašalinami ir krepšeliai, kuriuos gyvi pirkėjai dar pildo.

Pavojus: prisijungę pirkėjai lango nemato, bet laiškus gauna

MCR_Capture::get_customer_email() pirmiausia žiūri į WooCommerce sesiją, tada į WC()->customer->get_billing_email(), tada į prisijungusio naudotojo paskyros el. paštą. Bet kurio iš trijų pakanka krepšeliui įrašyti. Todėl prisijungęs pirkėjas lango nemato, privatumo teksto jam niekas neparodo, nieko neklausia, o eilutė wp_mcr_carts lentelėje pagal jo naudotojo ID vis tiek atsiranda, su marketing_consent 0, ir krepšeliui pasenus paleidžiama visa trijų laiškų seka. Tas pat galioja ir jūsų darbuotojams: kiekvienas administratorius ir parduotuvės valdytojas, palikęs prekių bandomajame krepšelyje, įrašomas savo paskyros adresu, todėl jūsų pačių el. paštas ir atsiranda sąraše Abandoned carts. Šiems lankytojams lango HTML kodas taip pat įterpiamas; skriptas jo tiesiog niekada neatveria, nes puslapis buvo atvaizduotas su jau teigiama captured reikšme.

  • Paskyrų turėtojai įrašomi pagal savo paskyros el. paštą, be lango, be privatumo teksto ir be jokio sutikimo žingsnio.
  • Vienintelis jų atsisakymo būdas yra nuoroda Stop cart reminders priminimo poraštėje, ir ji galioja tam vienam krepšelio įrašui, o ne adresui.
  • Rinkodaros sutikimas jiems niekada nebūna teigiamas, tad į MailWizz apie juos nesiunčiama nieko. Galioja tik vietinis įrašymas ir priminimų laiškai.
  • Kiekvieną pakeitimą tikrinkite privačiame lange be WordPress sesijos. Bandant prisijungus ir lango nepamatysite, ir savo paties adresą įrašysite į lentelę.
  • Siūlomas privatumo tekstas, kurį šis įskiepis prideda skiltyje Settings > Privacy, prasideda žodžiais „When a shopper provides an email to save a cart“, o šio kelio jis neaprašo. Perrašykite jį prieš skelbdami.
  • Prisijungusio naudotojo krepšelio įrašas siejamas su naudotojo ID, ne su sesija, tad slapukų valymas jo nesuskaido: vienas naudotojas turi vieną įrašą.

Pavojus: duomenys, kurie dingsta nepaklausę

Keturi skirtingi keliai negrįžtamai ištrina krepšelių įrašus. Nė vienas neprašo patvirtinimo, išskyrus nonce, nė vienas nekuria archyvo, o atšaukimo įskiepyje nėra. Vienintelis kelias atgal yra duomenų bazės atsarginė kopija.

  • Nuoroda Delete sąraše Abandoned carts. Vienas paspaudimas pašalina krepšelio eilutę ir visas jos laiškų žurnalo eilutes. Naršyklė patvirtinimo neklausia, tikrinamas tik nonce, tad nepataikius atgal kelio nėra.
  • Kasdienis saugojimo trukmės valymas. Jis pašalina krepšelius, kurių būsena abandoned, completed, recovered ar unsubscribed ir kurių paskutinis atnaujinimas senesnis nei Retain recovery records, kartu su žurnalais. Vienu kartu atrenkama ne daugiau kaip 500 identifikatorių, o užduotis vykdoma kartą per parą, tad riba yra 500 įrašų per parą iš viso, o ne 500 vienoje partijoje. Parduotuvė, per parą sukurianti daugiau nei 500 pasenusių įrašų, niekada nepasiveja, ir asmens duomenys neribotai lieka ilgiau nei numatėte. Valymas veikia net kai Enable cart capture and recovery emails išjungtas.
  • WooCommerce krepšelio ištuštinimas. Kai WooCommerce iškviečia woocommerce_cart_emptied, tos sesijos aktyvus įrašas ištrinamas kartu su žurnalais.
  • WordPress asmens duomenų šalinimas per Tools > Erase Personal Data. Vienu ėjimu pašalinama iki 100 nurodyto adreso krepšelių įrašų su jų žurnalais.
wp db query "SELECT status, COUNT(*) AS rows_now FROM wp_mcr_carts GROUP BY status"
wp db query "SELECT COUNT(*) FROM wp_mcr_carts WHERE status IN ('abandoned','completed','recovered','unsubscribed') AND updated_at < DATE_SUB(UTC_TIMESTAMP(), INTERVAL 90 DAY)"
Atsargiai

Retain recovery records mažinimas yra ardomasis su atidėjimu. Pakeitus 90 į 7 iš pradžių niekas nesimato, o kai kitą kartą suveiks kasdienė užduotis, ji ims trinti maždaug trijų mėnesių krepšelius, laiškų istoriją ir už jos esančias ataskaitas, po 500 įrašų per parą ir ne greičiau. Prieš mažindami šį skaičių pasidarykite duomenų bazės kopiją, o paskui kelias dienas vykdykite antrą aukščiau pateiktą užklausą: jei eilė nemažėja, kalta riba, o jūsų skelbiamas saugojimo terminas nėra vykdomas.

Pavojus: laiškai, kurie nustoja eiti nieko nepranešę

Priminimai siunčiami per wp_mail su From antrašte, sudėliota iš Sender name ir Sender email ir pridedama prie kiekvienos žinutės. Jei tas adresas nėra tas, kurio vardu jūsų domenui leidžiama siųsti, laišką atmeta gaunantis serveris arba jis patenka į šlamštą, o įskiepis įrašo tik tai, ką grąžina wp_mail. Nesėkmės rašomos į laiškų žurnalo lentelę su būsena failed ir pranešimu „wp_mail() did not accept the message.“, bet jokiame administravimo ekrane jos nerodomos: vienintelis matomas požymis yra tai, kad stulpelis Emails sąraše Abandoned carts lieka nulinis, nors krepšelių daugėja. Bandomojo laiško mygtuko įskiepyje nėra, tad pristatymą tenka įrodyti tikru krepšeliu.

  • Nurodykite Sender email pašto dėžutę, kuri tikrai egzistuoja parduotuvės domene, ir patikrinkite, kad SPF, DKIM bei DMARC leidžia jūsų serveriui jos vardu siųsti.
  • Jei naudojate SMTP įskiepį, kuris pats turi valdyti From antraštę, geriau pašalinkite šio įskiepio antraštę filtru mcr_recovery_email_headers, nei kovokite su ja.
  • Kad pamatytumėte nesėkmes, laiškų žurnalo lentelėje wp_mcr_email_log su jūsų prefiksu pasižiūrėkite eilutes, kurių status yra failed.
  • Priminimai siunčiami tik HTML formatu. Grynojo teksto dalies nėra, o kai kurie šlamšto filtrai į tai atsižvelgia.
  • Krepšelis, kurio išsaugotas turinys nebeatkoduojamas į netuščią masyvą, praleidžiamas dar nepasiekus wp_mail, ir į žurnalą nepatenka niekas. Jei įrašas stovi ties nuliu laiškų, o būsena nejuda, patikrinkite jo cart_contents stulpelį. Dėl to paties stulpelio tyliai nustoja veikti ir jau išsiųstų priminimų atkūrimo nuoroda, kaip aprašyta skyriuje apie nuorodų skenerius.
add_filter(
	'mcr_recovery_email_headers',
	function ( $headers ) {
		return array_values(
			array_filter(
				$headers,
				function ( $header ) {
					return 0 !== stripos( $header, 'From:' );
				}
			)
		);
	}
);

Pavojus: laiškų seka gali dingti išsaugant

MCR_Admin::save_templates() įrašo MCR_Settings::sanitize_templates( $_POST['templates'] ) tiesiai į parinktį mcr_templates. Su pateiktais numatytaisiais šablonais niekas nesuliejama ir jokios apatinės ribos nėra: kas atėjo POST užklausoje, tas ir tampa visa seka. Formoje yra trys turtingo teksto laukai ir dar penkiolika mažesnių, tad POST užklausa didelė. Hostingo max_input_vars riba, saugumo modulis, ribojantis užklausos dydį, arba ją apkarpantis tarpinis serveris išsaugo mažiau šablonų, nei redagavote, arba tuščią masyvą. MCR_Admin::render_templates() atvaizduoja tik jau išsaugotus šablonus ir jokio mygtuko pridėti neturi, tad parinkčiai tapus tuščiu masyvu ekrane lieka tik kintamųjų sąrašas ir mygtukas Save, o priminimai sustoja visam laikui, niekur nerodydami klaidos.

  1. Patikrinkite, kas išsaugota: wp option get mcr_templates --format=json. Turėtumėte matyti tris objektus.
  2. Jei šablonų trūksta arba masyvas tuščias, tiesiog ištrinkite parinktį: wp option delete mcr_templates. MCR_Settings::get_templates() grįžta prie pateiktos trijų laiškų sekos visada, kai parinkties nėra, tad numatytosios reikšmės atsiranda iš karto, angliškai, su delsomis 0, 1440 ir 4320.
  3. Perrašykite tris laiškus, išsaugokite vieną kartą, tada iš naujo atidarykite kortelę ir prieš pasitraukdami įsitikinkite, kad visi trys grįžo.
  4. Jei vėl nukerpama, pakelkite max_input_vars hostinge ir peržiūrėkite viską, kas filtruoja ar riboja POST užklausas.
  5. Laikykite savo trijų temų, antraščių ir tekstų kopiją už WordPress ribų. Įskiepis neturi nei eksporto, nei versijų istorijos.
wp option get mcr_templates --format=json
wp option delete mcr_templates
Atsargiai

Apkarpytas išsaugojimas įvyksta tyliai. Ekranas nukreipia su užrašu Changes saved. ir parodo tik išlikusius šablonus, tad viskas atrodo tvarkinga. Kortelės perkrovimas po kiekvieno išsaugojimo yra vienintelis patikrinimas, kurį įskiepis siūlo.

Foninis apdorojimas ir laikas

Įskiepis naudoja Action Scheduler, kai jį suteikia WooCommerce, grupėje m-cart-recovery, o atsargai naudoja WP-Cron su savo penkių minučių intervalu, registruotu kaip mcr_five_minutes. Abi užduotys sukuriamos per init su 20 prioritetu, pirmos užklausos po aktyvavimo metu, tad svetainė, negaunanti nė vienos užklausos, nesuplanuoja nieko. Veikia dvi pasikartojančios užduotys: mcr_process_abandoned_carts kas penkias minutes, kuri neveiklius krepšelius pažymi paliktais ir išsiunčia laiku pribrendusius priminimus, ir mcr_cleanup_old_data kartą per parą. Trečiasis kabliukas, mcr_sync_marketing_contact, į eilę dedamas pagal poreikį MailWizz sinchronizacijai. Vienas apdorojimo ciklas paima ne daugiau kaip 20 pribrendusių krepšelių ir vienam krepšeliui pastumia lygiai vieną šabloną, tad didelė eilė tirpsta maždaug 240 krepšelių per valandą greičiu. Ciklai nesipersidengia dėl užrakto parinktyje mcr_processing_lock, kuris automatiškai panaikinamas, jei senesnis nei dešimt minučių, tad nutrūkęs ciklas atsiblokuoja kito ciklo metu.

Trikčių šalinimas

Dažniausiai pasitaikančios bėdos ir ką pirmiausia patikrinti.

  • Langas apskritai nepasirodo. Rinkimas išjungtas; esate prisijungę arba sesijoje ar kliento įraše el. paštas jau yra, tad puslapis atvaizduotas su teigiama captured reikšme; puslapis atkeliavo iš talpyklos, sugeneruotos tokiam lankytojui; arba jūsų tema prekę į krepšelį prideda valdikliu, kurio skriptas nestebi, ir tada langas apeinamas visiškai.
  • Langas rodomas, bet pateikus nieko nevyksta. Atsidarykite naršyklės konsolę ir pažiūrėkite admin-ajax.php atsakymą: 403 reiškia nepavykusį nonce, dažniausiai dėl viso puslapio talpyklos; 429 yra užklausų dažnio ribotuvas; 409 reiškia, kad tos užklausos metu nebuvo pasiekiama WooCommerce sesija; 400 reiškia, kad adresas neperėjo is_email patikros.
  • Sąraše Abandoned carts matote savo paties adresą. Pildydami bandomąjį krepšelį buvote prisijungę. Paskyrų adresai surenkami be jokio lango. Ištrinkite eilutę ir bandykite privačiame lange.
  • Krepšeliai niekada netampa paliktais. Neveikia penkių minučių užduotis (patikrinkite Action Scheduler arba WP-Cron), išjungtas Enable cart capture and recovery emails (praleidžiamas visas ciklas), prie įrašo nėra el. pašto arba jo cart_contents yra tuščias masyvas.
  • Krepšeliai lieka aktyvūs kur kas ilgiau, nei rodytų delsa. Palikimo laikas skaičiuojamas pagal updated_at, o jis atnaujinamas kaskart, kai WooCommerce įrašo krepšelį į sesiją, o daugumoje parduotuvių tai vyksta pirkėjui naršant.
  • Krepšeliai palikti, bet niekas nesiunčiama. Išjungti visi šablonai, parinktis mcr_templates tuščia, dar nepraėjo delsa, išsaugotas krepšelio turinys tuščias arba wp_mail nesuveikia.
  • Ekrane Email templates nėra nė vieno redaktoriaus. Parinktyje mcr_templates yra tuščias masyvas. Ištrinkite parinktį, kad grįžtų pateikta seka.
  • Tas pats pirkėjas gauna seką du kartus. Svečias, išvalęs slapukus, gauna naują sesijos raktą, taigi ir naują krepšelio įrašą su nauja seka; taip pat nutinka pirkėjui, atsidariusiam atkūrimo nuorodą antrame įrenginyje. Atsisakymas galioja vienam įrašui, o ne adresui.
  • Pirkėjo krepšelio seka vis prasideda iš naujo. Bet koks krepšelio turinio pakeitimas įrašą sąmoningai grąžina į active ir išvalo skaitiklius, tad seka prasideda nuo naujo palikimo.
  • Įrašai tampa unsubscribed praėjus kelioms sekundėms po pirmo priminimo. Įmonės nuorodų skeneris atsiuntė atsisakymo adresą. To laiško atkūrimo nuoroda dabar irgi nebeveikia.
  • Atkūrimo nuoroda atidaro pradinį puslapį ir nieko nedaro. Arba žetonas neatitiko 64 simbolių šablono, dažniausiai todėl, kad pašto programa perkėlė adresą į kitą eilutę, arba įrašo cart_contents nebeatkoduojamas į masyvą. Abiem atvejais handle_restore() nutraukia darbą be pranešimo ir be nukreipimo.
  • Susigrąžintos pajamos atrodo neteisingos. Pirmiausia siejama pagal sesijos raktą, paskui pagal naujausią aktyvų ar paliktą krepšelį su tuo pačiu atsiskaitymo el. pašto adresu, tad iš kito įrenginio pateiktas užsakymas gali būti priskirtas kitam krepšeliui. Be to, rodikliai apima tik per pastarąsias 30 dienų sukurtus įrašus.
  • Atkūrimo nuoroda praneša, kad krepšelio nebėra. Įrašo būsena yra completed, recovered ar unsubscribed arba jį jau ištrynė saugojimo trukmės valymas.

Privatumas ir duomenys

Neįjungus MailWizz, iš svetainės neišeina niekas. Jį įjungus, į jūsų nurodytą API URL POST metodu siunčiamas tik sutikimą pažymėjusių pirkėjų el. pašto adresas; tušti vardo ir pavardės laukai iš užklausos turinio prieš siunčiant pašalinami. Patys priminimai, savaime suprantama, išeina jūsų pašto keliu. Visa kita lieka dviejose vietinėse lentelėse. Įskiepis registruoja asmens duomenų eksportavimo ir šalinimo įrankius skiltyse Tools > Export Personal Data ir Tools > Erase Personal Data bei prideda siūlomą tekstą į privatumo politikos vadovą Settings > Privacy; jį reikėtų pritaikyti savo jurisdikcijai, o ne skelbti tokį, koks pateiktas. Tas siūlomas tekstas aprašo tik pirkėją, pateikiantį adresą per langą, tad prisijungusių klientų, kurie įrašomi nieko neklausiant, jis neapima.

  • wp_mcr_carts saugo: el. paštą, vardą ir pavardę, naudotojo ID, rinkodaros sutikimo žymą, krepšelio turinį JSON formatu, sumą, valiutą, būseną, 64 simbolių atkūrimo žetoną, laiko žymas, susieto užsakymo ID ir krepšelio raktą, kuris yra naudotojo ID arba WooCommerce sesijos identifikatoriaus HMAC, o ne atstatomas identifikatorius.
  • wp_mcr_email_log saugo: krepšelio ID, šablono numerį, gavėją, temą, būseną, klaidos tekstą ir laiko žymą.
  • Grynas IP adresas niekur nesaugomas. Užklausų dažnio ribotuvas užklausos adresą paverčia HMAC reikšme, kuri tampa transient raktu ir į įskiepio lenteles nepatenka.
  • Sėkmingai surinkus adresą nustatomas vienas slapukas: mcr_email_captured, reikšmė 1, vieniems metams, per HTTPS su secure žyma. Jokia įskiepio kodo vieta jo neskaito. Ar langas atsivers, sprendžiama serveryje pagal WooCommerce sesiją, kliento įrašą ir prisijungusią paskyrą.
  • Įrašų, kurių būsena active, saugojimo trukmės valymas nešalina niekada, tik abandoned, completed, recovered ir unsubscribed. Jei ilgam paliksite rinkimą išjungtą arba jūsų pirkėjai toliau naršys, active eilutės liks neribotam laikui.

Šalinimas: kas dingsta ir kas lieka

Išjungimas ir ištrynimas skiriasi labai stipriai, o visą skirtumą lemia vienas žymimasis laukelis, kurį reikėjo pažymėti iš anksto.

  1. Išjungus panaikinamas mcr_process_abandoned_carts, mcr_cleanup_old_data ir bet kurių eilėje esančių mcr_sync_marketing_contact užduočių planavimas tiek Action Scheduler, tiek WP-Cron, ir atkabinama viskas, įskaitant krepšelių įrašymą, atkūrimo bei atsisakymo nuorodas. Lentelės, parinktys, nustatymai, šablonai ir visi išsaugoti krepšeliai lieka savo vietose, o vėl įjungus tvarkaraštis atkuriamas kitos užklausos metu.
  2. Ištrynus įskiepį Plugins sąraše paleidžiamas uninstall.php. Jis visada panaikina tų pačių užduočių planavimą. Tada nuskaito parinktį Permanently delete plugin tables and settings ir, jei ji išjungta, ties tuo sustoja.
  3. Įjungus tą parinktį, šalinimo metu ištrinamos lentelės wp_mcr_carts ir wp_mcr_email_log bei parinktys mcr_settings, mcr_templates, mcr_db_version, mcr_mailwizz_status ir mcr_processing_lock. Jokio eksporto žingsnio nėra, kaip ir antro patvirtinimo, be paties WordPress klausimo.
  4. Kai ta parinktis išjungta, nieko neištrinama. Jei vėliau norėsite atsikratyti likučių, rankiniu būdu ištrinkite dvi lenteles ir penkias parinktis.
  5. Bet kuriuo atveju transient įrašai išlieka: uninstall.php nepašalina nei mcr_rate_ raktais pažymėtų ribotuvo skaitiklių, nei mcr_admin_error_ pranešimo, nei likusio mcr_activation_redirect. Jie pasibaigia patys.
  6. Bet kuriuo atveju slapukas mcr_email_captured lankytojų naršyklėse ir reikšmės mcr_email bei mcr_marketing_consent WooCommerce sesijose nepaliečiamos. Jos taip pat pasibaigia pačios.
Atsargiai

Permanently delete plugin tables and settings žymėkite tik tada, kai tikrai neketinate diegti iš naujo. Trynimas įvyksta tą pačią akimirką, kai WordPress pašalina įskiepio failus, dar prieš jums persigalvojant, ir kartu išsineša visus krepšelių įrašus bei visą laiškų istoriją. Prieš tai pasidarykite duomenų bazės kopiją.

Automatiniai atnaujinimai

Įskiepis tikrina majevski.com dėl naujų versijų ir siūlo jas per įprastą WordPress atnaujinimų langą — tas pats pranešimas, keitimų sąrašas ir diegimas vienu paspaudimu kaip ir bet kurio kito įskiepio. Tikrinimai talpinami podėlyje, niekada nelėtina puslapių ir veikia saugiai: jei majevski.com nepasiekiamas, svetainė tiesiog dirba toliau ir pabando vėliau. Atnaujinimo paketas priimamas tik iš majevski.com per HTTPS, o senesnė versija niekada nesiūloma. Versijos iki 1.1.0 atnaujinimų kanalo dar nepažįsta, todėl naujų leidimų nemato — vieną kartą rankiniu būdu įdiekite 1.1.0 ar naujesnę, ir visi vėlesni leidimai atkeliaus savaime.

Reikia kažko panašaus?

Viską šiame puslapyje suprojektavo, sukūrė ir prižiūri vienas žmogus. Jei to paties reikia jūsų verslui, parašykite, ką turite omenyje.

Rezervuoti pokalbį atsidaro naujame lange