Wat het doet
Een product dat voor één persoon gemaakt wordt, past niet op een gewone productpagina. De klant moet je een foto sturen, jij moet het ding bouwen, en hij moet het zien en akkoord gaan voordat jij materiaal verbruikt. Met de hand is dat een keten van e-mails, en die keten breekt elke keer op dezelfde plek: niemand kan met zekerheid zeggen of de klant de versie heeft goedgekeurd die je werkelijk hebt gedrukt.
MevvAtelier maakt die keten onderdeel van de bestelling. De bestelling draagt de foto’s, de proef, de goedkeuring en het tijdstip daarvan bij zich, en de statussen die zij doorloopt zijn echte WooCommerce-bestelstatussen — ze verschijnen dus in het besteloverzicht, in rapporten en in de filters die je al gebruikt.
- Gebruik het wanneer
- Je verkoopt iets dat je per bestelling maakt uit iets dat de klant je stuurt, en je wilt zijn goedkeuring vastgelegd hebben voordat de productie begint.
- Het is geen plugin voor productopties
- Er is geen variatiematrix en geen optiebouwer per product. Het is één traject, met één configuratorpagina, voor een productlijn die je op bestelling maakt.
- De foto’s zijn geen bijlagen in de mediabibliotheek
- Het zijn privébestanden met hun eigen bewaartermijn. De foto van een klant is geen productfoto en wordt ook niet zo behandeld.
Vereisten: WordPress 6.0 of nieuwer, PHP 8.1 of nieuwer, en WooCommerce. Zonder WooCommerce stopt de plugin zichzelf en zegt dat ook — hij heeft geen eigen besteltraject om op terug te vallen.
Instellingen, en de ene grens die blijft
Alles wat een winkel normaal aanpast staat onder Atölye → Ayarlar: hoe elk pakket heet, wat het kost voor één tot zes personen, de prijzen van de twee extra’s, welk pakket de verfset gratis krijgt, welk pakket geselecteerd is als de pagina opent, en hoe lang foto’s bewaard blijven.
Je typt prijzen in lira en de plugin bewaart ze als hele kleinste eenheden. Opslaan is alles of niets: kan één veld niet gelezen worden, dan wordt er geen enkele weggeschreven en het scherm zegt welke. Een halve prijstabel is een tabel die breekt op het moment dat een klant bestelt.
- Een pakket hernoemen
- De namen die met de plugin meekomen beschrijven 3D-geprinte figuren, want dat was de winkel waarvoor hij gebouwd is. Typ je eigen namen — “Kleine hanger”, “Gegraveerde plaquette”, “A4-print” — en dat is wat de klant ziet. De interne sleutel naast elk veld verandert nooit, dus bestaande bestellingen blijven naar het juiste wijzen.
- Minder dan vijf verkopen
- Laat de naam van een pakket leeg en het verdwijnt uit het bestelformulier, en de server weigert het als iemand het toch verstuurt. De prijzen blijven in de tabel staan, dus het later weer aanzetten is één woord, geen herinvoer.
- Welk pakket geselecteerd opent
- Een commerciële beslissing en geen technische: de middelste trap verankert de klant naar boven, de goedkoopste naar beneden. Wordt het pakket dat je koos later uitgezet, dan valt het formulier terug op het eerste pakket dat nog aanstaat in plaats van zonder prijs te openen.
DE GRENS DIE BLIJFT: er zijn vijf pakketplaatsen. Je kunt ze hernoemen, beprijzen en uitzetten, maar je kunt er geen zesde bij zetten. Heeft jouw lijn er meer nodig, schrijf ons dan en zeg hoeveel — dat is het volgende dat gebouwd wordt, en het echte aantal kennen bepaalt de vorm.
Installatie
- Installeer en activeer eerst WooCommerce. MevvAtelier weigert zonder op te starten.
- Installeer MevvAtelier: upload de zip via Plugins → Nieuwe plugin, of kopieer de map
mevvateliernaar/wp-content/plugins/. - Activeer hem. Bij activering registreert de plugin zijn bestelstatussen, maakt hij de map van de fotokluis aan en plant hij de dagelijkse bewaartaak in.
- Maak een pagina en zet daar de shortcode
[mevvatelier]op. Die pagina is je bestelformulier. - Plaats een testbestelling via de pagina, open dan Atölye in het beheermenu en loop hem één keer helemaal door. Doe dit vóór je de pagina promoot: de hele ronde kost vijf minuten en het is de enige manier om de e-mails te zien die je winkel werkelijk verstuurt.
De goedkeuringslinks worden ondertekend met een geheim dat bij het eerste gebruik wordt aangemaakt en in je eigen database wordt bewaard. Het verlaat je server nooit en is niet afgeleid van iets dat wij hebben.
De drie shortcodes
- [mevvatelier]
- Het bestelformulier. Vijf stappen: pakket, hoeveel personen er in de scène zijn, de foto’s, de gegevens van de klant en een toestemmingsvakje. Het toont een lopend totaal terwijl de klant kiest, en dat totaal is nooit datgene waarmee de bestelling wordt geschreven — zie “Waar de prijzen staan”.
- [mevvatelier_tanitim]
- Een promotiebalk voor je homepage: een kop, een korte tekst en een knop naar het bestelformulier. Neemt een bijlage-id:
[mevvatelier_tanitim gorsel="123"]. - [mevvatelier_gorsel]
- Een afbeelding uit je mediabibliotheek, weergegeven met de responsieve maten die WordPress al gemaakt heeft:
[mevvatelier_gorsel id="123" size="large"]. Hij bestaat zodat een promotiepagina geen foto van 2000 pixels in een gat van 380 pixels op een telefoon drukt.
De bestelpagina zet paginacaching voor zichzelf uit, in de taal die LiteSpeed, WP Rocket en W3 Total Cache alle drie verstaan, en stuurt daarnaast no-store-headers. Een gecachet bestelformulier verstuurt met een verlopen token en faalt geruisloos, wat voor de klant lijkt op een formulier dat niets doet.
Waar de prijzen staan
De prijs van een bestelling wordt op je server berekend uit uitsluitend de keuze van de klant. Een door de browser verstuurd totaal wordt botweg genegeerd: de browser vragen wat je moet rekenen is de kortste weg naar voor niets verkopen. Geld wordt in hele kleinste eenheden bewaard (kuruş, centen), nooit als decimaal, zodat een lange bestelling niet één eenheid kan afwijken tussen factuur en order.
Je bewerkt ze onder Atölye → Ayarlar, in lira, met een komma voor de kuruş. Elk pakket heeft een prijs nodig voor elk ondersteund aantal personen, één tot en met zes. De hele tabel wordt gecontroleerd voordat er iets wordt weggeschreven, en kan één veld niet gelezen worden dan zegt het scherm welke en schrijft er geen enkele — een halve prijstabel is een tabel die breekt op het moment dat een klant bestelt.
Het geheel past in één optie, mevvatelier_pricing, als je het liever met WP-CLI uitrolt dan klikt. De plugin leest de optie na het schrijven terug en weigert succes te melden als wat hij terugleest niet klopt, want een winkel achter een persistente objectcache kan anders te horen krijgen “opgeslagen” terwijl hij tegen de oude prijs blijft verkopen.
wp eval '
$t = MevvAtelier_Settings::pricing_table();
$t["labels"]["orta"] = "Orta boy kolye ucu";
$t["packages"]["orta"][1] = MevvAtelier_Pricing::parse_money( "1.290,50" );
$t["default_package"] = "orta";
var_dump( MevvAtelier_Settings::save_pricing_table( $t ) );
'
De interne pakketsleutels zijn anahtarlik, orta, buyuk, anahtarlik_orta en uclu_set; die van de extra’s zijn paint_kit en rush. Daarnaar verwijzen de code en je bestaande bestellingen, dus ze veranderen nooit — de naam die de klant ziet is een apart veld dat je kunt herschrijven wanneer je wilt.
De werkplaatswachtrij
Atölye verschijnt in het beheermenu voor iedereen die winkelbestellingen mag bewerken. Het toont openstaande bestellingen met de oudste bovenaan en markeert in rood de bestellingen die de beloofde tijd overschreden hebben: normaal vierentwintig uur, zes bij een spoedorder. De vraag die het beantwoordt is niet “wat staat open” maar “wat is te laat”, en dat is de enige die een scherm waard is.
De medewerker uploadt de proef vanaf dezelfde regel. Het uploaden legt het bestand in de kluis, registreert een controlesom van precies wat getoond is, zet de bestelling op Müşteri onayında en mailt de klant — één handeling, geen vier dingen om te onthouden.
- Model bekliyor
wc-mevv-model. De foto’s zijn binnen, het model wordt gebouwd. De link van de klant werkt en vertelt hem precies dit.- Müşteri onayında
wc-mevv-onay. De proef is verstuurd. De klant kan hem goedkeuren of om een correctie vragen, zo vaak als nodig is.- Baskıda
wc-mevv-baski. Goedgekeurd en in productie. Het correctieformulier is van het scherm verdwenen, en op dit punt weigert ook de server een correctieverzoek, niet alleen het scherm.
Welke status op welke mag volgen staat als lijst van toegestane overgangen geschreven in plaats van verboden. Een stap waar niemand aan gedacht heeft wordt standaard geweigerd in plaats van stilzwijgend toegestaan, en dat is het verschil tussen een toestandsmachine en een suggestie.
Wat de klant ziet
Eén link, per e-mail verstuurd, die zestig dagen werkt en geen account nodig heeft. Iemand vragen zich te registreren voordat hij naar zijn eigen proef mag kijken, is de zekerste manier om de goedkeuring te verliezen; daarom draagt de link zijn eigen bevoegdheid: hij is ondertekend, hij noemt één bestelling en geen andere, en een gemanipuleerde opent niets.
De pagina toont voor elke status een ander scherm en wordt nooit gecachet: een gecachete goedkeuringspagina zou de proef van de ene klant aan de volgende bezoeker tonen. De goedkeuringslink staat twee keer in elke e-mail, als knop en als platte tekst, omdat sommige mailprogramma’s de knop niet weergeven.
- Bestelling ontvangen — verstuurd bij het plaatsen van de bestelling, met de link.
- Proef klaar — verstuurd zodra de medewerker hem uploadt. Dit is de e-mail die om een beslissing vraagt.
- Goedkeuring vastgelegd — verstuurd zodra hij goedkeurt, en zegt duidelijk dat de productie begonnen is.
- Verzonden — verstuurd zodra de medewerker de bestelling als klaar markeert.
De e-mails gaan door de WooCommerce-sjabloon van je eigen winkel, dus ze lijken op de rest van je post en niet op iets dat erop geplakt is.
De foto’s
Uploads gaan naar een map onder je uploads-map waarvan de naam niet te raden is, en ze zijn tegelijk op vier manieren beschermd: een .htaccess-regel, een web.config voor IIS, een index.php en bestandsrechten die niets anders dan de site laten lezen. Vier, omdat elk van deze afzonderlijk op iemands server ontbreekt of genegeerd wordt.
Een bestand wordt aangenomen om wat zijn bytes zijn, niet om wat zijn naam beweert. Een uitvoerbaar bestand hernoemd naar .jpg wordt bij de deur geweigerd: de extensie controleren is de papieren van de aanvaller zelf controleren. Geaccepteerde typen zijn JPEG, PNG, WebP en HEIC. De opgeslagen naam is willekeurig; de oorspronkelijke bestandsnaam van de klant bereikt het bestandssysteem nooit, want “ayse-dogum-gunu.jpg” is de naam van een kind en een datum.
Elke foto en elke proef gaat door één poort. Je team wordt toegelaten op zijn WooCommerce-bestelrecht; de klant op de ondertekende link, gecontroleerd tegen die bestelling. Een link die voor één bestelling is gemaakt, kan het bestand van een andere niet openen. De bestanden krijgen nooit een publieke URL.
- Bewaartermijn
- Een dagelijkse taak verwijdert de uploads en proeven van afgeronde bestellingen na een termijn die jij instelt: standaard zestig dagen, bewaard in de optie
mevvatelier_retention_days. De bestelling, het bedrag en de goedkeuringsregistratie blijven; de foto niet. - Wat uw server verlaat
- Niets uit deze plugin. Vanuit het besteltraject bereikt ons geen enkele foto, geen proef, geen bestelling, geen telemetrie en geen licentieaanroep. De kluis is een map op je eigen schijf en het logboek van goedkeuringen zijn je eigen bestelmetadata.
De foto van een kind onbeperkt op een winkelserver bewaren is een aansprakelijkheid, geen functie. Wijkt je bewaarbelofte aan klanten af van zestig dagen, pas de optie dan aan wat je hun verteld hebt: het getal op je pagina en het getal in de plugin horen hetzelfde getal te zijn.
Goedkeuring, annulering en herroepingsrecht
Volgens de Turkse regeling voor verkoop op afstand geeft een goed dat naar de specificatie van de consument zelf is vervaardigd geen herroepingsrecht zodra het gemaakt is (Mesafeli Sözleşmeler Yönetmeliği, art. 15/1-b). MevvAtelier is daaromheen gebouwd: de klant krijgt dat op het goedkeuringsscherm te lezen, en het moment waarop hij daarmee instemt wordt samen met de goedkeuring in de bestelling geschreven.
Vóór de goedkeuring is er niets geproduceerd, dus een annulering kost je een model en geen materiaal — annuleer de bestelling in WooCommerce en betaal hem terug zoals elke andere. Na de goedkeuring is het correctieformulier verdwenen en weigert de server een correctieverzoek, omdat het materiaal op dat moment vastligt.
Dit beschrijft wat de plugin vastlegt, het is geen juridisch advies. Je eigen overeenkomst voor verkoop op afstand en je voorafgaande-informatieformulier moeten hetzelfde zeggen, en MevvLegal is de plugin voor dat deel.
Problemen oplossen
- Het bestelformulier wordt verstuurd en er gebeurt niets
- Bijna altijd een gecachete kopie van de pagina. Het formulier draagt een eenmalig token en een gecachete pagina deelt een verlopen exemplaar uit, dat geruisloos geweigerd wordt. Leeg de pagina uit je cache en controleer of de no-store-headers van de plugin de browser bereiken; sommige CDN’s halen ze aan de rand weg.
- De klant zegt dat de link niet werkt
- Drie oorzaken, en de pagina zegt welke. Na zestig dagen is hij verlopen en stuur je een nieuwe. Is hij met de hand uit de e-mail overgetypt, dan ontbreekt er meestal een teken. Noemt hij een andere bestelling, dan is hij vanuit een andere e-mail doorgestuurd.
- In het beheer verschijnen de foto’s als gebroken afbeeldingen
- De kluis wordt geserveerd in plaats van afgeschermd: controleer of de kluismap nog steeds zijn
.htaccessenindex.phpbevat en of je host de rechten niet heeft teruggezet. Zijn de bestanden via een URL bereikbaar, dan is dat de dringendste helft van het probleem. - Een upload wordt geweigerd terwijl het wel een foto is
- Hij wordt gelezen als iets anders dan JPEG, PNG, WebP of HEIC. Schermafbeeldingen van telefoons en door ontwerpprogramma’s geëxporteerde afbeeldingen zijn dat vaak niet; opnieuw opslaan als JPEG lost het op. Wat er gecontroleerd wordt is niet de extensie.
- Bestellingen komen niet uit “Model bekliyor”
- Niets zet ze uit zichzelf in beweging — een medewerker uploadt de proef. Is het wachtrijscherm leeg voor iemand in je team, controleer dan of hij het recht heeft winkelbestellingen te bewerken; het scherm hangt daarvan af en niet van beheerder zijn.
- Er staan nog oude foto’s op de schijf
- De bewaartaak draait op WP-Cron, dat alleen afgaat wanneer iemand de site bezoekt. Bij een rustige winkel wacht hij op verkeer — of richt er een echte servercron op. Controleer ook of die bestellingen werkelijk afgerond zijn; openstaande bestellingen worden nooit opgeruimd.
- De prijzen op het formulier zijn niet de prijzen die ik ingesteld heb
- Je opgeslagen tabel doorstond de validatie niet en de plugin viel terug op zijn standaardwaarden in plaats van tegen een verkeerde prijs te verkopen. Er staat een beheerdersmelding die dat zegt. Elk pakket heeft elk aantal personen van één tot zes nodig, en elk bedrag moet een niet-negatief geheel getal in kleinste eenheden zijn.
Stuur ons bij je bericht de versies van WordPress, WooCommerce, PHP en de plugin, het bestelnummer, en welke van de vier e-mails wel en niet is aangekomen. Stuur de foto’s van de klant niet mee.