<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>conversion-optimization - Web Design | Creazione Siti Internet</title>
	<atom:link href="https://www.mrtux.it/tag/conversion-optimization/feed" rel="self" type="application/rss+xml" />
	<link>https://www.mrtux.it</link>
	<description>Sviluppo Siti Web - Assistenza WordPress</description>
	<lastBuildDate>Fri, 05 Jun 2026 01:26:33 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://www.mrtux.it/wp-content/uploads/2022/06/favicon-150x150.png</url>
	<title>conversion-optimization - Web Design | Creazione Siti Internet</title>
	<link>https://www.mrtux.it</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Web design 2026: 9 leggi che separano un sito da 500€ da uno da 50.000€</title>
		<link>https://www.mrtux.it/web-design-2026-9-leggi-sito</link>
					<comments>https://www.mrtux.it/web-design-2026-9-leggi-sito#respond</comments>
		
		<dc:creator><![CDATA[Emilio Petrozzi]]></dc:creator>
		<pubDate>Fri, 05 Jun 2026 01:26:31 +0000</pubDate>
				<category><![CDATA[sviluppo-web]]></category>
		<category><![CDATA[conversion-optimization]]></category>
		<category><![CDATA[design 2026]]></category>
		<category><![CDATA[design system]]></category>
		<category><![CDATA[Sviluppo web]]></category>
		<category><![CDATA[UX Design]]></category>
		<category><![CDATA[web design]]></category>
		<guid isPermaLink="false">https://www.mrtux.it/web-design-2026-9-leggi-che-separano-un-sito-da-500e-da-uno-da-50-000e</guid>

					<description><![CDATA[9 leggi non scritte del web design 2026 che separano un sito improvvisato da uno che converte davvero. Ogni legge ha un esempio prima/dopo, una metrica di successo, e il motivo per cui il 90% dei freelance e delle agenzie la ignora.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Ho passato in rassegna oltre 200 siti web italiani nel 2025, confrontando progetti da 500€ con progetti da 50.000€ realizzati per clienti della stessa dimensione e settore. La differenza non è (quasi mai) il budget. Non è il CMS scelto. Non è l&#x27;agenzia. È l&#x27;applicazione (o la non applicazione) di un piccolo numero di leggi operative che chi fa web design di alto livello conosce per esperienza e che chi fa siti improvvisati ignora sistematicamente.</p>



<p class="wp-block-paragraph">Queste 9 leggi non sono nella documentazione di Figma, non sono nei tutorial YouTube, non sono nei corsi da 50€ che si trovano sulle piattaforme di e-learning. Sono osservazioni empiriche, distillate in anni di lavoro su centinaia di progetti. Alcune sembrano ovvie a leggerle, ma la loro applicazione coerente è rara e fa una differenza enorme nei risultati.</p>



<p class="wp-block-paragraph">Questa guida è un manifesto editoriale ad alto potere di condivisione: ogni legge è illustrata con un esempio prima/dopo, una metrica di successo, e il motivo per cui il 90% dei freelance e delle agenzie continua a violarla. È complementare alla <a href="https://www.mrtux.it/strumenti-grafica-web-2026-sistemi-design-agentici" data-wpel-link="internal" target="_self" rel="noopener">guida sugli strumenti di grafica web 2026</a> e al <a href="https://www.mrtux.it/workflow-perfetto-tool-sviluppo-web" data-wpel-link="internal" target="_self" rel="noopener">workflow perfetto di sviluppo web</a>: qui lo sguardo è sul risultato finale, non sul processo.</p>



<p class="wp-block-paragraph">L&#x27;obiettivo è chiaro: dare a chiunque realizzi siti web (freelance, agenzia, o in-house) un framework mentale che può essere applicato da domani, su qualsiasi progetto, con un impatto misurabile sui risultati.</p>



<h2 class="wp-block-heading">Legge 1: La homepage non è una vetrina, è un imbuto</h2>



<p class="wp-block-paragraph">La differenza fondamentale tra un sito da 500€ e uno da 50.000€ si vede nei primi 5 secondi. Un sito economico mostra: logo gigante, slider con 5 immagini, testo &quot;benvenuti nel nostro sito&quot;, e 12 voci di menu. Un sito professionale mostra: una promessa chiara, una dimostrazione visiva del valore, e un&#x27;unica azione primaria (CTA).</p>



<h3 class="wp-block-heading">Prima</h3>



<ul class="wp-block-list"><li>Logo centrato che occupa il 40% dello spazio</li><li>Slider con 5 immagini rotanti che l&#x27;utente non guarda</li><li>Hero text generico (&quot;Soluzioni innovative per la tua azienda&quot;)</li><li>12 voci di menu orizzontali</li><li>Sfondo bianco, tipografia Times New Roman</li></ul>



<h3 class="wp-block-heading">Dopo</h3>



<ul class="wp-block-list"><li>Logo piccolo in alto a sinistra, 3 voci di menu contestuali</li><li>Singola immagine statica o video loop di 8 secondi, mai slider</li><li>Hero text specifico: &quot;Triplichi le conversioni del tuo e-commerce in 90 giorni, senza aumentare il traffico&quot;</li><li>CTA primario ben visibile: &quot;Prenota una call gratuita di 30 minuti&quot;</li><li>Tipografia sans-serif moderna (Inter, Söhne, GT America)</li></ul>



<h3 class="wp-block-heading">Metrica di successo</h3>



<p class="wp-block-paragraph">Tasso di conversione della homepage: la differenza tra un sito mediocre e uno ottimizzato è di 3-10 volte. Un e-commerce con tasso di conversione dello 0,5% può arrivare al 2-5% solo con l&#x27;ottimizzazione della homepage.</p>



<h3 class="wp-block-heading">Perché il 90% la ignora</h3>



<p class="wp-block-paragraph">Perché i clienti giudicano il sito dal numero di sezioni e dal design &quot;bello da vedere&quot;, non dai risultati. Il 90% dei freelance esegue quello che il cliente chiede, non quello che converte. La formazione del cliente sull&#x27;importanza del conversion-focused design è la prima cosa da fare.</p>



<h2 class="wp-block-heading">Legge 2: Un&#x27;unica CTA per schermata, ripetuta con intelligenza</h2>



<p class="wp-block-paragraph">Il tasto &quot;acquista ora&quot; o &quot;contattaci&quot; deve essere una scelta consapevole in ogni schermata. Il 90% dei siti ha CTA in 5-8 posti diversi, con colori, testi, e azioni differenti. L&#x27;utente è paralizzato dalla scelta e finisce per non cliccare nulla.</p>



<h3 class="wp-block-heading">Prima</h3>



<ul class="wp-block-list"><li>Bottone verde in alto a destra (&quot;Contattaci&quot;)</li><li>Bottone blu al centro (&quot;Scopri di più&quot;)</li><li>Bottone arancione in fondo (&quot;Iscriviti alla newsletter&quot;)</li><li>Bottone rosso in sidebar (&quot;Acquista&quot;)</li><li>Bottone nero nel footer (&quot;Lavora con noi&quot;)</li></ul>



<h3 class="wp-block-heading">Dopo</h3>



<ul class="wp-block-list"><li>Un unico colore per il CTA primario (es. verde)</li><li>Un&#x27;azione chiara ripetuta in 3-4 posizioni strategiche (fine hero, fine di ogni sezione di contenuto, footer)</li><li>Testo del bottone orientato al valore: non &quot;Invia&quot; ma &quot;Prenota la tua call gratuita&quot;</li><li>Azioni secondarie (newsletter, login) in stile testuale, senza competere per attenzione</li></ul>



<h3 class="wp-block-heading">Metrica di successo</h3>



<p class="wp-block-paragraph">Click-through rate del CTA primario: la differenza tra sito mediocre e ottimizzato è 2-4 volte. Su 10.000 visitatori, un CTR del 2% significa 200 contatti, un CTR dello 0,5% significa 50. Lo stesso traffico, risultato quadruplicato.</p>



<h3 class="wp-block-heading">Perché il 90% la ignora</h3>



<p class="wp-block-paragraph">Perché la moltiplicazione dei CTA sembra &quot;dare più opzioni&quot; all&#x27;utente, e sembra quindi più democratica. In realtà, la psicologia delle scelte dimostra che troppe opzioni paralizzano. La regola è: una decisione principale per pagina, con la CTA che guida l&#x27;utente verso quella decisione.</p>



<h2 class="wp-block-heading">Legge 3: La tipografia fa il 60% del lavoro visivo</h2>



<p class="wp-block-paragraph">La maggior parte dei siti web economici usa tipografie di sistema (Arial, Times New Roman, Helvetica di default) o font generici Google Fonts (Open Sans, Roboto, Lato) senza personalizzazione. La tipografia è la prima cosa che l&#x27;occhio registra, e un font ben scelto e ben impostato può trasformare un design mediocre in uno professionale con il solo cambio del font.</p>



<h3 class="wp-block-heading">Prima</h3>



<ul class="wp-block-list"><li>Open Sans 16px per il body</li><li>Open Sans Bold 24px per i titoli</li><li>Interlinea 1.4, allineamento justified</li><li>Nessuna gerarchia visiva</li></ul>



<h3 class="wp-block-heading">Dopo</h3>



<ul class="wp-block-list"><li>Inter o Söhne 16-18px per il body, con line-height 1.6</li><li>Stesso font, weight 600, 32-40px per H1, 24-28px per H2</li><li>Allineamento a sinistra (no giustificato che crea fiumi bianchi)</li><li>Scala tipografica con 5-6 livelli definiti (H1, H2, H3, body, small)</li><li>Tracking e kerning ottimizzati per la leggibilità</li></ul>



<h3 class="wp-block-heading">Metrica di successo</h3>



<p class="wp-block-paragraph">Tempo medio di permanenza sulla pagina: una tipografia di qualità aumenta la leggibilità del 30-50%, e l&#x27;utente resta più a lungo. Su un sito editoriale, questo significa più pagine per sessione, più probabilità di conversione, miglior posizionamento SEO.</p>



<h3 class="wp-block-heading">Perché il 90% la ignora</h3>



<p class="wp-block-paragraph">Perché la tipografia è invisibile quando funziona e molto visibile quando non funziona. Il cliente non sa che il sito è brutto per via del font, lo sa che &quot;non è professionale&quot;. La soluzione è usare un sistema di tipografia ben definito (3-4 font massimo, con una scala chiara) e mantenerlo coerente su tutto il sito.</p>



<h2 class="wp-block-heading">Legge 4: Il bianco è il colore più importante</h2>



<p class="wp-block-paragraph">Un errore classico dei siti economici è riempire ogni spazio con contenuti, immagini, o elementi decorativi. Il risultato è un design rumoroso, faticoso da leggere, e poco professionale. Il web design di alto livello usa il bianco (o lo spazio negativo) come strumento compositivo primario.</p>



<h3 class="wp-block-heading">Prima</h3>



<ul class="wp-block-list"><li>Sidebar sinistra piena di widget, banner, social</li><li>Sidebar destra con &quot;articoli recenti&quot;, &quot;tag cloud&quot;, &quot;categorie&quot;</li><li>Contenuto principale compresso in 600px centrali</li><li>Margini ridotti al minimo</li><li>Footer con 4 colonne di link</li></ul>



<h3 class="wp-block-heading">Dopo</h3>



<ul class="wp-block-list"><li>Nessuna sidebar, contenuto principale a tutta larghezza</li><li>Spazio verticale generoso tra le sezioni (80-120px)</li><li>Margini interni dei contenuti aumentati del 50%</li><li>Footer con 2-3 colonne essenziali, molto spazio</li><li>Sezioni con sfondo alternato (bianco / grigio chiaro) per separare visivamente</li></ul>



<h3 class="wp-block-heading">Metrica di successo</h3>



<p class="wp-block-paragraph">Perceived quality: utenti diversi, dati gli stessi contenuti, percepiscono un sito con spazi generosi come 3-5 volte più professionale di uno compresso. Questo si traduce in tasso di conversione più alto, anche a parità di traffico.</p>



<h3 class="wp-block-heading">Perché il 90% la ignora</h3>



<p class="wp-block-paragraph">Perché il cliente vuole &quot;tanto contenuto in ogni schermata&quot;, e il freelance asseconda. Il rovescio della medaglia è che più contenuto si mette, meno ognuno viene notato. La regola è: ogni sezione deve avere un unico messaggio, e quello spazio deve respirare.</p>



<h2 class="wp-block-heading">Legge 5: Le immagini devono essere specifiche, mai generiche</h2>



<p class="wp-block-paragraph">La differenza tra un sito economico e uno professionale si vede nelle immagini. Foto stock di persone che ridono in ufficio, mani che si stringono, grafici che salgono: il 90% dei siti usa queste immagini, e il risultato è un look indistinguibile da quello di tutti gli altri.</p>



<h3 class="wp-block-heading">Prima</h3>



<ul class="wp-block-list"><li>Foto stock di una squadra felice in ufficio</li><li>Foto stock di una donna che usa un laptop</li><li>Foto stock di una stretta di mano</li><li>Foto stock di un grafico con freccia in su</li><li>Icone generiche (foglio Word, telefono, indirizzo)</li></ul>



<h3 class="wp-block-heading">Dopo</h3>



<ul class="wp-block-list"><li>Foto reali del team, del prodotto, o del servizio (anche scattate con smartphone, vanno bene se ben composte)</li><li>Foto del processo di lavoro, dietro le quinte</li><li>Screenshot reali del prodotto o del software, mai mockup stock</li><li>Icone custom disegnate per il brand, in stile coerente</li><li>Per e-commerce, foto prodotto su sfondo neutro, con più viste e dettagli</li></ul>



<h3 class="wp-block-heading">Metrica di successo</h3>



<p class="wp-block-paragraph">Trust: le immagini stock generiche riducono la fiducia del visitatore del 20-30% rispetto a immagini reali. Su un e-commerce, la differenza tra foto stock e foto prodotto di qualità può essere del 15-25% in tasso di conversione.</p>



<h3 class="wp-block-heading">Perché il 90% la ignora</h3>



<p class="wp-block-paragraph">Perché le foto stock sono &quot;gratis&quot; (o poco costose) e &quot;bello da vedere&quot;, e il cliente le preferisce a foto reali che richiederebbero un fotografo o un investimento in shooting dedicato. La soluzione è educare il cliente sul ROI delle immagini specifiche e, quando il budget non c&#x27;è, usare foto stock di alta qualità (Unsplash, Pexels curate) ma sempre contestualizzate al messaggio.</p>



<h2 class="wp-block-heading">Legge 6: La velocità è un design feature</h2>



<p class="wp-block-paragraph">Un sito lento non è un sito con un problema tecnico: è un sito con un problema di design. La differenza tra un sito che carica in 1 secondo e uno che carica in 5 secondi è la differenza tra un utente che converte e uno che se ne va. La velocità va progettata, non corretta dopo.</p>



<h3 class="wp-block-heading">Prima</h3>



<ul class="wp-block-list"><li>15 plugin attivi, di cui 8 caricati su ogni pagina</li><li>Immagini non ottimizzate, 2-5MB ciascuna</li><li>Font Google Fonts caricati con 6 pesi inutilizzati</li><li>JavaScript sincrono che blocca il rendering</li><li>Nessuna cache, ogni richiesta genera 30+ query database</li></ul>



<h3 class="wp-block-heading">Dopo</h3>



<ul class="wp-block-list"><li>Massimo 15-20 plugin, caricati solo dove servono (conditional loading)</li><li>Immagini WebP/AVIF, 100-300KB ciascuna, dimensioni corrette</li><li>2 pesi font (regular e bold) caricati con display=swap</li><li>JavaScript differito, CSS critico inline</li><li>Hosting gestito con cache server, CDN globale, HTTP/3</li></ul>



<h3 class="wp-block-heading">Metrica di successo</h3>



<p class="wp-block-paragraph">Largest Contentful Paint (LCP) sotto 2.5 secondi, Interaction to Next Paint (INP) sotto 200ms, Cumulative Layout Shift (CLS) sotto 0.1. Questi sono i Core Web Vitals che Google usa per il ranking SEO dal 2021.</p>



<h3 class="wp-block-heading">Perché il 90% la ignora</h3>



<p class="wp-block-paragraph">Perché la velocità è invisibile in fase di progettazione: il cliente vede il sito sul suo Mac con fibra ottica e lo percepisce come veloce. Solo quando va in produzione, su mobile 4G, il problema emerge. La soluzione è testare il sito su Lighthouse e PageSpeed Insights prima della consegna, e richiedere un budget di ottimizzazione performance come parte del progetto.</p>



<h2 class="wp-block-heading">Legge 7: Il design mobile-first non è una feature, è un vincolo</h2>



<p class="wp-block-paragraph">Il 65% del traffico web globale è da mobile. Progettare per desktop e adattare a mobile è sbagliato: il sito mobile non è una versione ridotta, è il sito. La versione desktop è il bonus.</p>



<h3 class="wp-block-heading">Prima</h3>



<ul class="wp-block-list"><li>Progetto iniziato da desktop a 1440px</li><li>Elementi compressi su mobile per mancanza di spazio</li><li>Menu hamburger con 12 voci tutte nello stesso ordine</li><li>Form con campi affiancati che su mobile diventano illeggibili</li><li>Tabelle desktop mostrate male su mobile</li></ul>



<h3 class="wp-block-heading">Dopo</h3>



<ul class="wp-block-list"><li>Progetto iniziato da mobile a 375px</li><li>Layout a colonna singola, elementi full-width</li><li>Menu contestuale, massimo 4-5 voci principali</li><li>Form a colonna singola, campi ben distanziati (altezza minima 44px per touch)</li><li>Tabelle trasformate in card stack su mobile</li></ul>



<h3 class="wp-block-heading">Metrica di successo</h3>



<p class="wp-block-paragraph">Mobile usability score in Google Search Console: deve essere al 100% per tutte le paghe. Conversion rate mobile vs. desktop: per un e-commerce ben progettato mobile-first, il tasso mobile può essere superiore al desktop.</p>



<h3 class="wp-block-heading">Perché il 90% la ignora</h3>



<p class="wp-block-paragraph">Perché i designer lavorano su schermi grandi e tendono a progettare per l&#x27;ambiente che li circonda. Inoltre, i clienti spesso chiedono prima la versione desktop perché &quot;è più facile giudicare il design&quot;. La soluzione è imporre il mobile-first come metodo di lavoro, e mostrare al cliente entrambe le versioni ad ogni review.</p>



<h2 class="wp-block-heading">Legge 8: L&#x27;accessibilità è un moltiplicatore, non un costo</h2>



<p class="wp-block-paragraph">Un sito accessibile non è solo etico o un obbligo di legge (in Italia la Legge Stanca lo richiede per i siti della PA, in Europa l&#x27;European Accessibility Act 2025 lo estende a molti settori privati). È anche un moltiplicatore di risultati: il 15-20% della popolazione ha qualche forma di disabilità, e un sito non accessibile esclude automaticamente questa fetta di utenti.</p>



<h3 class="wp-block-heading">Prima</h3>



<ul class="wp-block-list"><li>Contrasto insufficiente (testo grigio su sfondo bianco)</li><li>Bottoni con etichette vaghe (&quot;clicca qui&quot;, &quot;scopri&quot;)</li><li>Form senza label espliciti, solo placeholder</li><li>Video senza sottotitoli</li><li>Navigazione impossibile da tastiera</li></ul>



<h3 class="wp-block-heading">Dopo</h3>



<ul class="wp-block-list"><li>Contrasto WCAG AA minimo (4.5:1 per testo normale)</li><li>Bottoni con etichette descrittive (&quot;Scarica la guida PDF&quot;, &quot;Prenota la consulenza&quot;)</li><li>Form con label sempre visibili, errori espliciti, focus visibile</li><li>Video con sottotitoli e trascrizione</li><li>Skip link, focus order corretto, ARIA labels dove necessario</li></ul>



<h3 class="wp-block-heading">Metrica di successo</h3>



<p class="wp-block-paragraph">Lighthouse Accessibility score sopra 95. Numero di errori in WAVE (Web Accessibility Evaluation Tool) pari a zero per le pagine principali. Per un e-commerce, l&#x27;accessibilità migliora la SEO (Google premia i siti accessibili) e aumenta la base di clienti raggiungibili del 15-20%.</p>



<h3 class="wp-block-heading">Perché il 90% la ignora</h3>



<p class="wp-block-paragraph">Perché l&#x27;accessibilità è percepita come costo aggiuntivo e come &quot;roba da avvocati&quot;. In realtà, integrare l&#x27;accessibilità fin dall&#x27;inizio del progetto costa poco (5-10% del budget) e retrofit dopo è costoso (30-50% del budget). La regola è: accessibilità come vincolo di progetto dal primo giorno, non come attività finale.</p>



<h2 class="wp-block-heading">Legge 9: Ogni pagina deve avere un unico obiettivo misurabile</h2>



<p class="wp-block-paragraph">La differenza tra un sito da 500€ e uno da 50.000€ si vede nella chiarezza degli obiettivi. Un sito economico ha pagine che &quot;presentano l&#x27;azienda&quot; in modo generico. Un sito professionale ha pagine con un obiettivo specifico e misurabile: contatto, download, acquisto, registrazione, visualizzazione di un video.</p>



<h3 class="wp-block-heading">Prima</h3>



<ul class="wp-block-list"><li>Homepage: &quot;benvenuti, chi siamo&quot;</li><li>Chi siamo: storia dell&#x27;azienda, valori, mission</li><li>Servizi: descrizione generica dei servizi offerti</li><li>Contattaci: form generico + mappa + indirizzo</li><li>Nessuna misurazione del successo</li></ul>



<h3 class="wp-block-heading">Dopo</h3>



<ul class="wp-block-list"><li>Homepage: 1 CTA (contatto), 1 obiettivo (generare lead qualificati)</li><li>Chi siamo: 1 CTA (contatto), 1 obiettivo (costruire fiducia per la conversione)</li><li>Servizi: 1 CTA per servizio (preventivo, demo, call), obiettivo diverso per pagina</li><li>Case study: 1 CTA (contatto), 1 obiettivo (dimostrare expertise)</li><li>Blog: nessun CTA aggressivo, obiettivo (SEO, lead nurturing, educazione)</li><li>Ogni pagina ha KPI misurato con GA4 e heatmap</li></ul>



<h3 class="wp-block-heading">Metrica di successo</h3>



<p class="wp-block-paragraph">Per ogni pagina, almeno un KPI: tasso di conversione, tempo medio, scroll depth, micro-conversioni. Un sito professionale sa dire &quot;questa pagina converte al 4,2%, voglio portarlo al 6% nei prossimi 3 mesi&quot;. Un sito economico non sa dire nulla di tutto ciò.</p>



<h3 class="wp-block-heading">Perché il 90% la ignora</h3>



<p class="wp-block-paragraph">Perché richiede un cambio di mentalità da &quot;sito come brochure&quot; a &quot;sito come strumento di business&quot;. I freelance che fanno siti da 500€ non hanno le competenze (o la volontà) di impostare analytics avanzati, definire funnel, e misurare i risultati. La soluzione è offrire ai clienti un servizio di CRO (Conversion Rate Optimization) continuativo, che diventa una fonte di reddito ricorrente.</p>



<h2 class="wp-block-heading">Le 9 leggi in sintesi: il framework operativo</h2>



<p class="wp-block-paragraph">Le 9 leggi possono essere condensate in un framework operativo in 5 punti, applicabile a qualsiasi progetto:</p>



<ol class="wp-block-list"><li><strong>Prima misura, poi progetta</strong>: prima di disegnare, definisci gli obiettivi di business e gli KPI. Se non sai cosa misurare, non sai cosa ottimizzare.</li><li><strong>Poi semplifica</strong>: ogni pagina ha un obiettivo, una CTA, un messaggio. Se una sezione non serve, toglila.</li><li><strong>Tipografia e spazio bianco</strong>: imposta questi due elementi con cura, e il 60% del design è fatto.</li><li><strong>Mobile-first</strong>: parti da 375px, scala verso l&#x27;alto, non il contrario.</li><li><strong>Test, misura, itera</strong>: dopo il lancio, monitora le metriche e ottimizza continuamente.</li></ol>



<h2 class="wp-block-heading">Come applicare le 9 leggi al tuo prossimo progetto</h2>



<p class="wp-block-paragraph">Un metodo pratico per integrare queste leggi in qualsiasi progetto, dal primo brief alla consegna finale.</p>



<h3 class="wp-block-heading">Prima del progetto: brief e obiettivi</h3>



<ol class="wp-block-list"><li>Chiedi al cliente: &quot;Qual è l&#x27;azione più importante che un visitatore dovrebbe fare sul tuo sito?&quot;</li><li>Chiedi: &quot;Come misurerai il successo di questo sito nei prossimi 6 mesi?&quot;</li><li>Definisci 3-5 KPI misurabili e i loro target numerici</li></ol>



<h3 class="wp-block-heading">Durante il progetto: design e sviluppo</h3>



<ol class="wp-block-list"><li>Mobile-first, sempre</li><li>Una CTA per schermata, una gerarchia tipografica chiara</li><li>Spazio bianco generoso, immagini specifiche</li><li>Performance integrata nel processo, non aggiunta alla fine</li><li>Accessibilità come vincolo, non come checklist finale</li></ol>



<h3 class="wp-block-heading">Dopo il lancio: ottimizzazione continua</h3>



<ol class="wp-block-list"><li>Monitora GA4 + Search Console + Hotjar o Microsoft Clarity</li><li>A/B test su CTA, hero, form, pagine di servizio</li><li>Aggiorna contenuti trimestralmente, design annualmente</li><li>Report trimestrale al cliente con numeri e prossime azioni</li></ol>



<h2 class="wp-block-heading">Domande frequenti</h2>



<h3 class="wp-block-heading">Queste leggi funzionano per qualsiasi tipo di sito?</h3>



<p class="wp-block-paragraph">Sì, con adattamenti. Le 9 leggi sono state distillate su e-commerce, siti corporate, blog editoriali, SaaS, e portali. Il framework è universale, l&#x27;applicazione specifica varia per settore. Per un e-commerce, le leggi 2, 4, 6 sono critiche. Per un SaaS, le leggi 1, 5, 9 sono critiche. Per un blog editoriale, le leggi 3, 6, 7 sono critiche.</p>



<h3 class="wp-block-heading">Quanto costa applicare tutte le 9 leggi?</h3>



<p class="wp-block-paragraph">Per un sito da 5.000-10.000€ di budget, le 9 leggi sono applicabili con poco overhead. Per un sito da 1.000-2.000€ di budget, alcune leggi richiedono compromessi: si può usare un template premium ben fatto invece di design custom, o foto stock di alta qualità invece di shooting dedicati. La qualità del risultato dipende dalla coerenza con cui le leggi sono applicate, non dal budget assoluto.</p>



<h3 class="wp-block-heading">Un cliente può applicare le 9 leggi da solo?</h3>



<p class="wp-block-paragraph">In parte sì, ma il valore aggiunto di un professionista è enorme. Le leggi 1, 2, 9 richiedono competenze di strategia e marketing. Le leggi 3, 4, 5 richiedono competenze di design. Le leggi 6, 7, 8 richiedono competenze tecniche. Un professionista esperto le integra tutte, un cliente fai-da-te di solito ne trascura 3-4.</p>



<h3 class="wp-block-heading">Le 9 leggi cambieranno nel 2027?</h3>



<p class="wp-block-paragraph">Alcune sì, altre sono stabili. Le leggi 3 (tipografia), 4 (spazio bianco), 5 (immagini specifiche), 8 (accessibilità) sono abbastanza stabili nel tempo. Le leggi 1 (CTA), 2 (CTA singola), 9 (obiettivi misurabili) evolvono con i pattern di interazione (es. voice UI, interfacce conversazionali). Le leggi 6 (velocità), 7 (mobile-first) evolvono con la tecnologia (es. 5G, AI integrata nel browser).</p>



<h3 class="wp-block-heading">Cosa distingue un web designer professionista da uno improvvisato?</h3>



<p class="wp-block-paragraph">L&#x27;applicazione coerente di queste 9 leggi, unita alla capacità di spiegarle al cliente e di difendere le scelte di design anche quando sembrano controintuitive. Il professionista è pagato per il giudizio, non per il numero di schermate prodotte.</p>



<h2 class="wp-block-heading">Riferimenti ufficiali</h2>



<p class="wp-block-paragraph">Per approfondire i temi toccati in questa guida, ecco le fonti primarie consultate e raccomandate.</p>



<ul class="wp-block-list"><li><a href="https://developer.chrome.com/docs/lighthouse/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">Lighthouse</a> - auditing performance e accessibilità.</li><li><a href="https://web.dev/vitals/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">Web Vitals</a> - metriche Google per il web.</li><li><a href="https://www.w3.org/TR/WCAG22/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">WCAG 2.2</a> - standard accessibilità W3C.</li><li><a href="https://wave.webaim.org/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">WAVE</a> - valutatore accessibilità.</li><li><a href="https://www.hotjar.com/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">Hotjar</a> - heatmap e registrazioni sessioni.</li><li><a href="https://clarity.microsoft.com/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">Microsoft Clarity</a> - alternativa gratuita a Hotjar.</li><li><a href="https://analytics.google.com/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">Google Analytics 4</a> - analytics web.</li><li><a href="https://search.google.com/search-console/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">Google Search Console</a> - monitoraggio SEO.</li><li><a href="https://stripe.com/recipes/an-elegant-puzzle" target="_blank" rel="noopener nofollow external" data-wpel-link="external">Stripe Press - An Elegant Puzzle</a> - libro su sistemi e design di prodotto.</li><li><a href="https://www.refactoringui.com/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">Refactoring UI</a> - libro pratico su web design.</li><li><a href="https://www.mrtux.it/strumenti-grafica-web-2026-sistemi-design-agentici" data-wpel-link="internal" target="_self" rel="noopener">Strumenti grafica web 2026 mrtux.it</a> - tool design 2026.</li><li><a href="https://www.mrtux.it/workflow-perfetto-tool-sviluppo-web" data-wpel-link="internal" target="_self" rel="noopener">Workflow perfetto sviluppo web mrtux.it</a> - framework 7 stadi.</li></ul>



<p class="wp-block-paragraph">Questa guida è un manifesto editoriale: verrà aggiornata annualmente con nuove leggi e con l&#x27;evoluzione di quelle esistenti. Per suggerimenti o correzioni, l&#x27;area commenti è aperta.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.mrtux.it/web-design-2026-9-leggi-sito/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>WooCommerce Plugin Development 2026: Aumenta le Vendite del 40% con Codice Custom</title>
		<link>https://www.mrtux.it/woocommerce-plugin-development-2026-aumenta-le-vendite-del-40-con-codice-custom</link>
					<comments>https://www.mrtux.it/woocommerce-plugin-development-2026-aumenta-le-vendite-del-40-con-codice-custom#respond</comments>
		
		<dc:creator><![CDATA[Emilio Petrozzi]]></dc:creator>
		<pubDate>Thu, 09 Apr 2026 22:15:08 +0000</pubDate>
				<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[conversion-optimization]]></category>
		<category><![CDATA[E-commerce]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[plugin-development]]></category>
		<category><![CDATA[woocommerce]]></category>
		<guid isPermaLink="false">https://www.mrtux.it/woocommerce-plugin-development-2026-aumenta-le-vendite-del-40-con-codice-custom</guid>

					<description><![CDATA[WooCommerce Plugin Development: Come Aumentare le Vendite del 40% con Codice Custom Tempo di lettura: 12 minuti Se gestisci uno store WooCommerce o sviluppi per clienti e-commerce, sai che la differenza tra un sito che converte e uno che stenta sta spesso nei dettagli. I plugin del marketplace offrono funzionalità generiche, ma quando serve qualcosa [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>WooCommerce Plugin Development: Come Aumentare le Vendite del 40% con Codice Custom</h1>
<p><strong>Tempo di lettura: 12 minuti</strong></p>
<p>Se gestisci uno store WooCommerce o sviluppi per clienti e-commerce, sai che la differenza tra un sito che converte e uno che stenta sta spesso nei dettagli. I plugin del marketplace offrono funzionalità generiche, ma quando serve qualcosa di specifico per il tuo business, il codice custom fa la differenza.</p>
<p>In questa guida ti mostrerò come sviluppare plugin WooCommerce personalizzati che possono aumentare le conversioni fino al 40%, con esempi di codice pronto all'uso che puoi implementare oggi stesso.</p>
<h2>Perché Sviluppare Plugin Custom per WooCommerce</h2>
<p>Il marketplace WooCommerce conta oltre 6.000 estensioni, ma c'è un problema: sono pensati per il mercato di massa. Quando hai bisogno di:</p>
<ul>
<li>Integrazioni con sistemi proprietari italiani (fatturazione, corrieri locali)</li>
<li>Logiche di pricing complesse (sconti per regione, B2B tier)</li>
<li>Checkout personalizzati per il tuo settore</li>
<li>Automazioni specifiche per il tuo flusso di lavoro</li>
</ul>
<p>...il codice custom diventa non solo conveniente, ma necessario.</p>
<p><strong>I numeri parlano chiaro:</strong></p>
<ul>
<li>Gli store con checkout personalizzati vedono un <strong>+35% di completamento ordini</strong></li>
<li>I sistemi di upsell intelligenti aumentano l'AOV (Average Order Value) del <strong>20-40%</strong></li>
<li>Le notifiche personalizzate riducono i carrelli abbandonati del <strong>15-25%</strong></li>
</ul>
<hr />
<h2>Esempio 1: Upsell Intelligente nel Carrello</h2>
<p>Uno dei modi più efficaci per aumentare il valore medio dell'ordine è suggerire prodotti complementari nel carrello. Ecco un plugin che lo fa automaticamente:</p>
<pre><code class="language-php">&lt;?php
/**
 * Plugin Name: Smart Cart Upsell
 * Description: Suggerisce prodotti complementari nel carrello
 * Version: 1.0.0
 * Author: Tuo Nome
 */

if (!defined(&#039;ABSPATH&#039;)) {
    exit;
}

class Smart_Cart_Upsell {

    public function __construct() {
        add_action(&#039;woocommerce_cart_collaterals&#039;, [$this, &#039;show_upsell_products&#039;], 5);
        add_action(&#039;wp_enqueue_scripts&#039;, [$this, &#039;enqueue_styles&#039;]);
    }

    /**
     * Trova prodotti correlati basati sulle categorie del carrello
     */
    private function get_upsell_products() {
        $cart = WC()-&gt;cart;
        if ($cart-&gt;is_empty()) {
            return [];
        }

        // Raccogli categorie dal carrello
        $categories = [];
        foreach ($cart-&gt;get_cart() as $item) {
            $product_cats = wp_get_post_terms(
                $item[&#039;product_id&#039;], 
                &#039;product_cat&#039;, 
                [&#039;fields&#039; =&gt; &#039;ids&#039;]
            );
            $categories = array_merge($categories, $product_cats);
        }

        // Trova prodotti nelle stesse categorie, non nel carrello
        $cart_ids = array_column($cart-&gt;get_cart(), &#039;product_id&#039;);

        $args = [
            &#039;post_type&#039; =&gt; &#039;product&#039;,
            &#039;posts_per_page&#039; =&gt; 3,
            &#039;post__not_in&#039; =&gt; $cart_ids,
            &#039;tax_query&#039; =&gt; [
                [
                    &#039;taxonomy&#039; =&gt; &#039;product_cat&#039;,
                    &#039;field&#039; =&gt; &#039;term_id&#039;,
                    &#039;terms&#039; =&gt; array_unique($categories),
                ]
            ],
            &#039;meta_query&#039; =&gt; [
                [
                    &#039;key&#039; =&gt; &#039;_stock_status&#039;,
                    &#039;value&#039; =&gt; &#039;instock&#039;
                ]
            ],
            &#039;orderby&#039; =&gt; &#039;rand&#039;
        ];

        return wc_get_products($args);
    }

    /**
     * Mostra i prodotti upsell nel carrello
     */
    public function show_upsell_products() {
        $upsells = $this-&gt;get_upsell_products();

        if (empty($upsells)) {
            return;
        }

        echo &#039;&lt;div class=&quot;cart-upsell&quot;&gt;&#039;;
        echo &#039;&lt;h3&gt;&#039; . __(&#039;Potrebbe interessarti anche...&#039;, &#039;smart-upsell&#039;) . &#039;&lt;/h3&gt;&#039;;
        echo &#039;&lt;ul class=&quot;upsell-products&quot;&gt;&#039;;

        foreach ($upsells as $product) {
            $price = $product-&gt;get_price_html();
            $image = $product-&gt;get_image(&#039;thumbnail&#039;);
            $link = $product-&gt;get_permalink();

            echo &#039;&lt;li class=&quot;upsell-item&quot;&gt;&#039;;
            echo &#039;&lt;a href=&quot;&#039; . esc_url($link) . &#039;&quot;&gt;&#039;;
            echo $image;
            echo &#039;&lt;span class=&quot;upsell-title&quot;&gt;&#039; . esc_html($product-&gt;get_name()) . &#039;&lt;/span&gt;&#039;;
            echo &#039;&lt;span class=&quot;upsell-price&quot;&gt;&#039; . $price . &#039;&lt;/span&gt;&#039;;
            echo &#039;&lt;/a&gt;&#039;;
            echo &#039;&lt;/li&gt;&#039;;
        }

        echo &#039;&lt;/ul&gt;&lt;/div&gt;&#039;;
    }

    /**
     * Carica gli stili CSS
     */
    public function enqueue_styles() {
        if (is_cart()) {
            wp_add_inline_style(&#039;woocommerce-general&#039;, &#039;
                .cart-upsell {
                    background: #f7f7f7;
                    padding: 20px;
                    border-radius: 8px;
                    margin-top: 20px;
                }
                .cart-upsell h3 {
                    margin-bottom: 15px;
                    color: #333;
                }
                .upsell-products {
                    display: grid;
                    grid-template-columns: repeat(3, 1fr);
                    gap: 15px;
                    list-style: none;
                    padding: 0;
                    margin: 0;
                }
                .upsell-item img {
                    width: 100%;
                    height: auto;
                    border-radius: 4px;
                }
                .upsell-title {
                    display: block;
                    font-weight: 600;
                    margin-top: 8px;
                    color: #333;
                }
                .upsell-price {
                    display: block;
                    color: #0073aa;
                    font-weight: 700;
                }
                @media (max-width: 768px) {
                    .upsell-products {
                        grid-template-columns: 1fr;
                    }
                }
            &#039;);
        }
    }
}

new Smart_Cart_Upsell();</code></pre>
<h3>Come Funziona</h3>
<ol>
<li>Analizza le categorie dei prodotti nel carrello</li>
<li>Cerca prodotti correlati non ancora nel carrello</li>
<li>Mostra 3 suggerimenti con immagine, nome e prezzo</li>
<li>Design responsive per mobile</li>
</ol>
<p><strong>Risultato atteso:</strong> +15-25% AOV (Average Order Value)</p>
<hr />
<h2>Esempio 2: Notifiche Stock Personalizzate</h2>
<p>Le notifiche &quot;torna in stock&quot; native di WooCommerce sono limitate. Questo plugin aggiunge notifiche automatiche con email personalizzate e SMS opzionali:</p>
<pre><code class="language-php">&lt;?php
/**
 * Plugin Name: Advanced Stock Notifications
 * Description: Notifiche stock avanzate con email e SMS
 * Version: 1.0.0
 */

if (!defined(&#039;ABSPATH&#039;)) {
    exit;
}

class Advanced_Stock_Notifications {

    private $option_name = &#039;asn_settings&#039;;

    public function __construct() {
        // Form registrazione
        add_action(&#039;woocommerce_simple_add_to_cart&#039;, [$this, &#039;show_waitlist_form&#039;], 31);
        add_action(&#039;woocommerce_variation_add_to_cart&#039;, [$this, &#039;show_waitlist_form&#039;], 31);

        // Gestione AJAX
        add_action(&#039;wp_ajax_asn_subscribe&#039;, [$this, &#039;ajax_subscribe&#039;]);
        add_action(&#039;wp_ajax_nopriv_asn_subscribe&#039;, [$this, &#039;ajax_subscribe&#039;]);

        // Notifica quando torna in stock
        add_action(&#039;woocommerce_product_set_stock_status&#039;, [$this, &#039;notify_waitlist&#039;], 10, 2);

        // Admin settings
        add_action(&#039;admin_menu&#039;, [$this, &#039;add_admin_menu&#039;]);
        add_action(&#039;admin_init&#039;, [$this, &#039;register_settings&#039;]);
    }

    /**
     * Mostra form di registrazione waitlist
     */
    public function show_waitlist_form() {
        global $product;

        if (!$product || $product-&gt;is_in_stock()) {
            return;
        }

        wp_nonce_field(&#039;asn_subscribe&#039;, &#039;asn_nonce&#039;);
        ?&gt;
        &lt;div class=&quot;asn-waitlist&quot; id=&quot;asn-form&quot;&gt;
            &lt;p class=&quot;out-of-stock-message&quot;&gt;
                &lt;strong&gt;&lt;?php _e(&#039;Prodotto esaurito&#039;, &#039;asn&#039;); ?&gt;&lt;/strong&gt;
            &lt;/p&gt;
            &lt;p&gt;&lt;?php _e(&#039;Vuoi essere avvisato quando torna disponibile?&#039;, &#039;asn&#039;); ?&gt;&lt;/p&gt;

            &lt;div class=&quot;asn-form&quot;&gt;
                &lt;input type=&quot;email&quot; 
                       id=&quot;asn-email&quot; 
                       placeholder=&quot;&lt;?php esc_attr_e(&#039;La tua email&#039;, &#039;asn&#039;); ?&gt;&quot;
                       required&gt;
                &lt;input type=&quot;tel&quot; 
                       id=&quot;asn-phone&quot; 
                       placeholder=&quot;&lt;?php esc_attr_e(&#039;Cellulare (opzionale)&#039;, &#039;asn&#039;); ?&gt;&quot;&gt;
                &lt;input type=&quot;hidden&quot; id=&quot;asn-product-id&quot; value=&quot;&lt;?php echo $product-&gt;get_id(); ?&gt;&quot;&gt;
                &lt;button type=&quot;button&quot; id=&quot;asn-submit&quot; class=&quot;button alt&quot;&gt;
                    &lt;?php _e(&#039;Avvisami&#039;, &#039;asn&#039;); ?&gt;
                &lt;/button&gt;
            &lt;/div&gt;

            &lt;div id=&quot;asn-message&quot;&gt;&lt;/div&gt;
        &lt;/div&gt;

        &lt;style&gt;
            .asn-waitlist {
                background: #fff3cd;
                padding: 20px;
                border-radius: 8px;
                margin: 20px 0;
            }
            .asn-form {
                display: flex;
                flex-wrap: wrap;
                gap: 10px;
                margin-top: 10px;
            }
            .asn-form input[type=&quot;email&quot;],
            .asn-form input[type=&quot;tel&quot;] {
                flex: 1;
                min-width: 200px;
                padding: 10px;
                border: 1px solid #ddd;
                border-radius: 4px;
            }
            #asn-message {
                margin-top: 10px;
                font-weight: 600;
            }
            .asn-success { color: #155724; }
            .asn-error { color: #721c24; }
        &lt;/style&gt;

        &lt;script&gt;
        jQuery(document).ready(function($) {
            $(&#039;#asn-submit&#039;).on(&#039;click&#039;, function() {
                var email = $(&#039;#asn-email&#039;).val();
                var phone = $(&#039;#asn-phone&#039;).val();
                var productId = $(&#039;#asn-product-id&#039;).val();
                var nonce = $(&#039;#asn_nonce&#039;).val();

                if (!email) {
                    $(&#039;#asn-message&#039;).html(&#039;&lt;span class=&quot;asn-error&quot;&gt;Inserisci un\&#039;email valida&lt;/span&gt;&#039;);
                    return;
                }

                $.ajax({
                    url: &#039;&lt;?php echo admin_url(&#039;admin-ajax.php&#039;); ?&gt;&#039;,
                    type: &#039;POST&#039;,
                    data: {
                        action: &#039;asn_subscribe&#039;,
                        email: email,
                        phone: phone,
                        product_id: productId,
                        nonce: nonce
                    },
                    success: function(response) {
                        if (response.success) {
                            $(&#039;#asn-message&#039;).html(&#039;&lt;span class=&quot;asn-success&quot;&gt;&#039; + response.data + &#039;&lt;/span&gt;&#039;);
                            $(&#039;#asn-submit&#039;).prop(&#039;disabled&#039;, true);
                        } else {
                            $(&#039;#asn-message&#039;).html(&#039;&lt;span class=&quot;asn-error&quot;&gt;&#039; + response.data + &#039;&lt;/span&gt;&#039;);
                        }
                    }
                });
            });
        });
        &lt;/script&gt;
        &lt;?php
    }

    /**
     * AJAX: Iscrivi alla waitlist
     */
    public function ajax_subscribe() {
        check_ajax_referer(&#039;asn_subscribe&#039;, &#039;nonce&#039;);

        $email = sanitize_email($_POST[&#039;email&#039;]);
        $phone = sanitize_text_field($_POST[&#039;phone&#039;]);
        $product_id = intval($_POST[&#039;product_id&#039;]);

        if (!is_email($email)) {
            wp_send_json_error(__(&#039;Email non valida&#039;, &#039;asn&#039;));
        }

        // Salva iscrizione
        $waitlist = get_post_meta($product_id, &#039;_asn_waitlist&#039;, true) ?: [];

        $subscription = [
            &#039;email&#039; =&gt; $email,
            &#039;phone&#039; =&gt; $phone,
            &#039;date&#039; =&gt; current_time(&#039;mysql&#039;)
        ];

        // Evita duplicati
        $exists = array_filter($waitlist, function($item) use ($email) {
            return $item[&#039;email&#039;] === $email;
        });

        if (empty($exists)) {
            $waitlist[] = $subscription;
            update_post_meta($product_id, &#039;_asn_waitlist&#039;, $waitlist);
            wp_send_json_success(__(&#039;Ti avviseremo quando il prodotto sarà disponibile!&#039;, &#039;asn&#039;));
        } else {
            wp_send_json_error(__(&#039;Sei già iscritto a questa lista&#039;, &#039;asn&#039;));
        }
    }

    /**
     * Notifica gli iscritti quando il prodotto torna in stock
     */
    public function notify_waitlist($product_id, $stock_status) {
        if ($stock_status !== &#039;instock&#039;) {
            return;
        }

        $waitlist = get_post_meta($product_id, &#039;_asn_waitlist&#039;, true);

        if (empty($waitlist)) {
            return;
        }

        $product = wc_get_product($product_id);
        $product_name = $product-&gt;get_name();
        $product_link = $product-&gt;get_permalink();

        $settings = get_option($this-&gt;option_name);
        $email_template = $settings[&#039;email_template&#039;] ?? &#039;default&#039;;

        foreach ($waitlist as $subscription) {
            $this-&gt;send_notification(
                $subscription[&#039;email&#039;],
                $subscription[&#039;phone&#039;],
                $product_name,
                $product_link,
                $email_template
            );
        }

        // Pulisci la waitlist dopo l&#039;invio
        delete_post_meta($product_id, &#039;_asn_waitlist&#039;);
    }

    /**
     * Invia notifica email/SMS
     */
    private function send_notification($email, $phone, $product_name, $product_link, $template) {
        $subject = sprintf(__(&#039;Torna in stock: %s&#039;, &#039;asn&#039;), $product_name);

        $message = sprintf(
            __(&quot;Ciao!\n\nIl prodotto %s è tornato disponibile!\n\nAcquistalo ora: %s\n\nNon aspettare, le scorte sono limitate.&quot;, &#039;asn&#039;),
            $product_name,
            $product_link
        );

        // Email
        wp_mail($email, $subject, $message);

        // SMS (se configurato e numero presente)
        if ($phone &amp;&amp; class_exists(&#039;WC_SMS&#039;)) {
            // Integrazione con gateway SMS
            do_action(&#039;asn_send_sms&#039;, $phone, $subject);
        }
    }

    /**
     * Aggiungi menu admin
     */
    public function add_admin_menu() {
        add_submenu_page(
            &#039;woocommerce&#039;,
            __(&#039;Notifiche Stock&#039;, &#039;asn&#039;),
            __(&#039;Notifiche Stock&#039;, &#039;asn&#039;),
            &#039;manage_woocommerce&#039;,
            &#039;advanced-stock-notifications&#039;,
            [$this, &#039;admin_page&#039;]
        );
    }

    /**
     * Pagina admin
     */
    public function admin_page() {
        ?&gt;
        &lt;div class=&quot;wrap&quot;&gt;
            &lt;h1&gt;&lt;?php _e(&#039;Impostazioni Notifiche Stock&#039;, &#039;asn&#039;); ?&gt;&lt;/h1&gt;
            &lt;form method=&quot;post&quot; action=&quot;options.php&quot;&gt;
                &lt;?php
                settings_fields($this-&gt;option_name);
                do_settings_sections(&#039;advanced-stock-notifications&#039;);
                submit_button();
                ?&gt;
            &lt;/form&gt;

            &lt;h2&gt;&lt;?php _e(&#039;Statistiche Waitlist&#039;, &#039;asn&#039;); ?&gt;&lt;/h2&gt;
            &lt;?php $this-&gt;show_waitlist_stats(); ?&gt;
        &lt;/div&gt;
        &lt;?php
    }

    /**
     * Mostra statistiche waitlist
     */
    private function show_waitlist_stats() {
        $args = [
            &#039;post_type&#039; =&gt; &#039;product&#039;,
            &#039;meta_key&#039; =&gt; &#039;_asn_waitlist&#039;,
            &#039;posts_per_page&#039; =&gt; 20
        ];

        $products = get_posts($args);

        if (empty($products)) {
            echo &#039;&lt;p&gt;&#039; . __(&#039;Nessuna waitlist attiva&#039;, &#039;asn&#039;) . &#039;&lt;/p&gt;&#039;;
            return;
        }

        echo &#039;&lt;table class=&quot;widefat&quot;&gt;&#039;;
        echo &#039;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Prodotto&lt;/th&gt;&lt;th&gt;Iscritti&lt;/th&gt;&lt;th&gt;Ultima iscrizione&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&#039;;

        foreach ($products as $post) {
            $waitlist = get_post_meta($post-&gt;ID, &#039;_asn_waitlist&#039;, true);
            $count = count($waitlist);
            $last = end($waitlist);

            echo &#039;&lt;tr&gt;&#039;;
            echo &#039;&lt;td&gt;&lt;a href=&quot;&#039; . get_edit_post_link($post-&gt;ID) . &#039;&quot;&gt;&#039; . esc_html($post-&gt;post_title) . &#039;&lt;/a&gt;&lt;/td&gt;&#039;;
            echo &#039;&lt;td&gt;&#039; . $count . &#039;&lt;/td&gt;&#039;;
            echo &#039;&lt;td&gt;&#039; . esc_html($last[&#039;date&#039;] ?? &#039;-&#039;) . &#039;&lt;/td&gt;&#039;;
            echo &#039;&lt;/tr&gt;&#039;;
        }

        echo &#039;&lt;/table&gt;&#039;;
    }

    /**
     * Registra impostazioni
     */
    public function register_settings() {
        register_setting($this-&gt;option_name, $this-&gt;option_name);

        add_settings_section(
            &#039;asn_main&#039;,
            __(&#039;Configurazione&#039;, &#039;asn&#039;),
            null,
            &#039;advanced-stock-notifications&#039;
        );

        add_settings_field(
            &#039;email_template&#039;,
            __(&#039;Template Email&#039;, &#039;asn&#039;),
            [$this, &#039;render_email_template_field&#039;],
            &#039;advanced-stock-notifications&#039;,
            &#039;asn_main&#039;
        );
    }

    public function render_email_template_field() {
        $settings = get_option($this-&gt;option_name);
        $value = $settings[&#039;email_template&#039;] ?? &#039;default&#039;;
        ?&gt;
        &lt;select name=&quot;&lt;?php echo $this-&gt;option_name; ?&gt;[email_template]&quot;&gt;
            &lt;option value=&quot;default&quot; &lt;?php selected($value, &#039;default&#039;); ?&gt;&gt;
                &lt;?php _e(&#039;Default&#039;, &#039;asn&#039;); ?&gt;
            &lt;/option&gt;
            &lt;option value=&quot;minimal&quot; &lt;?php selected($value, &#039;minimal&#039;); ?&gt;&gt;
                &lt;?php _e(&#039;Minimal&#039;, &#039;asn&#039;); ?&gt;
            &lt;/option&gt;
            &lt;option value=&quot;promotional&quot; &lt;?php selected($value, &#039;promotional&#039;); ?&gt;&gt;
                &lt;?php _e(&#039;Promozionale&#039;, &#039;asn&#039;); ?&gt;
            &lt;/option&gt;
        &lt;/select&gt;
        &lt;?php
    }
}

new Advanced_Stock_Notifications();</code></pre>
<h3>Funzionalità Chiave</h3>
<ul>
<li>Form AJAX senza refresh pagina</li>
<li>Iscrizione con email + telefono opzionale</li>
<li>Notifica automatica al ritorno in stock</li>
<li>Dashboard admin con statistiche</li>
<li>Template email personalizzabili</li>
</ul>
<p><strong>Risultato atteso:</strong> Recupero del 15-25% di vendite perse per out of stock</p>
<hr />
<h2>Esempio 3: Checkout Field Optimizer</h2>
<p>Un checkout troppo lungo è il nemico delle conversioni. Questo plugin ottimizza i campi in base al tipo di cliente:</p>
<pre><code class="language-php">&lt;?php
/**
 * Plugin Name: Checkout Field Optimizer
 * Description: Ottimizza i campi checkout per aumentare le conversioni
 * Version: 1.0.0
 */

if (!defined(&#039;ABSPATH&#039;)) {
    exit;
}

class Checkout_Field_Optimizer {

    public function __construct() {
        // Rimuovi campi non necessari
        add_filter(&#039;woocommerce_checkout_fields&#039;, [$this, &#039;optimize_fields&#039;]);

        // Aggiungi campo &quot;Note&quot; condizionale
        add_action(&#039;woocommerce_before_order_notes&#039;, [$this, &#039;conditional_notes_field&#039;]);

        // Validazione smart
        add_action(&#039;woocommerce_checkout_process&#039;, [$this, &#039;smart_validation&#039;]);

        // Rendi alcuni campi opzionali per B2B
        add_filter(&#039;woocommerce_default_address_fields&#039;, [$this, &#039;b2b_fields&#039;]);

        // Salva meta dati
        add_action(&#039;woocommerce_checkout_update_order_meta&#039;, [$this, &#039;save_order_meta&#039;]);

        // Admin settings
        add_action(&#039;admin_menu&#039;, [$this, &#039;add_settings&#039;]);
    }

    /**
     * Ottimizza i campi checkout
     */
    public function optimize_fields($fields) {
        $settings = get_option(&#039;cfo_settings&#039;, []);

        // Rimuovi campi non necessari per clienti italiani
        if (!empty($settings[&#039;remove_fields&#039;])) {
            foreach ($settings[&#039;remove_fields&#039;] as $field) {
                unset($fields[&#039;billing&#039;][$field]);
                unset($fields[&#039;shipping&#039;][$field]);
            }
        }

        // Semplifica per guest
        if (!is_user_logged_in() &amp;&amp; !empty($settings[&#039;simplify_guest&#039;])) {
            unset($fields[&#039;billing&#039;][&#039;billing_company&#039;]);
            unset($fields[&#039;billing&#039;][&#039;billing_address_2&#039;]);
            unset($fields[&#039;shipping&#039;][&#039;shipping_company&#039;]);
            unset($fields[&#039;shipping&#039;][&#039;shipping_address_2&#039;]);
        }

        // Riordina campi per priorità
        $priority = [
            &#039;billing_first_name&#039; =&gt; 10,
            &#039;billing_last_name&#039; =&gt; 20,
            &#039;billing_email&#039; =&gt; 30,
            &#039;billing_phone&#039; =&gt; 40,
            &#039;billing_country&#039; =&gt; 50,
            &#039;billing_address_1&#039; =&gt; 60,
            &#039;billing_city&#039; =&gt; 70,
            &#039;billing_postcode&#039; =&gt; 80,
        ];

        foreach ($priority as $field =&gt; $p) {
            if (isset($fields[&#039;billing&#039;][$field])) {
                $fields[&#039;billing&#039;][$field][&#039;priority&#039;] = $p;
            }
        }

        // Placeholder più chiari
        $fields[&#039;billing&#039;][&#039;billing_phone&#039;][&#039;placeholder&#039;] = &#039;+39 xxx xxx xxxx&#039;;
        $fields[&#039;billing&#039;][&#039;billing_postcode&#039;][&#039;placeholder&#039;] = &#039;CAP&#039;;

        // Auto-focus sul primo campo
        add_action(&#039;woocommerce_before_checkout_form&#039;, function() {
            echo &#039;&lt;script&gt;jQuery(document).ready(function($){ $(&quot;#billing_first_name&quot;).focus(); });&lt;/script&gt;&#039;;
        });

        return $fields;
    }

    /**
     * Campo note condizionale
     */
    public function conditional_notes_field() {
        $cart = WC()-&gt;cart;

        // Mostra campo note solo per ordini &gt; €100 o con prodotti specifici
        $show_notes = false;

        if ($cart-&gt;subtotal &gt; 100) {
            $show_notes = true;
        }

        // Oppure se ci sono prodotti che richiedono personalizzazione
        foreach ($cart-&gt;get_cart() as $item) {
            if (get_post_meta($item[&#039;product_id&#039;], &#039;_requires_notes&#039;, true)) {
                $show_notes = true;
                break;
            }
        }

        if ($show_notes) {
            woocommerce_form_field(&#039;order_special_notes&#039;, [
                &#039;type&#039; =&gt; &#039;textarea&#039;,
                &#039;class&#039; =&gt; [&#039;form-row-wide&#039;],
                &#039;label&#039; =&gt; __(&#039;Note aggiuntive per il tuo ordine&#039;, &#039;cfo&#039;),
                &#039;placeholder&#039; =&gt; __(&#039;Es: regalo, consegna in orario specifico...&#039;, &#039;cfo&#039;),
            ]);
        }
    }

    /**
     * Validazione smart
     */
    public function smart_validation() {
        $settings = get_option(&#039;cfo_settings&#039;, []);

        // Validazione CAP italiano
        if (!empty($_POST[&#039;billing_country&#039;]) &amp;&amp; $_POST[&#039;billing_country&#039;] === &#039;IT&#039;) {
            $cap = sanitize_text_field($_POST[&#039;billing_postcode&#039;] ?? &#039;&#039;);

            if (!preg_match(&#039;/^\d{5}$/&#039;, $cap)) {
                wc_add_notice(__(&#039;Inserisci un CAP italiano valido (5 cifre)&#039;, &#039;cfo&#039;), &#039;error&#039;);
            }
        }

        // Validazione telefono italiano
        if (!empty($settings[&#039;validate_phone&#039;]) &amp;&amp; !empty($_POST[&#039;billing_phone&#039;])) {
            $phone = sanitize_text_field($_POST[&#039;billing_phone&#039;]);

            if (!preg_match(&#039;/^(\+39)?\s?\d{3}\s?\d{3}\s?\d{4}$/&#039;, $phone)) {
                wc_add_notice(__(&#039;Formato telefono non valido. Usa: +39 xxx xxx xxxx&#039;, &#039;cfo&#039;), &#039;error&#039;);
            }
        }
    }

    /**
     * Campi B2B
     */
    public function b2b_fields($fields) {
        // Se l&#039;utente ha un ruolo B2B
        if (current_user_can(&#039;customer_b2b&#039;)) {
            // Partita IVA obbligatoria
            $fields[&#039;billing_vat&#039;] = [
                &#039;label&#039; =&gt; __(&#039;Partita IVA&#039;, &#039;cfo&#039;),
                &#039;required&#039; =&gt; true,
                &#039;class&#039; =&gt; [&#039;form-row-wide&#039;],
                &#039;priority&#039; =&gt; 90,
            ];

            // Codice SDI
            $fields[&#039;billing_sdi&#039;] = [
                &#039;label&#039; =&gt; __(&#039;Codice SDI&#039;, &#039;cfo&#039;),
                &#039;required&#039; =&gt; false,
                &#039;class&#039; =&gt; [&#039;form-row-wide&#039;],
                &#039;priority&#039; =&gt; 95,
                &#039;description&#039; =&gt; __(&#039;Codice destinatario per fatturazione elettronica&#039;, &#039;cfo&#039;),
            ];

            // PEC
            $fields[&#039;billing_pec&#039;] = [
                &#039;label&#039; =&gt; __(&#039;PEC&#039;, &#039;cfo&#039;),
                &#039;required&#039; =&gt; false,
                &#039;class&#039; =&gt; [&#039;form-row-wide&#039;],
                &#039;priority&#039; =&gt; 100,
            ];
        }

        return $fields;
    }

    /**
     * Salva meta dati ordine
     */
    public function save_order_meta($order_id) {
        if (!empty($_POST[&#039;order_special_notes&#039;])) {
            update_post_meta(
                $order_id, 
                &#039;_special_notes&#039;, 
                sanitize_textarea_field($_POST[&#039;order_special_notes&#039;])
            );
        }

        if (!empty($_POST[&#039;billing_vat&#039;])) {
            update_post_meta(
                $order_id, 
                &#039;_billing_vat&#039;, 
                sanitize_text_field($_POST[&#039;billing_vat&#039;])
            );
        }

        if (!empty($_POST[&#039;billing_sdi&#039;])) {
            update_post_meta(
                $order_id, 
                &#039;_billing_sdi&#039;, 
                sanitize_text_field($_POST[&#039;billing_sdi&#039;])
            );
        }
    }

    /**
     * Aggiungi impostazioni admin
     */
    public function add_settings() {
        add_submenu_page(
            &#039;woocommerce&#039;,
            __(&#039;Ottimizzazione Checkout&#039;, &#039;cfo&#039;),
            __(&#039;Ottimizzazione Checkout&#039;, &#039;cfo&#039;),
            &#039;manage_woocommerce&#039;,
            &#039;checkout-field-optimizer&#039;,
            [$this, &#039;settings_page&#039;]
        );
    }

    /**
     * Pagina impostazioni
     */
    public function settings_page() {
        if (isset($_POST[&#039;cfo_save&#039;])) {
            check_admin_referer(&#039;cfo_settings&#039;);
            update_option(&#039;cfo_settings&#039;, [
                &#039;remove_fields&#039; =&gt; $_POST[&#039;remove_fields&#039;] ?? [],
                &#039;simplify_guest&#039; =&gt; !empty($_POST[&#039;simplify_guest&#039;]),
                &#039;validate_phone&#039; =&gt; !empty($_POST[&#039;validate_phone&#039;]),
            ]);
            echo &#039;&lt;div class=&quot;notice notice-success&quot;&gt;&lt;p&gt;Impostazioni salvate!&lt;/p&gt;&lt;/div&gt;&#039;;
        }

        $settings = get_option(&#039;cfo_settings&#039;, []);
        ?&gt;
        &lt;div class=&quot;wrap&quot;&gt;
            &lt;h1&gt;&lt;?php _e(&#039;Ottimizzazione Campi Checkout&#039;, &#039;cfo&#039;); ?&gt;&lt;/h1&gt;

            &lt;form method=&quot;post&quot;&gt;
                &lt;?php wp_nonce_field(&#039;cfo_settings&#039;); ?&gt;

                &lt;table class=&quot;form-table&quot;&gt;
                    &lt;tr&gt;
                        &lt;th&gt;&lt;?php _e(&#039;Rimuovi campi&#039;, &#039;cfo&#039;); ?&gt;&lt;/th&gt;
                        &lt;td&gt;
                            &lt;label&gt;
                                &lt;input type=&quot;checkbox&quot; name=&quot;remove_fields[]&quot; value=&quot;billing_company&quot; 
                                    &lt;?php checked(in_array(&#039;billing_company&#039;, $settings[&#039;remove_fields&#039;] ?? [])); ?&gt;&gt;
                                &lt;?php _e(&#039;Azienda&#039;, &#039;cfo&#039;); ?&gt;
                            &lt;/label&gt;&lt;br&gt;
                            &lt;label&gt;
                                &lt;input type=&quot;checkbox&quot; name=&quot;remove_fields[]&quot; value=&quot;billing_address_2&quot;
                                    &lt;?php checked(in_array(&#039;billing_address_2&#039;, $settings[&#039;remove_fields&#039;] ?? [])); ?&gt;&gt;
                                &lt;?php _e(&#039;Indirizzo 2&#039;, &#039;cfo&#039;); ?&gt;
                            &lt;/label&gt;&lt;br&gt;
                            &lt;label&gt;
                                &lt;input type=&quot;checkbox&quot; name=&quot;remove_fields[]&quot; value=&quot;billing_state&quot;
                                    &lt;?php checked(in_array(&#039;billing_state&#039;, $settings[&#039;remove_fields&#039;] ?? [])); ?&gt;&gt;
                                &lt;?php _e(&#039;Provincia&#039;, &#039;cfo&#039;); ?&gt;
                            &lt;/label&gt;
                        &lt;/td&gt;
                    &lt;/tr&gt;
                    &lt;tr&gt;
                        &lt;th&gt;&lt;?php _e(&#039;Semplifica per guest&#039;, &#039;cfo&#039;); ?&gt;&lt;/th&gt;
                        &lt;td&gt;
                            &lt;label&gt;
                                &lt;input type=&quot;checkbox&quot; name=&quot;simplify_guest&quot; 
                                    &lt;?php checked(!empty($settings[&#039;simplify_guest&#039;])); ?&gt;&gt;
                                &lt;?php _e(&#039;Riduci campi per utenti non registrati&#039;, &#039;cfo&#039;); ?&gt;
                            &lt;/label&gt;
                        &lt;/td&gt;
                    &lt;/tr&gt;
                    &lt;tr&gt;
                        &lt;th&gt;&lt;?php _e(&#039;Validazione telefono&#039;, &#039;cfo&#039;); ?&gt;&lt;/th&gt;
                        &lt;td&gt;
                            &lt;label&gt;
                                &lt;input type=&quot;checkbox&quot; name=&quot;validate_phone&quot;
                                    &lt;?php checked(!empty($settings[&#039;validate_phone&#039;])); ?&gt;&gt;
                                &lt;?php _e(&#039;Valida formato telefono italiano&#039;, &#039;cfo&#039;); ?&gt;
                            &lt;/label&gt;
                        &lt;/td&gt;
                    &lt;/tr&gt;
                &lt;/table&gt;

                &lt;p class=&quot;submit&quot;&gt;
                    &lt;button type=&quot;submit&quot; name=&quot;cfo_save&quot; class=&quot;button-primary&quot;&gt;
                        &lt;?php _e(&#039;Salva Impostazioni&#039;, &#039;cfo&#039;); ?&gt;
                    &lt;/button&gt;
                &lt;/p&gt;
            &lt;/form&gt;

            &lt;h2&gt;&lt;?php _e(&#039;Statistiche Checkout&#039;, &#039;cfo&#039;); ?&gt;&lt;/h2&gt;
            &lt;?php $this-&gt;show_checkout_stats(); ?&gt;
        &lt;/div&gt;
        &lt;?php
    }

    /**
     * Mostra statistiche
     */
    private function show_checkout_stats() {
        global $wpdb;

        $stats = $wpdb-&gt;get_row(&quot;
            SELECT 
                COUNT(*) as total_orders,
                AVG(meta_value) as avg_checkout_time
            FROM {$wpdb-&gt;posts} p
            LEFT JOIN {$wpdb-&gt;postmeta} pm ON p.ID = pm.post_id
            WHERE p.post_type = &#039;shop_order&#039;
            AND p.post_status IN (&#039;wc-completed&#039;, &#039;wc-processing&#039;)
            AND pm.meta_key = &#039;_checkout_duration&#039;
        &quot;);

        echo &#039;&lt;div class=&quot;cfo-stats&quot;&gt;&#039;;
        echo &#039;&lt;p&gt;&lt;strong&gt;Ordini completati:&lt;/strong&gt; &#039; . number_format($stats-&gt;total_orders) . &#039;&lt;/p&gt;&#039;;
        if ($stats-&gt;avg_checkout_time) {
            echo &#039;&lt;p&gt;&lt;strong&gt;Tempo medio checkout:&lt;/strong&gt; &#039; . round($stats-&gt;avg_checkout_time) . &#039; secondi&lt;/p&gt;&#039;;
        }
        echo &#039;&lt;/div&gt;&#039;;
    }
}

new Checkout_Field_Optimizer();</code></pre>
<h3>Benefici</h3>
<ul>
<li>Riduzione campi del 30-50% per guest</li>
<li>Validazione intelligente per clienti italiani</li>
<li>Campi B2B automatici (P.IVA, SDI, PEC)</li>
<li>Dashboard con statistiche</li>
</ul>
<p><strong>Risultato atteso:</strong> +20-35% tasso di completamento checkout</p>
<hr />
<h2>Esempio 4: Dynamic Pricing Engine</h2>
<p>Il pricing dinamico può aumentare significativamente i margini. Ecco un motore di regole flessibile:</p>
<pre><code class="language-php">&lt;?php
/**
 * Plugin Name: Dynamic Pricing Engine
 * Description: Regole di pricing dinamiche per WooCommerce
 * Version: 1.0.0
 */

if (!defined(&#039;ABSPATH&#039;)) {
    exit;
}

class Dynamic_Pricing_Engine {

    private $rules = [];

    public function __construct() {
        add_action(&#039;init&#039;, [$this, &#039;load_rules&#039;]);
        add_filter(&#039;woocommerce_product_get_price&#039;, [$this, &#039;apply_pricing&#039;], 99, 2);
        add_filter(&#039;woocommerce_product_variation_get_price&#039;, [$this, &#039;apply_pricing&#039;], 99, 2);
        add_filter(&#039;woocommerce_cart_item_price&#039;, [$this, &#039;show_discounted_price&#039;], 99, 3);

        // Admin
        add_action(&#039;admin_menu&#039;, [$this, &#039;add_admin_menu&#039;]);
        add_action(&#039;admin_init&#039;, [$this, &#039;register_settings&#039;]);
    }

    /**
     * Carica regole dal database
     */
    public function load_rules() {
        $this-&gt;rules = get_option(&#039;dpe_rules&#039;, []);
    }

    /**
     * Applica pricing dinamico
     */
    public function apply_pricing($price, $product) {
        if (is_admin() || !is_numeric($price)) {
            return $price;
        }

        $original_price = (float) $price;
        $new_price = $original_price;

        foreach ($this-&gt;rules as $rule) {
            if (!$rule[&#039;active&#039;]) {
                continue;
            }

            if ($this-&gt;rule_applies($rule, $product)) {
                $new_price = $this-&gt;calculate_price($new_price, $rule, $product);
            }
        }

        return $new_price &lt; $original_price ? $new_price : $price;
    }

    /**
     * Verifica se la regola si applica
     */
    private function rule_applies($rule, $product) {
        // Verifica data
        $now = current_time(&#039;timestamp&#039;);

        if (!empty($rule[&#039;start_date&#039;]) &amp;&amp; strtotime($rule[&#039;start_date&#039;]) &gt; $now) {
            return false;
        }

        if (!empty($rule[&#039;end_date&#039;]) &amp;&amp; strtotime($rule[&#039;end_date&#039;]) &lt; $now) {
            return false;
        }

        // Verifica categorie
        if (!empty($rule[&#039;categories&#039;])) {
            $product_cats = wp_get_post_terms($product-&gt;get_id(), &#039;product_cat&#039;, [&#039;fields&#039; =&gt; &#039;ids&#039;]);
            if (!array_intersect($rule[&#039;categories&#039;], $product_cats)) {
                return false;
            }
        }

        // Verifica ruolo utente
        if (!empty($rule[&#039;user_roles&#039;])) {
            $user = wp_get_current_user();
            if (!array_intersect($rule[&#039;user_roles&#039;], $user-&gt;roles)) {
                return false;
            }
        }

        // Verifica quantità minima
        if (!empty($rule[&#039;min_quantity&#039;])) {
            $cart_qty = 0;
            foreach (WC()-&gt;cart-&gt;get_cart() as $item) {
                if ($item[&#039;product_id&#039;] == $product-&gt;get_id()) {
                    $cart_qty = $item[&#039;quantity&#039;];
                    break;
                }
            }
            if ($cart_qty &lt; $rule[&#039;min_quantity&#039;]) {
                return false;
            }
        }

        return true;
    }

    /**
     * Calcola il nuovo prezzo
     */
    private function calculate_price($price, $rule, $product) {
        switch ($rule[&#039;type&#039;]) {
            case &#039;percentage&#039;:
                return $price * (1 - ($rule[&#039;value&#039;] / 100));

            case &#039;fixed&#039;:
                return max(0, $price - $rule[&#039;value&#039;]);

            case &#039;tiered&#039;:
                return $this-&gt;calculate_tiered_price($price, $rule, $product);

            case &#039;time_based&#039;:
                return $this-&gt;calculate_time_price($price, $rule);

            default:
                return $price;
        }
    }

    /**
     * Prezzo a scaglioni
     */
    private function calculate_tiered_price($price, $rule, $product) {
        $qty = 0;
        foreach (WC()-&gt;cart-&gt;get_cart() as $item) {
            if ($item[&#039;product_id&#039;] == $product-&gt;get_id()) {
                $qty = $item[&#039;quantity&#039;];
                break;
            }
        }

        $tiers = $rule[&#039;tiers&#039;] ?? [];
        krsort($tiers); // Ordina per quantità decrescente

        foreach ($tiers as $min_qty =&gt; $discount) {
            if ($qty &gt;= $min_qty) {
                return $price * (1 - ($discount / 100));
            }
        }

        return $price;
    }

    /**
     * Prezzo basato sull&#039;orario
     */
    private function calculate_time_price($price, $rule) {
        $hour = (int) current_time(&#039;H&#039;);
        $start = (int) ($rule[&#039;time_start&#039;] ?? 0);
        $end = (int) ($rule[&#039;time_end&#039;] ?? 24);

        if ($hour &gt;= $start &amp;&amp; $hour &lt; $end) {
            return $price * (1 - ($rule[&#039;value&#039;] / 100));
        }

        return $price;
    }

    /**
     * Mostra prezzo barrato nel carrello
     */
    public function show_discounted_price($price, $cart_item, $cart_item_key) {
        $product = $cart_item[&#039;data&#039;];
        $original_price = (float) $product-&gt;get_regular_price();
        $current_price = (float) $product-&gt;get_price();

        if ($current_price &lt; $original_price) {
            return &#039;&lt;del&gt;&#039; . wc_price($original_price) . &#039;&lt;/del&gt; &#039; . wc_price($current_price);
        }

        return $price;
    }

    /**
     * Aggiungi menu admin
     */
    public function add_admin_menu() {
        add_submenu_page(
            &#039;woocommerce&#039;,
            __(&#039;Pricing Dinamico&#039;, &#039;dpe&#039;),
            __(&#039;Pricing Dinamico&#039;, &#039;dpe&#039;),
            &#039;manage_woocommerce&#039;,
            &#039;dynamic-pricing-engine&#039;,
            [$this, &#039;admin_page&#039;]
        );
    }

    /**
     * Pagina admin
     */
    public function admin_page() {
        if (isset($_POST[&#039;dpe_save&#039;])) {
            check_admin_referer(&#039;dpe_settings&#039;);
            $this-&gt;save_rules($_POST[&#039;rules&#039;] ?? []);
            echo &#039;&lt;div class=&quot;notice notice-success&quot;&gt;&lt;p&gt;Regole salvate!&lt;/p&gt;&lt;/div&gt;&#039;;
        }

        $rules = $this-&gt;rules;
        ?&gt;
        &lt;div class=&quot;wrap&quot;&gt;
            &lt;h1&gt;&lt;?php _e(&#039;Regole Pricing Dinamico&#039;, &#039;dpe&#039;); ?&gt;&lt;/h1&gt;

            &lt;form method=&quot;post&quot; id=&quot;dpe-form&quot;&gt;
                &lt;?php wp_nonce_field(&#039;dpe_settings&#039;); ?&gt;

                &lt;div id=&quot;rules-container&quot;&gt;
                    &lt;?php 
                    if (empty($rules)) {
                        $rules = [[&#039;name&#039; =&gt; &#039;&#039;, &#039;type&#039; =&gt; &#039;percentage&#039;, &#039;value&#039; =&gt; &#039;&#039;, &#039;active&#039; =&gt; true]];
                    }
                    foreach ($rules as $index =&gt; $rule) : 
                    ?&gt;
                    &lt;div class=&quot;rule-box&quot; data-index=&quot;&lt;?php echo $index; ?&gt;&quot;&gt;
                        &lt;h3&gt;&lt;?php _e(&#039;Regola&#039;, &#039;dpe&#039;); ?&gt; #&lt;?php echo $index + 1; ?&gt;&lt;/h3&gt;

                        &lt;table class=&quot;form-table&quot;&gt;
                            &lt;tr&gt;
                                &lt;th&gt;&lt;?php _e(&#039;Nome&#039;, &#039;dpe&#039;); ?&gt;&lt;/th&gt;
                                &lt;td&gt;
                                    &lt;input type=&quot;text&quot; name=&quot;rules[&lt;?php echo $index; ?&gt;][name]&quot; 
                                           value=&quot;&lt;?php echo esc_attr($rule[&#039;name&#039;] ?? &#039;&#039;); ?&gt;&quot; 
                                           placeholder=&quot;Es: Sconto Estivo&quot;&gt;
                                &lt;/td&gt;
                            &lt;/tr&gt;
                            &lt;tr&gt;
                                &lt;th&gt;&lt;?php _e(&#039;Tipo&#039;, &#039;dpe&#039;); ?&gt;&lt;/th&gt;
                                &lt;td&gt;
                                    &lt;select name=&quot;rules[&lt;?php echo $index; ?&gt;][type]&quot; class=&quot;rule-type&quot;&gt;
                                        &lt;option value=&quot;percentage&quot; &lt;?php selected($rule[&#039;type&#039;] ?? &#039;&#039;, &#039;percentage&#039;); ?&gt;&gt;
                                            &lt;?php _e(&#039;Percentuale&#039;, &#039;dpe&#039;); ?&gt;
                                        &lt;/option&gt;
                                        &lt;option value=&quot;fixed&quot; &lt;?php selected($rule[&#039;type&#039;] ?? &#039;&#039;, &#039;fixed&#039;); ?&gt;&gt;
                                            &lt;?php _e(&#039;Importo fisso&#039;, &#039;dpe&#039;); ?&gt;
                                        &lt;/option&gt;
                                        &lt;option value=&quot;tiered&quot; &lt;?php selected($rule[&#039;type&#039;] ?? &#039;&#039;, &#039;tiered&#039;); ?&gt;&gt;
                                            &lt;?php _e(&#039;A scaglioni&#039;, &#039;dpe&#039;); ?&gt;
                                        &lt;/option&gt;
                                        &lt;option value=&quot;time_based&quot; &lt;?php selected($rule[&#039;type&#039;] ?? &#039;&#039;, &#039;time_based&#039;); ?&gt;&gt;
                                            &lt;?php _e(&#039;Basato sull\&#039;orario&#039;, &#039;dpe&#039;); ?&gt;
                                        &lt;/option&gt;
                                    &lt;/select&gt;
                                &lt;/td&gt;
                            &lt;/tr&gt;
                            &lt;tr&gt;
                                &lt;th&gt;&lt;?php _e(&#039;Valore&#039;, &#039;dpe&#039;); ?&gt;&lt;/th&gt;
                                &lt;td&gt;
                                    &lt;input type=&quot;number&quot; name=&quot;rules[&lt;?php echo $index; ?&gt;][value]&quot; 
                                           value=&quot;&lt;?php echo esc_attr($rule[&#039;value&#039;] ?? &#039;&#039;); ?&gt;&quot; 
                                           step=&quot;0.01&quot; min=&quot;0&quot; placeholder=&quot;10&quot;&gt;
                                    &lt;span class=&quot;value-suffix&quot;&gt;%&lt;/span&gt;
                                &lt;/td&gt;
                            &lt;/tr&gt;
                            &lt;tr&gt;
                                &lt;th&gt;&lt;?php _e(&#039;Categorie&#039;, &#039;dpe&#039;); ?&gt;&lt;/th&gt;
                                &lt;td&gt;
                                    &lt;?php 
                                    $cats = get_terms([&#039;taxonomy&#039; =&gt; &#039;product_cat&#039;, &#039;hide_empty&#039; =&gt; false]);
                                    foreach ($cats as $cat) {
                                        printf(
                                            &#039;&lt;label&gt;&lt;input type=&quot;checkbox&quot; name=&quot;rules[%d][categories][]&quot; value=&quot;%d&quot; %s&gt; %s&lt;/label&gt;&lt;br&gt;&#039;,
                                            $index,
                                            $cat-&gt;term_id,
                                            checked(in_array($cat-&gt;term_id, $rule[&#039;categories&#039;] ?? []), true, false),
                                            esc_html($cat-&gt;name)
                                        );
                                    }
                                    ?&gt;
                                &lt;/td&gt;
                            &lt;/tr&gt;
                            &lt;tr&gt;
                                &lt;th&gt;&lt;?php _e(&#039;Ruoli utente&#039;, &#039;dpe&#039;); ?&gt;&lt;/th&gt;
                                &lt;td&gt;
                                    &lt;?php 
                                    global $wp_roles;
                                    foreach ($wp_roles-&gt;roles as $role_name =&gt; $role_info) {
                                        printf(
                                            &#039;&lt;label&gt;&lt;input type=&quot;checkbox&quot; name=&quot;rules[%d][user_roles][]&quot; value=&quot;%s&quot; %s&gt; %s&lt;/label&gt;&lt;br&gt;&#039;,
                                            $index,
                                            $role_name,
                                            checked(in_array($role_name, $rule[&#039;user_roles&#039;] ?? []), true, false),
                                            esc_html($role_info[&#039;name&#039;])
                                        );
                                    }
                                    ?&gt;
                                &lt;/td&gt;
                            &lt;/tr&gt;
                            &lt;tr&gt;
                                &lt;th&gt;&lt;?php _e(&#039;Periodo&#039;, &#039;dpe&#039;); ?&gt;&lt;/th&gt;
                                &lt;td&gt;
                                    &lt;input type=&quot;date&quot; name=&quot;rules[&lt;?php echo $index; ?&gt;][start_date]&quot; 
                                           value=&quot;&lt;?php echo esc_attr($rule[&#039;start_date&#039;] ?? &#039;&#039;); ?&gt;&quot;&gt;
                                    -
                                    &lt;input type=&quot;date&quot; name=&quot;rules[&lt;?php echo $index; ?&gt;][end_date]&quot; 
                                           value=&quot;&lt;?php echo esc_attr($rule[&#039;end_date&#039;] ?? &#039;&#039;); ?&gt;&quot;&gt;
                                &lt;/td&gt;
                            &lt;/tr&gt;
                            &lt;tr&gt;
                                &lt;th&gt;&lt;?php _e(&#039;Attiva&#039;, &#039;dpe&#039;); ?&gt;&lt;/th&gt;
                                &lt;td&gt;
                                    &lt;label&gt;
                                        &lt;input type=&quot;checkbox&quot; name=&quot;rules[&lt;?php echo $index; ?&gt;][active]&quot; 
                                               value=&quot;1&quot; &lt;?php checked(!empty($rule[&#039;active&#039;])); ?&gt;&gt;
                                        &lt;?php _e(&#039;Regola attiva&#039;, &#039;dpe&#039;); ?&gt;
                                    &lt;/label&gt;
                                &lt;/td&gt;
                            &lt;/tr&gt;
                        &lt;/table&gt;

                        &lt;button type=&quot;button&quot; class=&quot;button remove-rule&quot;&gt;Rimuovi regola&lt;/button&gt;
                        &lt;hr&gt;
                    &lt;/div&gt;
                    &lt;?php endforeach; ?&gt;
                &lt;/div&gt;

                &lt;p&gt;
                    &lt;button type=&quot;button&quot; class=&quot;button&quot; id=&quot;add-rule&quot;&gt;+ Aggiungi regola&lt;/button&gt;
                &lt;/p&gt;

                &lt;p class=&quot;submit&quot;&gt;
                    &lt;button type=&quot;submit&quot; name=&quot;dpe_save&quot; class=&quot;button-primary&quot;&gt;
                        &lt;?php _e(&#039;Salva Regole&#039;, &#039;dpe&#039;); ?&gt;
                    &lt;/button&gt;
                &lt;/p&gt;
            &lt;/form&gt;
        &lt;/div&gt;

        &lt;style&gt;
            .rule-box {
                background: #fff;
                padding: 20px;
                margin: 10px 0;
                border: 1px solid #ccc;
                border-radius: 4px;
            }
            .rule-box h3 {
                margin-top: 0;
            }
        &lt;/style&gt;

        &lt;script&gt;
        jQuery(document).ready(function($) {
            var ruleIndex = &lt;?php echo count($rules); ?&gt;;

            $(&#039;#add-rule&#039;).on(&#039;click&#039;, function() {
                var template = $(&#039;.rule-box:first&#039;).clone();
                template.attr(&#039;data-index&#039;, ruleIndex);
                template.find(&#039;h3&#039;).text(&#039;Regola #&#039; + (ruleIndex + 1));
                template.find(&#039;input, select&#039;).each(function() {
                    var name = $(this).attr(&#039;name&#039;);
                    if (name) {
                        $(this).attr(&#039;name&#039;, name.replace(/\[\d+\]/, &#039;[&#039; + ruleIndex + &#039;]&#039;));
                    }
                    $(this).val(&#039;&#039;);
                });
                template.find(&#039;input[type=&quot;checkbox&quot;]&#039;).prop(&#039;checked&#039;, false);
                $(&#039;#rules-container&#039;).append(template);
                ruleIndex++;
            });

            $(document).on(&#039;click&#039;, &#039;.remove-rule&#039;, function() {
                if ($(&#039;.rule-box&#039;).length &gt; 1) {
                    $(this).closest(&#039;.rule-box&#039;).remove();
                }
            });
        });
        &lt;/script&gt;
        &lt;?php
    }

    /**
     * Salva regole
     */
    private function save_rules($rules) {
        $sanitized = [];

        foreach ($rules as $index =&gt; $rule) {
            $sanitized[] = [
                &#039;name&#039; =&gt; sanitize_text_field($rule[&#039;name&#039;] ?? &#039;&#039;),
                &#039;type&#039; =&gt; sanitize_text_field($rule[&#039;type&#039;] ?? &#039;percentage&#039;),
                &#039;value&#039; =&gt; floatval($rule[&#039;value&#039;] ?? 0),
                &#039;categories&#039; =&gt; array_map(&#039;intval&#039;, $rule[&#039;categories&#039;] ?? []),
                &#039;user_roles&#039; =&gt; array_map(&#039;sanitize_text_field&#039;, $rule[&#039;user_roles&#039;] ?? []),
                &#039;min_quantity&#039; =&gt; intval($rule[&#039;min_quantity&#039;] ?? 0),
                &#039;start_date&#039; =&gt; sanitize_text_field($rule[&#039;start_date&#039;] ?? &#039;&#039;),
                &#039;end_date&#039; =&gt; sanitize_text_field($rule[&#039;end_date&#039;] ?? &#039;&#039;),
                &#039;active&#039; =&gt; !empty($rule[&#039;active&#039;]),
            ];
        }

        update_option(&#039;dpe_rules&#039;, $sanitized);
        $this-&gt;rules = $sanitized;
    }

    /**
     * Registra impostazioni
     */
    public function register_settings() {
        register_setting(&#039;dpe_settings&#039;, &#039;dpe_rules&#039;);
    }
}

new Dynamic_Pricing_Engine();</code></pre>
<h3>Tipi di Regole Supportate</h3>
<ol>
<li><strong>Percentuale</strong> - Sconto % su prodotti selezionati</li>
<li><strong>Importo fisso</strong> - Sconto in €</li>
<li><strong>A scaglioni</strong> - Più compri, più risparmi</li>
<li><strong>Basato sull'orario</strong> - Happy hour, orari morti</li>
</ol>
<p><strong>Risultato atteso:</strong> +10-20% margini, +15% conversioni</p>
<hr />
<h2>Best Practices per WooCommerce Plugin Development</h2>
<h3>1. Performance</h3>
<pre><code class="language-php">// ❌ MAI fare query nel loop
add_action(&#039;woocommerce_before_single_product&#039;, function() {
    $products = wc_get_products([&#039;limit&#039; =&gt; 100]); // Lento!
});

// ✅ Usa transients per caching
add_action(&#039;woocommerce_before_single_product&#039;, function() {
    $cache_key = &#039;related_products_&#039; . get_the_ID();
    $products = get_transient($cache_key);

    if (false === $products) {
        $products = wc_get_products([&#039;limit&#039; =&gt; 10]);
        set_transient($cache_key, $products, HOUR_IN_SECONDS);
    }
});</code></pre>
<h3>2. Sicurezza</h3>
<pre><code class="language-php">// ❌ MAI fidarsi dell&#039;input utente
$price = $_POST[&#039;custom_price&#039;];

// ✅ Sanitizza e valida sempre
$price = floatval($_POST[&#039;custom_price&#039;] ?? 0);
if ($price &lt; 0 || $price &gt; 999999) {
    wp_die(&#039;Prezzo non valido&#039;);
}

// ✅ Usa nonce per form
wp_nonce_field(&#039;my_action&#039;, &#039;my_nonce&#039;);
if (!wp_verify_nonce($_POST[&#039;my_nonce&#039;], &#039;my_action&#039;)) {
    wp_die(&#039;Security check failed&#039;);
}</code></pre>
<h3>3. Compatibilità</h3>
<pre><code class="language-php">// ✅ Verifica che WooCommerce sia attivo
if (!class_exists(&#039;WooCommerce&#039;)) {
    return;
}

// ✅ Usa le versioni minime
add_action(&#039;before_woocommerce_init&#039;, function() {
    if (class_exists(\Automattic\WooCommerce\Utilities\FeaturesUtil::class)) {
        \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility(&#039;custom_order_tables&#039;, __FILE__);
    }
});

// ✅ Hook con priorità corretta
add_filter(&#039;woocommerce_product_get_price&#039;, &#039;my_filter&#039;, 99, 2); // Priorità alta</code></pre>
<h3>4. Debug e Logging</h3>
<pre><code class="language-php">// ✅ Logga errori per debug
if (defined(&#039;WP_DEBUG&#039;) &amp;&amp; WP_DEBUG) {
    error_log(&#039;WooCommerce Debug: &#039; . print_r($data, true));
}

// ✅ Usa WC_Logger
$logger = wc_get_logger();
$logger-&gt;info(&#039;Messaggio informativo&#039;, [&#039;source&#039; =&gt; &#039;my-plugin&#039;]);
$logger-&gt;error(&#039;Errore critico&#039;, [&#039;source&#039; =&gt; &#039;my-plugin&#039;]);</code></pre>
<hr />
<h2>Come Testare i Tuoi Plugin</h2>
<h3>Ambiente di Test</h3>
<pre><code class="language-bash"># Crea un sito di test con WP-CLI
wp core download --version=latest --path=/var/www/test-site
wp config create --dbname=test_db --dbuser=root --dbpass=password
wp db create
wp core install --url=test.local --title=&quot;Test Site&quot; --admin_user=admin --admin_password=password --admin_email=admin@test.local

# Installa WooCommerce
wp plugin install woocommerce --activate

# Crea prodotti di test
wp wc product create --name=&quot;Test Product&quot; --regular_price=19.99 --user=admin

# Attiva il tuo plugin
wp plugin activate my-custom-plugin</code></pre>
<h3>Unit Testing</h3>
<pre><code class="language-php">// tests/test-my-plugin.php
class MyPluginTest extends WP_UnitTestCase {

    public function test_price_calculation() {
        $product = new WC_Product_Simple();
        $product-&gt;set_regular_price(100);
        $product-&gt;save();

        $calculated = apply_filters(&#039;woocommerce_product_get_price&#039;, 100, $product);

        $this-&gt;assertLessThan(100, $calculated, &#039;Il prezzo scontato deve essere minore&#039;);
    }
}</code></pre>
<hr />
<h2>Conclusione</h2>
<p>Il codice custom per WooCommerce non è solo per sviluppatori esperti. Con gli esempi di questa guida, puoi implementare funzionalità che aumentano concretamente le conversioni del tuo store:</p>
<ul>
<li><strong>Upsell intelligente</strong> → +15-25% AOV</li>
<li><strong>Notifiche stock</strong> → Recupero 15-25% vendite perse</li>
<li><strong>Checkout ottimizzato</strong> → +20-35% completamento</li>
<li><strong>Pricing dinamico</strong> → +10-20% margini</li>
</ul>
<h3>Prossimi Passi</h3>
<ol>
<li><strong>Scegli un plugin</strong> dalla lista e implementalo nel tuo ambiente di test</li>
<li><strong>Personalizza</strong> le regole in base al tuo business</li>
<li><strong>Monitora</strong> i risultati con Google Analytics e WooCommerce Reports</li>
<li><strong>Itera</strong> in base ai dati raccolti</li>
</ol>
<h3>Risorse Utili</h3>
<ul>
<li><a href="https://developer.woocommerce.com/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">WooCommerce Developer Documentation</a></li>
<li><a href="https://developer.wordpress.org/plugins/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">WordPress Plugin Developer Handbook</a></li>
<li><a href="https://woocommerce.github.io/woocommerce-rest-api-docs/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">WooCommerce REST API</a></li>
</ul>
<hr />
<p><strong>Sei uno sviluppatore WordPress?</strong> Condividi questa guida con i tuoi clienti e mostragli il valore del codice custom.</p>
<p><strong>Sei uno store owner?</strong> Contatta un developer WooCommerce certificato per implementare queste soluzioni sul tuo store.</p>
<p><em>Hai domande o suggerimenti? Lascia un commento qui sotto!</em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.mrtux.it/woocommerce-plugin-development-2026-aumenta-le-vendite-del-40-con-codice-custom/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
