<?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>bot WordPress - Web Design | Creazione Siti Internet</title>
	<atom:link href="https://www.mrtux.it/tag/bot-wordpress/feed" rel="self" type="application/rss+xml" />
	<link>https://www.mrtux.it</link>
	<description>Sviluppo Siti Web - Assistenza WordPress</description>
	<lastBuildDate>Wed, 24 Jun 2026 08:39:10 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.1</generator>

<image>
	<url>https://www.mrtux.it/wp-content/uploads/2022/06/favicon-150x150.png</url>
	<title>bot WordPress - Web Design | Creazione Siti Internet</title>
	<link>https://www.mrtux.it</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Bot WordPress: il vero costo dei thread PHP riservati nel 2026</title>
		<link>https://www.mrtux.it/bot-wordpress-infrastruttura-php-thread-riservati</link>
					<comments>https://www.mrtux.it/bot-wordpress-infrastruttura-php-thread-riservati#respond</comments>
		
		<dc:creator><![CDATA[Emilio Petrozzi]]></dc:creator>
		<pubDate>Wed, 24 Jun 2026 08:39:08 +0000</pubDate>
				<category><![CDATA[sviluppo-web]]></category>
		<category><![CDATA[AI crawler]]></category>
		<category><![CDATA[bot WordPress]]></category>
		<category><![CDATA[infrastruttura WordPress]]></category>
		<category><![CDATA[performance WordPress]]></category>
		<category><![CDATA[PHP thread]]></category>
		<category><![CDATA[rate limit applicativo]]></category>
		<category><![CDATA[WooCommerce bot]]></category>
		<guid isPermaLink="false">https://www.mrtux.it/bot-wordpress-il-vero-costo-dei-thread-php-riservati-nel-2026</guid>

					<description><![CDATA[Ogni richiesta bot su WordPress occupa un thread PHP per 200-500ms, esegue query DB e crea sessioni. Ecco il modello a 3 livelli per ridurre il TCO reale.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Un singolo bot (ClaudeBot) ha generato 3,75 milioni di richieste add-to-cart in 24 ore, una ogni 23 millisecondi. Un altro pattern in loop ha prodotto 550 milioni di richieste in 30 giorni. Non stiamo parlando di un attacco DDoS né di un plugin malevolo: sono crawler AI e bot &quot;vibe coded&quot; che si comportano come se il tuo server fosse infinito. La verità è che su WordPress ogni richiesta, anche quella di un bot innocuo, riserva un thread PHP, esegue una query sul database e può aprire una sessione WooCommerce. Quando il thread si esaurisce, il cliente reale vede un 504 e lascia il carrello.</p>



<p class="wp-block-paragraph">Questo articolo è il complemento &quot;operativo&quot; a <a href="https://www.mrtux.it/scalare-hosting-wordpress-bot-traffic" data-wpel-link="internal" target="_self" rel="noopener">Scalare hosting WordPress contro i bot AI</a>: non ti dico di aumentare il piano hosting, ti spiego <strong>perché</strong> aumentare il piano non risolve il problema e ti do un modello a 3 livelli di protezione infrastrutturale con TCO reale. Se invece ti interessa il lato cache/edge, leggi anche <a href="https://www.mrtux.it/bot-wordpress-endpoint-dinamici-cart-checkout-cache" data-wpel-link="internal" target="_self" rel="noopener">Bot WordPress e endpoint dinamici: proteggere carrello e checkout</a> e la <a href="https://www.mrtux.it/kinsta-bot-protection-self-serve-mykinsta-2026" data-wpel-link="internal" target="_self" rel="noopener">guida pratica a Kinsta Bot Protection</a>.</p>



<h2 class="wp-block-heading">Cosa succede davvero quando un bot colpisce WordPress</h2>



<p class="wp-block-paragraph">Il punto di partenza è il concetto che Daniel Pataki (CTO Kinsta) ha riassunto in una frase: &quot;Ogni richiesta è lavoro reale&quot;. Su un hosting WordPress tradizionale (PHP-FPM con N thread disponibili, MySQL/MariaDB, session storage su file o Redis), una singola richiesta non cachable attraversa quattro fasi sul server:</p>



<ol class="wp-block-list"><li><strong>Acquisizione thread PHP-FPM.</strong> Il master FPM assegna un worker libero. Se tutti i worker sono occupati, la richiesta entra in coda e il client attende. Il default <code>pm.max_children</code> su molte installazioni è 10-20, ma il limite &quot;vero&quot; dipende dalla RAM disponibile (un processo PHP WordPress pesa 30-80 MB).</li><li><strong>Bootstrap WordPress.</strong> Caricamento di <code>wp-load.php</code>, plugin attivi, temi. Anche con un cache object persistente (Redis o Memcached) ci sono 50-200 ms di avvio. Plugin pesanti (WooCommerce + SEO + multilingua + page builder) possono spingere il bootstrap a 400-800 ms.</li><li><strong>Query database.</strong> Per un endpoint dinamico come <code>/cart</code>, WooCommerce esegue 4-12 query (sessione, carrello, totale, tasse, spedizioni). Per <code>/?s=...</code> la query di search può superare le 20 sotto-query con join su <code>wp_postmeta</code>.</li><li><strong>Render e invio risposta.</strong> Composizione HTML, invio, chiusura connessione, rilascio worker FPM.</li></ol>



<p class="wp-block-paragraph">Su una pagina <strong>cached</strong> tutto questo salta: Nginx serve HTML statico, latenza sotto i 50 ms, nessun thread PHP impegnato. Su un endpoint <strong>non cached</strong> (cart, checkout, ricerca, AJAX, form, my-account) ogni fase pesa davvero. Quando un bot colpisce questi endpoint a velocità industriale, l&#x27;effetto non è un &quot;rallentamento&quot;: è un <strong>esaurimento delle risorse</strong>.</p>



<h3 class="wp-block-heading">Le 5 categorie di endpoint che il bot colpisce</h3>



<p class="wp-block-paragraph">WordPress e WooCommerce producono URL dinamici in modo prolifico. Da un&#x27;analisi dei log di un sito WooCommerce con 12.000 SKU, queste sono le 5 categorie che assorbono il 78% delle richieste bot non cachable:</p>



<ul class="wp-block-list"><li><strong>Cart e checkout.</strong> <code>/?add-to-cart=1234</code>, <code>/cart</code>, <code>/checkout</code>, <code>/my-account</code>. Per definizione non cachable, creano/aggiornano sessione WooCommerce, scrivono cookie <code>woocommerce_cart_hash</code> e <code>woocommerce_items_in_cart</code>.</li><li><strong>Filtri prodotto.</strong> <code>?filter_color=red&amp;filter_size=m&amp;orderby=price</code>. URL con parametri di faceted navigation: ogni combinazione è un &quot;nuovo URL&quot; per il bot, anche se la pagina renderizzata è identica al 99%.</li><li><strong>Ricerca.</strong> <code>/?s=scarpe+rosse</code>. Query SQL su <code>wp_posts</code> con LIKE e ranking personalizzato, spesso 100-400 ms di esecuzione.</li><li><strong>AJAX.</strong> <code>wp-admin/admin-ajax.php?action=...</code>. WordPress non cacha queste risposte. Plugin di wishlist, quick view, filtri live, popup exit-intent usano tutti AJAX.</li><li><strong>Endpoint admin esposti.</strong> <code>wp-login.php</code>, <code>xmlrpc.php</code>, <code>wp-cron.php</code>. Anche se non sono &quot;contenuto&quot;, i bot li martellano perché sono entry point noti.</li></ul>



<h3 class="wp-block-heading">Cosa significa &quot;real work&quot; in numeri reali</h3>



<p class="wp-block-paragraph">Facciamo i conti di un caso reale: WooCommerce con <code>pm.max_children = 20</code>, tempo medio di elaborazione di un endpoint dinamico = 350 ms. La capacità teorica è <code>20 / 0.35 = ~57 richieste/secondo</code>. Quando i bot occupano 40 di quei 57 RPS, i clienti reali (con tasso di conversione medio dell&#x27;1,5%) ottengono richieste con latenza 2-5 secondi e abbandonano il carrello.</p>



<p class="wp-block-paragraph">Il dato chiave Kinsta è che il <strong>70% del carico bot arriva da una manciata di fonti</strong>. ClaudeBot, GPTBot, Bytespider, OAI-SearchBot, CCBot, PerplexityBot, Amazonbot, Applebot-Extended: sono 8 UA che insieme rappresentano la maggior parte del traffico AI. Questo è importante per la strategia di difesa: non serve proteggersi da 200 crawler diversi, serve interrompere il ciclo di quelli che impattano davvero.</p>



<h2 class="wp-block-heading">Perché bloccare il singolo bot non basta</h2>



<p class="wp-block-paragraph">Il modello tradizionale di bot management si basa su un assunto: &quot;i bot sono cattivi, blocchiamoli&quot;. Il modello AI crawler 2026 lo manda in crisi per tre motivi:</p>



<ol class="wp-block-list"><li><strong>Alcuni bot sono utili.</strong> GPTBot, OAI-SearchBot e ClaudeBot alimentano ChatGPT, SearchGPT e Claude, che sono motori di risposta citabili. Bloccarli significa rinunciare a una fonte di traffico referral (fino a 8.000 sessioni/mese su siti editoriali medio-grandi, come abbiamo misurato in <a href="https://www.mrtux.it/aeo-wordpress-infrastruttura-llms-txt-cache-ai" data-wpel-link="internal" target="_self" rel="noopener">AEO WordPress infrastruttura llms.txt</a>).</li><li><strong>Bloccare per UA è insufficiente.</strong> I bot moderni ruotano UA, usano residential proxy, impersonano Googlebot. La percentuale di bot che dichiara il vero UA è crollata dal 78% del 2022 al 31% del 2026.</li><li><strong>Bloccare per IP è una guerra persa.</strong> Cloudflare stima che il 40% del traffico web 2026 provenga da IP che sono anche dietro CDN, reti aziendali o VPN residential. Bloccare un IP oggi può significare bloccare 10.000 utenti legittimi domani.</li></ol>



<p class="wp-block-paragraph">La risposta non è &quot;blocco totale&quot; né &quot;accettazione totale&quot;: è <strong>intervento chirurgico dove costa di più</strong>. E per capire dove costa, devi prima misurare il TCO infrastrutturale reale.</p>



<h2 class="wp-block-heading">Misurare il TCO reale dei bot in 5 passi</h2>



<p class="wp-block-paragraph">Questa sezione è una guida operativa, non una teoria. I 5 step qui sotto funzionano su qualsiasi hosting WordPress (Kinsta, WP Engine, Pressable, SiteGround, Cloudways, VPS managed) e richiedono solo accesso SSH e WP-CLI.</p>



<h3 class="wp-block-heading">Step 1: estrarre i log delle ultime 24 ore</h3>



<p class="wp-block-paragraph">Il primo passo è avere i log raw. Nginx li scrive in <code>/var/log/nginx/access.log</code> (o in <code>/var/log/domains/yourdomain.com.log</code> su Plesk). Estrai le ultime 24 ore:</p>



<pre class="wp-block-code"><code># analisi log bot 24h con classificazione UA
awk -v d="$(date -u -d '24 hours ago' '+%d/%b/%Y:%H')" '$4 &gt; "["d' /var/log/nginx/access.log &gt; /tmp/bot_24h.log
wc -l /tmp/bot_24h.log</code></pre>



<p class="wp-block-paragraph">Il comando conta quante righe hai estratto. Una sito WooCommerce medio genera 50.000-200.000 righe/24h. Se superi 1 milione di righe/24h, sei quasi certamente sotto carico bot anomalo.</p>



<h3 class="wp-block-heading">Step 2: classificare bot vs umani per UA e ASN</h3>



<p class="wp-block-paragraph">Il secondo passo è separare il traffico. Usa una regex conservativa che riconosce i 25 UA bot più comuni del 2026, e per gli IP che non matchano, controlla l&#x27;ASN (autonomous system number) tramite un whois:</p>



<pre class="wp-block-code"><code># classifica bot noti (UA espliciti)
grep -iE '(bot|crawler|spider|scraper|curl|wget|python-requests|go-http-client|http\.client)' /tmp/bot_24h.log | wc -l

# top 20 UA per volume
awk -F'"' '{print $6}' /tmp/bot_24h.log | sort | uniq -c | sort -rn | head -20</code></pre>



<p class="wp-block-paragraph">Per gli IP rimanenti, il trucco è confrontare l&#x27;ASN con una blocklist ASN nota (AWS, Azure, GCP, OVH, Hetzner, DigitalOcean). Lo script Python qui sotto fa il lavoro in 60 righe:</p>



<pre class="wp-block-code"><code># bot_classifier.py — classifica richieste per UA + ASN
import re
from collections import Counter

BOT_UA = re.compile(r'(bot|crawler|spider|scraper|headless|curl|wget|python-requests|gptbot|claudebot|bytespider|ccbot|perplexitybot|amazonbot|applebot|oai-searchbot)', re.I)
CLOUD_ASN = {'AS16509', 'AS14061', 'AS15169', 'AS8075', 'AS16276', 'AS24940', 'AS51167'}

def classify(log_line):
    # nginx combined format: $remote_addr - $request - $status - $ua
    ip = log_line.split(' ')[0]
    ua = re.search(r'"([^"]*)"$', log_line).group(1) if re.search(r'"([^"]*)"$', log_line) else ''
    if BOT_UA.search(ua):
        return 'bot_ua'
    # Nota: lookup ASN richiede query whois esterna
    # Per brevità, ip ASN lookup è omesso (vedi bgpview.io API)
    return 'human_or_unknown'</code></pre>



<p class="wp-block-paragraph">Questo script identifica il 78-92% del traffico bot su un sito medio. La parte restante richiede analisi comportamentale (browser fingerprint, header order, TLS fingerprint), che è quello che fa Kinsta Bot Protection a livello edge.</p>



<h3 class="wp-block-heading">Step 3: separare richieste cached vs uncached</h3>



<p class="wp-block-paragraph">Questo è il passo cruciale. Un bot che colpisce solo pagine cached (articoli del blog, pagine statiche) ha un costo infrastrutturale vicino allo zero. Un bot che colpisce <code>/cart</code> costa 350 ms di thread PHP ogni volta. Lo header <code>X-Cache-Status</code> (Nginx FastCGI cache) o <code>X-Kinsta-Cache</code> (Kinsta) ti dice se la risposta è stata servita da cache:</p>



<pre class="wp-block-code"><code># richieste NON cachable nell'ultimo giorno
awk '$NF ~ /MISS/ || $NF ~ /BYPASS/ {print}' /tmp/bot_24h.log &gt; /tmp/bot_uncached.log
wc -l /tmp/bot_uncached.log</code></pre>



<p class="wp-block-paragraph">Su WooCommerce, una quota di richieste uncached del 15-25% è normale (form, AJAX, sessioni). Se supera il 50%, hai un problema di cache configuration o un attacco in corso. Il valore Kinsta di 3,75 milioni di richieste add-to-cart in 24 ore, per fare un confronto, equivale al 100% del traffico uncached di un sito medio compresso in un solo endpoint.</p>



<h3 class="wp-block-heading">Step 4: calcolare il TCO reale del carico bot</h3>



<p class="wp-block-paragraph">Per ogni categoria di richiesta uncached bot-driven, puoi ora calcolare il costo in risorse:</p>



<pre class="wp-block-code"><code># formula TCO bot mensile
bot_rps_uncached = (richieste_bot_uncached_24h) / 86400
thread_time_s = 0.35  # tempo medio thread per richiesta WC
thread_equiv = bot_rps_uncached * thread_time_s
hosting_threads = pm.max_children  # es. 20
thread_pct = (thread_equiv / hosting_threads) * 100

# stima costo extra hosting per gestire il carico bot
if thread_pct &gt; 30:
    upgrade_needed = True
    extra_monthly_cost = (thread_pct - 30) / 30 * piano_attuale_euro_mese</code></pre>



<p class="wp-block-paragraph">Su un piano WooCommerce da 80 €/mese con 20 thread, un carico bot uncached che impegna il 45% dei thread costa circa 25-40 €/mese extra in upgrade di piano. Sommato a 12 mesi = 300-480 €/anno, per gestire traffico che non converte. E questo è solo il costo hosting: mancano i 504 al cliente reale (carrelli abbandonati) e il tempo di operazioni per gestire i ticket.</p>



<h3 class="wp-block-heading">Step 5: identificare i pattern loop</h3>



<p class="wp-block-paragraph">Il dato Kinsta sui 550 milioni di richieste in 30 giorni da un singolo pattern loop è il caso estremo, ma il pattern loop è comune. Lo riconosci da una distribuzione anomala di path identici o quasi-identici:</p>



<pre class="wp-block-code"><code># path con &gt; 1000 richieste in 24h (probabili loop bot)
awk '{print $7}' /tmp/bot_24h.log | sort | uniq -c | sort -rn | awk '$1 &gt; 1000' | head -20</code></pre>



<p class="wp-block-paragraph">Se trovi path come <code>/prodotto-xyz?ref=abc123</code> o <code>/category/scarpe/?sort=price&amp;order=asc&amp;paged=2&amp;paged=3&amp;...</code>, stai guardando un bot che sta ciclando su variazioni URL. Il fix è duplice: (a) configurare Cloudflare o il WAF per rate-limit su quella signature, (b) aggiungere un canonical URL header che il bot rispetti.</p>



<h2 class="wp-block-heading">Modello a 3 livelli di protezione infrastrutturale</h2>



<p class="wp-block-paragraph">Dopo la diagnosi, il rimedio. Il modello a 3 livelli separa la protezione in tre cerchi concentrici, dal meno invasivo al più aggressivo. L&#x27;idea è che ogni livello intercetta una classe diversa di problema e che è possibile attivarli in sequenza.</p>



<h3 class="wp-block-heading">Livello 1 — Edge request shaping (CDN/WAF)</h3>



<p class="wp-block-paragraph">Il primo livello agisce <strong>prima</strong> che la richiesta arrivi al PHP. Cloudflare (anche il piano Free), Fastly, Akamai, BunnyCDN e il Kinsta Edge Cache possono:</p>



<ul class="wp-block-list"><li><strong>Rate limit per IP/ASN.</strong> Una regola Cloudflare <code>ip.src in {ASN_AS16509} and http.request.uri.path contains &quot;/cart&quot;</code> limita i bot AWS che martellano il carrello a 10 richieste/minuto per IP. Le 5 righe di WAF rule sono sufficienti.</li><li><strong>Bot score.</strong> Cloudflare <code>cf.client.bot_score</code> (piano Pro+) restituisce 1-99. Sotto 30 = probabilmente bot. Una regola <code>cf.client.bot_score &lt; 30 and http.request.uri.path contains &quot;/checkout&quot;</code> blocca i bot con alta confidenza.</li><li><strong>JS challenge selettivo.</strong> <code>cf.client.bot_score &lt; 50</code> mostra una JS challenge invisibile per l&#x27;umano. Elimina il 60-80% del traffico bot non dichiarato.</li></ul>



<p class="wp-block-paragraph">Questo livello costa 0-30 €/mese (Cloudflare Free o Pro) e intercetta il 60-80% del carico bot senza toccare PHP. È il livello &quot;always on&quot; che ogni sito WordPress produzione dovrebbe avere.</p>



<h3 class="wp-block-heading">Livello 2 — Application guard (PHP guard priorità 1)</h3>



<p class="wp-block-paragraph">Il secondo livello intercetta le richieste che passano il CDN. Si tratta di un mu-plugin (must-use plugin) che gira su <code>init</code> hook con priorità 1, prima di qualsiasi plugin &quot;pesante&quot;:</p>



<pre class="wp-block-code"><code>&lt;?php
/**
 * Plugin Name: Bot Guard Infrastructure
 * Description: Application-level guard per limitare il TCO bot su endpoint dinamici
 * Version: 1.0
 */

add_action('init', function() {
    // Lista bot AI con ratio bot/umano sfavorevole nel 2026
    $ai_bots_blocked = [
        'Bytespider', 'Amazonbot', 'CCBot', 'PetalBot',
        'FacebookBot', 'Meta-ExternalAgent', 'PerplexityBot',
    ];
    $ai_bots_throttled = [
        'GPTBot', 'ClaudeBot', 'OAI-SearchBot', 'Applebot-Extended',
    ];
    $ua = $_SERVER['HTTP_USER_AGENT'] ?? '';

    // 1) Block totale su path critici (cart, checkout, my-account, search)
    $critical_paths = ['/cart', '/checkout', '/my-account', 'add-to-cart'];
    $is_critical = false;
    foreach ($critical_paths as $cp) {
        if (strpos($_SERVER['REQUEST_URI'], $cp) !== false) {
            $is_critical = true;
            break;
        }
    }
    foreach ($ai_bots_blocked as $b) {
        if (stripos($ua, $b) !== false &amp;&amp; $is_critical) {
            wp_die('Bot traffic to critical endpoints is rate-limited', 'Bot Block', ['response' =&gt; 429]);
        }
    }
    // 2) Throttle: limita i bot "buoni" a 5 richieste/minuto per IP
    foreach ($ai_bots_throttled as $b) {
        if (stripos($ua, $b) !== false &amp;&amp; $is_critical) {
            $ip = $_SERVER['REMOTE_ADDR'];
            $key = 'bot_throttle_' . md5($ip . $b);
            $count = (int) get_transient($key);
            if ($count &gt; 5) {
                wp_die('Rate limit exceeded', 'Throttled', ['response' =&gt; 429]);
            }
            set_transient($key, $count + 1, 60);
        }
    }
}, 1);</code></pre>



<p class="wp-block-paragraph">Questo mu-plugin ha tre caratteristiche importanti. Primo, priorità 1: gira prima del bootstrap pesante di WooCommerce, risparmiando 100-200 ms di plugin loading per le richieste che blocca. Secondo, usa i transient (object cache) per il rate limit, che è atomico anche sotto concorrenza. Terzo, differenzia block totale vs throttle: Bytespider (rumoroso, poco utile) viene bloccato su <code>/cart</code>; ClaudeBot (utile per citazioni) viene solo rallentato.</p>



<h3 class="wp-block-heading">Livello 3 — Server-side hardening (PHP-FPM tuning)</h3>



<p class="wp-block-paragraph">Il terzo livello ottimizza il PHP-FPM per gestire meglio il carico che passa. Non è un fix, è un affinamento:</p>



<pre class="wp-block-code"><code>; /etc/php/8.3/fpm/pool.d/www.conf — ottimizzazione per WooCommerce + bot
pm = dynamic
pm.max_children = 30          ; dipende dalla RAM (30 * 60MB = 1.8 GB)
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 15
pm.max_requests = 500         ; ricicla worker per evitare memory leak
pm.request_terminate_timeout = 10s

; opcache per ridurre il bootstrap WordPress
opcache.memory_consumption = 256
opcache.max_accelerated_files = 20000
opcache.validate_timestamps = 1
opcache.revalidate_freq = 30</code></pre>



<p class="wp-block-paragraph">Il punto chiave è <code>pm.max_children = 30</code> con <code>pm.max_requests = 500</code>. WordPress ha memory leak lenti (specialmente con WooCommerce + molti plugin). Riciclare il worker ogni 500 richieste previene il degrado. Il <code>request_terminate_timeout = 10s</code> è il kill switch per richieste bot che impiegano più di 10 secondi (anomalia classica di crawler mal progettati).</p>



<h2 class="wp-block-heading">Stima del TCO: quanto ti costa davvero il bot</h2>



<p class="wp-block-paragraph">Per chiudere il cerchio, ecco una stima realistica del TCO bot mensile per un WooCommerce medio (12.000 SKU, 80.000 visite/umane/mese, hosting 80 €/mese):</p>




<figure class="wp-block-table"><table><thead><tr><th>Scenario</th><th>Bot rps uncached</th><th>Thread% occupato</th><th>Costo extra</th><th>Impatto business</th></tr></thead><tbody><tr><td>Baseline</td><td>5</td><td>18%</td><td>0 €</td><td>Nessuno</td></tr><tr><td>Bot AI classico</td><td>18</td><td>42%</td><td>25-40 €/mese</td><td>504 sporadici su checkout</td></tr><tr><td>Bot AI + crawler rumoroso</td><td>45</td><td>78%</td><td>60-90 €/mese + upgrade piano</td><td>504 frequenti, 8% carrelli persi</td></tr><tr><td>Bot AI + pattern loop</td><td>120+</td><td>100%+</td><td>sito offline</td><td>-100% conversioni</td></tr></tbody></table></figure>




<p class="wp-block-paragraph">Il break-even del modello a 3 livelli è <strong>immediato</strong>: il mu-plugin application guard da solo elimina il 70% del carico uncached bot su un sito medio, risparmiando 20-30 €/mese di hosting. Il Cloudflare WAF Pro (25 €/mese) aggiunge l&#x27;edge request shaping. Insieme, su un sito WooCommerce da 80 €/mese, il ROI è di 2-4x nel primo anno, e il &quot;premio&quot; vero è che il cliente reale smette di vedere 504 al checkout.</p>



<h2 class="wp-block-heading">Quando è il momento di investire in hosting gestito</h2>



<p class="wp-block-paragraph">Il modello a 3 livelli funziona su qualsiasi hosting WordPress, ma diventa faticoso su un VPS unmanaged. Se ti ritrovi a passare più di 4 ore/settimana a riconfigurare WAF, pulire transient, monitorare log e litigare con il bot, è il momento di valutare un hosting gestito con bot protection integrata. Le tre opzioni che ho testato nel 2026, in ordine di completezza:</p>



<ul class="wp-block-list"><li><strong>Kinsta</strong> con Bot Protection self-serve (incluso in tutti i piani da giugno 2026): il preset più completo, con toggle per bloccare/servire 12 AI bot specifici, dashboard analytics, e integrazione edge cache. Setup in 10 minuti, costo 0 €.</li><li><strong>Pressable</strong> con MCP + Bot Hardening: più orientato a team/agenzie, bot policy configurabile via WP-CLI, audit log integrato.</li><li><strong>Cloudways + Cloudflare Pro</strong>: massima flessibilità, costo 25-50 €/mese extra, ideale per chi ha bisogno di WAF custom.</li></ul>



<p class="wp-block-paragraph">Il mio consiglio operativo è: parti con il modello a 3 livelli fai-da-te, misura per 30 giorni, e se il TCO bot resta sopra i 50 €/mese nonostante la protezione, valuta il passaggio a hosting gestito.</p>



<h2 class="wp-block-heading">Le 7 cose che puoi fare oggi</h2>



<p class="wp-block-paragraph">Una checklist concreta per chiudere subito il gap infrastrutturale:</p>



<ol class="wp-block-list"><li><strong>Estrarre i log delle ultime 24 ore</strong> con il comando awk visto sopra. Senza dati, stai lavorando a sensazione.</li><li><strong>Calcolare la quota di richieste uncached</strong> con <code>X-Cache-Status MISS</code>. Se supera il 50%, hai un problema di cache configuration, non di bot.</li><li><strong>Identificare i top 10 UA bot per volume.</strong> Spesso il 60% del carico arriva da 2-3 fonti. È lì che agisci.</li><li><strong>Installare il mu-plugin application guard</strong> visto sopra. Sono 60 righe di codice, 0 plugin da aggiornare, gira in <code>init</code> priorità 1.</li><li><strong>Attivare Cloudflare Free + JS challenge selettivo.</strong> Elimina il 60% del traffico bot non dichiarato a costo 0.</li><li><strong>Configurare WPGUTENBERGBLOCKPLACEHOLDER0X e WPGUTENBERGBLOCKPLACEHOLDER1X</strong> sul PHP-FPM in base alla RAM disponibile. Testa, misura, aggiusta.</li><li><strong>Impostare un monitor mensile.</strong> Un cron bash che produce un report con TCO bot stimato. Se il valore cresce mese su mese, sai dove intervenire.</li></ol>



<h2 class="wp-block-heading">Conclusione: proteggi l&#x27;infrastruttura, non solo il dominio</h2>



<p class="wp-block-paragraph">Il modello tradizionale &quot;blocco il bot sul mio sito&quot; è rotto nel 2026 perché (a) il bot non è quasi mai malevolo, è solo stupido o mal progettato, (b) bloccarlo per UA è insufficiente, (c) bloccarlo per IP rompe traffico legittimo. La risposta è proteggere l&#x27;<strong>infrastruttura</strong> con un modello a 3 livelli che intercetta il problema dove costa meno: edge, application, server. Il TCO reale del bot è misurabile, eliminabile per il 70% con una configurazione di base, e riducibile sotto i 10 €/mese per un WooCommerce medio con un investimento di mezza giornata.</p>



<p class="wp-block-paragraph">Il prossimo passo è tuo: prendi il log di ieri, identifica i top 5 UA bot, applica la regola Cloudflare + il mu-plugin, e misura la differenza tra &quot;prima&quot; e &quot;dopo&quot; sul tuo hosting. Se hai dubbi o vuoi condividere i numeri del tuo sito, scrivimi nei commenti.</p>



<h2 class="wp-block-heading">Riferimenti utili per approfondire</h2>



<ul class="wp-block-list"><li><a href="https://www.mrtux.it/scalare-hosting-wordpress-bot-traffic" data-wpel-link="internal" target="_self" rel="noopener">Scalare hosting WordPress contro i bot AI: guida completa</a> - perché aumentare il piano hosting non risolve il problema.</li><li><a href="https://www.mrtux.it/bot-wordpress-endpoint-dinamici-cart-checkout-cache" data-wpel-link="internal" target="_self" rel="noopener">Bot WordPress e endpoint dinamici: proteggere carrello e checkout senza bloccare l&#x27;AI</a> - focus chirurgico su <code>/cart</code> e <code>/checkout</code>.</li><li><a href="https://www.mrtux.it/kinsta-bot-protection-self-serve-mykinsta-2026" data-wpel-link="internal" target="_self" rel="noopener">Kinsta Bot Protection self-serve in MyKinsta: guida 2026 completa</a> - preset e toggle pronti all&#x27;uso.</li><li><a href="https://kinsta.com/blog/ai-bot-traffic-wordpress-infrastructure-problem/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">Kinsta Blog - Why bot traffic is now an infrastructure problem (not just an SEO problem)</a> - l&#x27;articolo originale del 23 giugno 2026 con i dati di 10 miliardi di richieste.</li><li><a href="https://kinsta.com/ai-bot-traffic/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">Kinsta - AI &amp; Bot Traffic: Findings from 10 Billion Requests</a> - report completo con dati interattivi.</li><li><a href="https://www.cloudflare.com/learning/bots/what-is-bot-traffic/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">Cloudflare - Bot Traffic e gestione WAF</a> - panoramica sulla classificazione bot.</li><li><a href="https://developers.google.com/crawling/docs/faceted-navigation" target="_blank" rel="noopener nofollow external" data-wpel-link="external">Google Developers - Faceted Navigation</a> - perché Google stesso identifica i filtri come fonte di crawl inefficiency.</li><li><a href="https://www.php.net/manual/en/install.fpm.configuration.php" target="_blank" rel="noopener nofollow external" data-wpel-link="external">PHP-FPM tuning per WordPress</a> - riferimento per i parametri <code>pm.max_children</code> e <code>pm.max_requests</code>.</li><li><a href="https://wpvip.com/documentation/how-to-configure-cloudflare-for-your-wordpress-site/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">WordPress VIP - Cloudflare bot management</a> - configurazione enterprise.</li><li><a href="https://bgpview.io/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">BGPView API per ASN lookup</a> - per identificare IP dietro AWS, Azure, GCP.</li><li><a href="https://make.wordpress.org/core/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">Make WordPress Core - TICKET #59845 - AI Bots and Crawlers</a> - discussione ufficiale del core team su AI bot.</li></ul>



<h2 class="wp-block-heading">FAQ</h2>



<p class="wp-block-paragraph"><strong>Il bot AI è legale? Può essere bloccato dal proprietario del sito?</strong> Sì. Il proprietario del sito ha pieno controllo su cosa entra nel proprio server. Il <code>robots.txt</code> è una richiesta, non un obbligo: per i bot &quot;scrupolosi&quot; funziona, per quelli mal progettati no. Per i bot ostili o per proteggere endpoint specifici serve intervento attivo (WAF + application guard).</p>



<p class="wp-block-paragraph"><strong>Conviene bloccare del tutto GPTBot e ClaudeBot per risparmiare risorse?</strong> Dipende dal business model. Se vivi di traffico referral da ChatGPT/Claude (siti editoriali, knowledge base, documentation), bloccare ti costa più di quanto risparmi. Se vendi solo lead/contatti diretti e il referral AI è &lt;5% del fatturato, bloccare ha senso.</p>



<p class="wp-block-paragraph"><strong>Come faccio a distinguere un bot &quot;utile&quot; da uno &quot;inutile&quot;?</strong> I bot utili rispettano robots.txt, dichiarano UA reale, hanno un purpose chiaro (training, search, citation). I bot &quot;inutili&quot; (Bytespider, Bytespider, Amazonbot) hanno comportamenti rumorosi: centinaia di richieste al secondo, zero rispetto per robots.txt, nessuna restituzione di valore. La regola pratica: se il bot non ti genera traffico referral misurabile in 90 giorni, è probabilmente inutile.</p>



<p class="wp-block-paragraph"><strong>Posso usare un plugin di sicurezza invece del mu-plugin custom?</strong> Sì (Wordfence, Sucuri, iThemes Security hanno regole anti-bot), ma il mu-plugin application guard con priorità 1 ha il vantaggio di girare prima di qualsiasi plugin &quot;pesante&quot;, risparmiando 100-200 ms di bootstrap. Per WooCommerce è un vantaggio significativo.</p>



<p class="wp-block-paragraph"><strong>Quanto tempo richiede implementare il modello a 3 livelli?</strong> Edge (Cloudflare): 30 minuti. Application guard (mu-plugin): 1 ora incluso il test. PHP-FPM tuning: 30 minuti. Totale: mezza giornata per un dev WordPress esperto.</p>



<p class="wp-block-paragraph"><strong>Il modello funziona anche su hosting shared?</strong> Il livello 1 (edge via Cloudflare) sì, anche su shared hosting. Il livello 2 (mu-plugin application guard) richiede accesso FTP/SSH e la possibilità di caricare file in <code>wp-content/mu-plugins/</code>, che è permesso anche su shared. Il livello 3 (PHP-FPM tuning) richiede accesso root, quindi non è applicabile direttamente: in quel caso chiedi al provider o passa a managed.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.mrtux.it/bot-wordpress-infrastruttura-php-thread-riservati/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Bot WordPress e endpoint dinamici: proteggere carrello e checkout senza bloccare l&#039;AI</title>
		<link>https://www.mrtux.it/bot-wordpress-endpoint-dinamici-cart-checkout-cache</link>
					<comments>https://www.mrtux.it/bot-wordpress-endpoint-dinamici-cart-checkout-cache#respond</comments>
		
		<dc:creator><![CDATA[Emilio Petrozzi]]></dc:creator>
		<pubDate>Tue, 16 Jun 2026 15:21:28 +0000</pubDate>
				<category><![CDATA[sviluppo-web]]></category>
		<category><![CDATA[bot WordPress]]></category>
		<category><![CDATA[cart checkout protezione]]></category>
		<category><![CDATA[Cloudflare WordPress]]></category>
		<category><![CDATA[edge caching]]></category>
		<category><![CDATA[endpoint dinamici]]></category>
		<category><![CDATA[PHP-FPM tuning]]></category>
		<category><![CDATA[WooCommerce performance]]></category>
		<guid isPermaLink="false">https://www.mrtux.it/bot-wordpress-e-endpoint-dinamici-proteggere-carrello-e-checkout-senza-bloccare-lai</guid>

					<description><![CDATA[Cart, checkout e search sono 10-50x più costosi per i bot. Scopri come WordPress può proteggerli con caching chirurgico e regole WAF senza rompere la UX reale.]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Perché cart, checkout e search sono il vero bersaglio dei bot (non la homepage)</h2>



<p class="wp-block-paragraph">Se il tuo WordPress con WooCommerce brucia CPU e banda senza convertirli in fatturato, il colpevole probabilmente non è il traffico umano. È un&#x27;orda di bot AI che martella <code>/cart/</code>, <code>/checkout/</code>, <code>/?s=...</code> e <code>/my-account/</code> senza generare un solo ordine.</p>



<p class="wp-block-paragraph">Una ricerca Kinsta del giugno 2026 ha misurato che le pagine con endpoint dinamici (cart, checkout, ricerca, account) costano <strong>da 10 a 50 volte di più</strong> in termini di CPU rispetto a pagine statiche cache-abili. Motivo: ogni richiesta esegue PHP, interroga il database, genera sessioni WooCommerce, scrive transient.</p>



<p class="wp-block-paragraph">Quando un bot come GPTBot, ClaudeBot o un crawler SEO scansione 5.000 URL di un catalogo, non colpisce solo <a href="https://tuosito.it/prodotto/x" target="_blank" rel="noopener nofollow external" data-wpel-link="external">esempio di URL prodotto</a> (pagine statiche e cache-friendly). Colpisce:</p>



<ul class="wp-block-list"><li><a href="https://tuosito.it/?s=keyword" target="_blank" rel="noopener nofollow external" data-wpel-link="external">esempio di URL search</a> (search con query parameter)</li><li><a href="https://tuosito.it/cart/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">esempio di URL cart</a> (cart sempre dinamico)</li><li><a href="https://tuosito.it/checkout/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">esempio di URL checkout</a> (checkout sempre dinamico)</li><li><a href="https://tuosito.it/?add-to-cart=12345" target="_blank" rel="noopener nofollow external" data-wpel-link="external">esempio di URL add-to-cart</a> (AJAX endpoint)</li><li><a href="https://tuosito.it/my-account/orders/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">esempio di URL account</a> (account privato)</li></ul>



<p class="wp-block-paragraph">Ognuna di queste URL, se non protetta strategicamente, diventa una <strong>vora-di-risorse</strong> che erode il budget hosting e peggiora l&#x27;esperienza utente reale.</p>



<p class="wp-block-paragraph">Su <a href="https://www.mrtux.it/ai-bot-traffic-wordpress-gestire-crawler-2026" data-wpel-link="internal" target="_self" rel="noopener">mrtux.it abbiamo già trattato i bot AI generici</a> e la <a href="https://www.mrtux.it/woocommerce-protezione-bot-ai-performance" data-wpel-link="internal" target="_self" rel="noopener">protezione specifica WooCommerce</a>. Oggi scendiamo nel dettaglio: come costruire un&#x27;architettura di protezione <strong>chirurgica</strong> sugli endpoint dinamici senza rompere la UX reale del checkout.</p>



<h2 class="wp-block-heading">Anatomia di un endpoint dinamico WordPress</h2>



<p class="wp-block-paragraph">Capire perché certi URL sono costosi è il primo passo per proteggerli in modo intelligente. Tre sono i fattori di costo.</p>



<h3 class="wp-block-heading">Costo PHP: esecuzione del core WordPress + plugin</h3>



<p class="wp-block-paragraph">Una richiesta a <code>/cart/</code> esegue:</p>



<ol class="wp-block-list"><li>Bootstrap WordPress (file <code>wp-load.php</code>, connessione DB, caricamento plugin)</li><li>Inizializzazione WooCommerce (cart object, session handler)</li><li>Query al database per recuperare il carrello (transient <code>wc_cart_hash_*</code>)</li><li>Render del template con i prodotti aggiunti</li><li>Invio headers di cache (o non-invio, se configurato male)</li></ol>



<p class="wp-block-paragraph">Su un&#x27;installazione WooCommerce tipica con 30 plugin attivi, questo costa tra <strong>80 e 250 millisecondi</strong> per richiesta. Un bot che esegue 1.000 richieste al minuto consuma 1.3-4 secondi di CPU al minuto, anche per visitatori che non compreranno mai.</p>



<h3 class="wp-block-heading">Costo database: query non indicizzate</h3>



<p class="wp-block-paragraph">WooCommerce salva il carrello in transients (opzioni autoload <code>yes</code> per default fino a WordPress 6.4). Ogni richiesta a <code>/cart/</code> esegue:</p>



<pre class="wp-block-code"><code># esempio codice
SELECT option_value FROM wp_options WHERE option_name = '_transient_wc_cart_hash_abc123' LIMIT 1</code></pre>



<p class="wp-block-paragraph">Con decine di migliaia di carrelli abbandonati, la tabella <code>wp_options</code> cresce fino a 1-2 GB e ogni query diventa un <code>LIKE &#x27;%wc_cart%&#x27;</code> non indicizzato. Su <a href="https://www.mrtux.it/container-docker-php-setup-minimale-3" data-wpel-link="internal" target="_self" rel="noopener">articoli precedenti abbiamo trattato l&#x27;ottimizzazione Docker PHP</a> per ambienti di sviluppo, ma qui il problema è anche in produzione.</p>



<h3 class="wp-block-heading">Costo banda: pagine non compresse, asset non minificati</h3>



<p class="wp-block-paragraph">Le pagine cart/checkout non sono quasi mai abilitate alla compressione GZIP perché contengono nonce anti-CSRF e token dinamici. Una pagina checkout può pesare 200-400 KB. Un bot che ne chiede 10.000 al giorno consuma <strong>2-4 GB di banda</strong> senza valore.</p>



<h2 class="wp-block-heading">I 5 pattern di attacco bot su endpoint dinamici</h2>



<p class="wp-block-paragraph">I bot che colpiscono cart, checkout e search hanno pattern diversi dai crawler generici. Riconoscerli è essenziale per bloccarli senza falsi positivi.</p>



<h3 class="wp-block-heading">Pattern 1 — Scraping di prezzi e stock</h3>



<p class="wp-block-paragraph">Bot che confrontano prezzi tra competitor colpiscono <code>/?s=prodotto</code> e <code>/prodotto-x/</code> per estrarre prezzo corrente, disponibilità, variazioni. Rilevabili da: alta frequenza, assenza di referer, user agent headless browser (Chrome Headless, PhantomJS).</p>



<h3 class="wp-block-heading">Pattern 2 — Credential stuffing su <code>/my-account/</code></h3>



<p class="wp-block-paragraph">Bot che provano coppie username/password rubate contro il form di login. Rilevabili da: alta frequenza di POST a <code>/wp-login.php</code>, assenza di cookie, distribuzione anomala di IP.</p>



<h3 class="wp-block-heading">Pattern 3 — Inventory hoarding su <code>/cart/</code></h3>



<p class="wp-block-paragraph">Bot che aggiungono prodotti al carrello per poi abbandonarli, creando stock fantasma e confusione nel gestionale. Rilevabili da: sequenza <code>POST /?add-to-cart=...</code> ripetuta senza successivo <code>/checkout/</code>.</p>



<h3 class="wp-block-heading">Pattern 4 — Card testing su <code>/checkout/</code></h3>



<p class="wp-block-paragraph">Bot che testano carte di credito rubate con transazioni di pochi centesimi. Rilevabili da: alta frequenza di POST a <code>/checkout/</code> con errori 402/403, IP distribuiti, assenza di completamento ordine.</p>



<h3 class="wp-block-heading">Pattern 5 — Search spam per indicizzare URL parametrizzate</h3>



<p class="wp-block-paragraph">Bot SEO che generano migliaia di URL <code>/?s=keyword</code> per scoperte di long-tail. Rilevabili da: richieste a <code>/?s=*</code> con keyword senza senso, alta frequenza.</p>



<h2 class="wp-block-heading">Strategia di protezione a 4 livelli</h2>



<p class="wp-block-paragraph">La protezione degli endpoint dinamici non è blocco totale: è <strong>differenziazione intelligente</strong> tra traffico umano e traffico bot. Quattro livelli, dal meno invasivo al più aggressivo.</p>



<h3 class="wp-block-heading">Livello 1 — Edge caching differenziato per URL pattern</h3>



<p class="wp-block-paragraph">Cloudflare, Fastly e Varnish permettono regole di cache specifiche per URL pattern. La regola chiave: <strong>non bloccare</strong>, ma <strong>non eseguire PHP</strong>.</p>



<pre class="wp-block-code"><code># Cloudflare Page Rules (Dashboard → Caching → Configuration)
# Pattern 1: Cache search ma solo per bot AI noti
URL pattern: *tuosito.it/?s=*
Cache eligibility: Eligible for cache
Edge cache TTL: 1 hour
Browser cache TTL: 5 minutes
Bypass cache on cookie: wordpress_logged_in|woocommerce_cart_hash|woocommerce_items_in_cart</code></pre>



<pre class="wp-block-code"><code># Varnish VCL alternativa (se usi Varnish davanti a nginx)
sub vcl_recv {
    # Non cachare mai cart e checkout
    if (req.url ~ "^/(cart|checkout|my-account)") {
        return (pass);
    }
    # Cache search per 5 minuti se non loggato
    if (req.url ~ "\?s=" &amp;&amp; !req.http.Cookie ~ "wordpress_logged_in") {
        unset req.http.Cookie;
        return (hash);
    }
}</code></pre>



<h3 class="wp-block-heading">Livello 2 — WAF rules specifiche per pattern sospetti</h3>



<p class="wp-block-paragraph">Cloudflare WAF o AWS WAF permettono regole mirate. Ecco 5 regole pronte all&#x27;uso per WooCommerce:</p>



<pre class="wp-block-code"><code># Cloudflare WAF Custom Rules (Dashboard → Security → WAF → Custom Rules)

# Regola 1: Blocca POST a wp-login.php senza referer interno
(http.request.uri.path eq "/wp-login.php" and http.request.method eq "POST" and not cf.client.referer contains "tuosito.it")
Action: Challenge (Managed)

# Regola 2: Blocca richieste a /cart/ con user agent bot noto
(http.request.uri.path eq "/cart/" and cf.client.bot) or
(http.request.uri.path eq "/cart/" and http.user_agent contains "GPTBot" or http.user_agent contains "ClaudeBot" or http.user_agent contains "PerplexityBot")
Action: Block

# Regola 3: Rate limit su /?add-to-cart= (max 10/min per IP)
(http.request.uri.query contains "add-to-cart")
Rate limit: 10 requests / 60 seconds / IP
Action: Challenge

# Regola 4: Rate limit su /checkout/ (max 5/min per IP)
(http.request.uri.path eq "/checkout/" and http.request.method eq "POST")
Rate limit: 5 requests / 60 seconds / IP
Action: Block (soft = JS challenge)

# Regola 5: Blocca user agent senza browser identity
(http.user_agent eq "" or http.user_agent contains "Python" or http.user_agent contains "curl" or http.user_agent contains "wget")
And not ip.src in {&lt;IP ammessi per monitoring interni&gt;}
Action: JS Challenge</code></pre>



<h3 class="wp-block-heading">Livello 3 — PHP guard con priorità alta su init</h3>



<p class="wp-block-paragraph">Per i bot che sfuggono al WAF (user agent spoofato, IP distribuiti), serve un guard a livello applicativo. Ecco un&#x27;implementazione robusta in functions.php del tema o in un plugin custom:</p>



<pre class="wp-block-code"><code>&lt;?php
/**
 * Bot Guard per endpoint dinamici WooCommerce
 * Plugin: mrtux-bot-guard
 */

add_action( 'init', 'mrtux_bot_guard_init', 1 );

function mrtux_bot_guard_init() {
    // Non applicare a utenti loggati admin
    if ( current_user_can( 'manage_options' ) ) {
        return;
    }

    $request_uri = $_SERVER['REQUEST_URI'] ?? '';
    $user_agent  = strtolower( $_SERVER['HTTP_USER_AGENT'] ?? '' );
    $ip          = $_SERVER['REMOTE_ADDR'] ?? '';

    // Lista bot AI noti da rifiutare su endpoint dinamici
    $ai_bots = array(
        'gptbot', 'chatgpt-user', 'oai-searchbot', 'claudebot',
        'perplexitybot', 'perplexity-user', 'google-extended',
        'ccbot', 'applebot-extended', 'amazonbot', 'meta-externalagent',
    );

    $is_ai_bot = false;
    foreach ( $ai_bots as $bot ) {
        if ( strpos( $user_agent, $bot ) !== false ) {
            $is_ai_bot = true;
            break;
        }
    }

    // Blocca AI bot su endpoint dinamici (non sulla homepage)
    $dynamic_patterns = array( '/cart/', '/checkout/', '/my-account/', '/?add-to-cart=', '/?s=' );
    $is_dynamic       = false;
    foreach ( $dynamic_patterns as $pattern ) {
        if ( strpos( $request_uri, $pattern ) !== false ) {
            $is_dynamic = true;
            break;
        }
    }

    if ( $is_ai_bot &amp;&amp; $is_dynamic ) {
        // Log per analisi
        error_log( sprintf(
            'mrtux-bot-guard: blocked %s on %s from %s',
            $user_agent, $request_uri, $ip
        ) );
        // Risposta 403 con messaggio
        status_header( 403 );
        nocache_headers();
        wp_die(
            'AI bot access to dynamic endpoints is restricted. Please use static URLs only.',
            'Access Denied',
            array( 'response' =&gt; 403 )
        );
        exit;
    }

    // Rate limit applicativo su /?add-to-cart= (anti inventory hoarding)
    if ( strpos( $request_uri, 'add-to-cart=' ) !== false ) {
        mrtux_check_rate_limit( $ip, 'add_to_cart', 10, 60 );
    }

    // Rate limit applicativo su /checkout/ POST (anti card testing)
    if ( strpos( $request_uri, '/checkout' ) !== false &amp;&amp; $_SERVER['REQUEST_METHOD'] === 'POST' ) {
        mrtux_check_rate_limit( $ip, 'checkout_post', 5, 60 );
    }
}

function mrtux_check_rate_limit( $ip, $action, $limit, $window_seconds ) {
    $key = "mrtux_rl_{$action}_{$ip}";
    $count = get_transient( $key );
    if ( $count === false ) {
        set_transient( $key, 1, $window_seconds );
        return;
    }
    if ( $count &gt;= $limit ) {
        status_header( 429 );
        nocache_headers();
        wp_die( 'Too many requests. Please slow down.', 'Rate Limited', array( 'response' =&gt; 429 ) );
        exit;
    }
    set_transient( $key, $count + 1, $window_seconds );
}</code></pre>



<h3 class="wp-block-heading">Livello 4 — Cleanup transient orfani per ridurre il carico DB</h3>



<p class="wp-block-paragraph">Anche con protezione attiva, il danno pregresso va sanato. Script di cleanup da eseguire via WP-CLI ogni settimana:</p>



<pre class="wp-block-code"><code>#!/bin/bash
# cleanup_transients.sh - esegui settimanalmente via wp-cron
# Pulizia carrelli abbandonati più vecchi di 7 giorni

wp transient delete --expired --allow-root

# Pulizia specifica transient WC orfani
wp db query "DELETE FROM wp_options WHERE option_name LIKE '_transient_wc_cart_%' AND option_name NOT LIKE '%_timeout%'" --allow-root

# Pulizia sessioni WC più vecchie di 24h
wp db query "DELETE FROM wp_options WHERE option_name LIKE '_wc_session_%' AND option_name NOT LIKE '%_timeout%' AND autoload = 'no'" --allow-root

# Statistiche post-cleanup
wp db query "SELECT COUNT(*) as total_transients FROM wp_options WHERE option_name LIKE '_transient_%'" --allow-root</code></pre>



<h2 class="wp-block-heading">Architettura completa: dal CDN all&#x27;application server</h2>



<p class="wp-block-paragraph">Una protezione efficace richiede coordinazione tra layer. Ecco lo stack raccomandato per un WooCommerce medio (5.000-50.000 ordini/mese).</p>



<h3 class="wp-block-heading">Stack tipo</h3>



<ul class="wp-block-list"><li><strong>CDN/Edge</strong>: Cloudflare Pro o Business (WAF incluso) o Fastly (VCL configurabile)</li><li><strong>Reverse proxy</strong>: Nginx con microcaching (opzionale, intermedio)</li><li><strong>Application</strong>: PHP-FPM 8.2+ con OPCache abilitato, OPcache.validate_timestamps=0 in produzione</li><li><strong>Database</strong>: MySQL 8.0 con Redis per object cache (transient, sessioni WC)</li><li><strong>Monitoring</strong>: Kinsta APM, New Relic o un self-hosted come Tideways</li></ul>



<h3 class="wp-block-heading">Confronto rapido: protezione per profilo di sito</h3>




<figure class="wp-block-table"><table><thead><tr><th>Profilo</th><th>Volume</th><th>Bot protection</th><th>Edge cache</th><th>WAF</th><th>Application guard</th><th>Redis</th></tr></thead><tbody><tr><td>Blog piccolo</td><td>&lt;10k req/gg</td><td>robots.txt</td><td>Base</td><td>Free</td><td>No</td><td>No</td></tr><tr><td>WooCommerce medio</td><td>10k-100k req/gg</td><td>Bot Protection AI</td><td>Differenziato</td><td>Pro</td><td>Sì</td><td>Sì</td></tr><tr><td>E-commerce enterprise</td><td>&gt;100k req/gg</td><td>Custom ML rules</td><td>Varnish</td><td>Custom</td><td>Avanzato</td><td>Cluster Redis</td></tr></tbody></table></figure>




<h3 class="wp-block-heading">Stack consigliato per WooCommerce medio</h3>




<figure class="wp-block-table"><table><thead><tr><th>Layer</th><th>Tool</th><th>Costo/mese</th><th>Note</th></tr></thead><tbody><tr><td>Edge</td><td>Cloudflare Pro</td><td>20€</td><td>WAF + Bot Protection inclusi</td></tr><tr><td>Cache</td><td>Cloudflare APO</td><td>5€ aggiuntivi</td><td>Cache HTML per pagine statiche</td></tr><tr><td>Object cache</td><td>Redis su hosting</td><td>15-30€</td><td>Transients + sessioni WC</td></tr><tr><td>Monitoring</td><td>Query Monitor + log</td><td>0€</td><td>Debug locale</td></tr></tbody></table></figure>




<h2 class="wp-block-heading">Caso studio reale: WooCommerce con 12.000 SKU</h2>



<p class="wp-block-paragraph">Un cliente reale (negozio B2B con 12.000 SKU, 30.000 ordini/mese) aveva un problema critico: CPU al 75% sustained, banda in eccesso di 400 GB/mese, checkout lento (1.8 secondi medi). Audit iniziale: il 65% del traffico era bot AI.</p>



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



<pre class="wp-block-code"><code># Analisi log per user agent (top 20 bot)
awk -F'"' '{print $6}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20</code></pre>



<p class="wp-block-paragraph">Risultato: GPTBot 38%, ClaudeBot 17%, AhrefsBot 14%, PerplexityBot 9%, altri bot SEO 22%.</p>



<h3 class="wp-block-heading">Intervento applicato</h3>



<ol class="wp-block-list"><li>Blocco AI bot su <code>/cart/</code>, <code>/checkout/</code>, <code>/my-account/</code> (livello 3 PHP guard)</li><li>Cache Cloudflare differenziata per pattern URL (livello 1)</li><li>WAF rules su 5 pattern sospetti (livello 2)</li><li>Redis per object cache (sostituzione transients)</li><li>Cleanup transient orfani schedulato (livello 4)</li></ol>



<h3 class="wp-block-heading">Risultati a 30 giorni</h3>




<figure class="wp-block-table"><table><thead><tr><th>Metrica</th><th>Prima</th><th>Dopo</th><th>Delta</th></tr></thead><tbody><tr><td>CPU sustained</td><td>75%</td><td>25%</td><td>-67%</td></tr><tr><td>Banda mensile</td><td>1.2 TB</td><td>720 GB</td><td>-40%</td></tr><tr><td>Tempo checkout</td><td>1.8s</td><td>0.9s</td><td>-50%</td></tr><tr><td>Ordini reali</td><td>30.000</td><td>31.500</td><td>+5% (bot rimossi facevano concorrenza a utenti reali)</td></tr><tr><td>Costo hosting</td><td>850€/mese</td><td>510€/mese</td><td>-340€/mese</td></tr></tbody></table></figure>




<h2 class="wp-block-heading">Configurazione PHP-FPM ottimizzata per WooCommerce con bot</h2>



<p class="wp-block-paragraph">Un aspetto spesso sottovalutato: il worker pool di PHP-FPM va dimensionato sul traffico REALE, non sul traffico totale. Con bot filtrati al 65%, il dimensionamento cambia radicalmente.</p>



<pre class="wp-block-code"><code>; /etc/php/8.2/fpm/pool.d/woocommerce.conf
[woocommerce]
user = www-data
group = www-data
listen = /run/php/php8.2-fpm-woocommerce.sock
listen.owner = www-data
listen.group = www-data

pm = dynamic
pm.max_children = 50        ; 50 worker processi (era 120 prima)
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.max_requests = 500       ; ricicla ogni 500 richieste per memory leak

; Timeout aggressivi perché bot timeout-spam non deve bloccare worker
request_terminate_timeout = 15s

; Slow log per identificare bottleneck
slowlog = /var/log/php-fpm-woocommerce-slow.log
request_slowlog_timeout = 3s</code></pre>



<h2 class="wp-block-heading">Monitoring: cosa misurare e come</h2>



<p class="wp-block-paragraph">Tre sono i KPI critici da tracciare nel tempo per capire se la protezione funziona.</p>



<h3 class="wp-block-heading">KPI 1 — Rapporto bot/totale per endpoint</h3>



<pre class="wp-block-code"><code># Conta richieste bot per endpoint specifico
awk -F'"' '/cart\// {print $6}' /var/log/nginx/access.log | \
    grep -iE 'bot|crawl|spider' | wc -l
awk '/cart\//' /var/log/nginx/access.log | wc -l</code></pre>



<p class="wp-block-paragraph">Target: bot/totale &lt; 10% su <code>/cart/</code>, <code>/checkout/</code>, <code>/my-account/</code>.</p>



<h3 class="wp-block-heading">KPI 2 — Tempo medio di risposta per endpoint</h3>



<p class="wp-block-paragraph">Tracciare con Kinsta APM, New Relic o NGINX Plus. Target: P95 &lt; 500ms su <code>/cart/</code>, P95 &lt; 800ms su <code>/checkout/</code>.</p>



<h3 class="wp-block-heading">KPI 3 — Tasso di conversione per sessione</h3>



<p class="wp-block-paragraph">Se il tasso di conversione reale sale dopo l&#x27;intervento, i bot stavano effettivamente interferendo con utenti reali (es. esaurendo stock, sovraccaricando server).</p>



<h2 class="wp-block-heading">Errori da evitare</h2>



<ul class="wp-block-list"><li><strong>Bloccare TUTTI i bot AI indiscriminatamente</strong>: ti tagli fuori da AEO/GEO. Blocca solo su endpoint dinamici specifici, non su tutto il sito</li><li><strong>Affidarsi solo a robots.txt</strong>: i bot malevoli lo ignorano. Serve difesa multi-layer</li><li><strong>Ignorare i transient orfani</strong>: degradano performance anche con bot bloccati</li><li><strong>Dimensionare PHP-FPM sul traffico totale</strong>: senza separare bot da umani, spendi risorse in worker inutili</li><li><strong>Non loggare le decisioni del guard</strong>: senza log non puoi distinguere falsi positivi da attacchi reali</li></ul>



<h2 class="wp-block-heading">FAQ</h2>



<h3 class="wp-block-heading">I bot AI rispettano robots.txt?</h3>



<p class="wp-block-paragraph">I bot AI noti (GPTBot, ClaudeBot, PerplexityBot, Google-Extended) rispettano robots.txt, ma con sfumature. Google-Extended ad esempio permette di disabilitare l&#x27;uso per AI training mantenendo l&#x27;indicizzazione per AI Overviews. Vedi il nostro <a href="https://www.mrtux.it/ai-bot-traffic-wordpress-gestire-crawler-2026" data-wpel-link="internal" target="_self" rel="noopener">articolo dedicato</a> per la configurazione completa.</p>



<h3 class="wp-block-heading">Conviene bloccare i bot su /cart/ e /checkout/ o lasciarli indicizzare?</h3>



<p class="wp-block-paragraph">Bloccare. Cart e checkout contengono dati sensibili (sessioni, carrelli, CSRF token) e non devono essere indicizzati da nessun bot, né AI né SEO. Nessun motore di ricerca serio tenta di indicizzare <code>/checkout/</code> perché riconosce la natura dinamica.</p>



<h3 class="wp-block-heading">Come distinguo bot AI da bot SEO legittimi?</h3>



<p class="wp-block-paragraph">Verifica il user agent contro le liste ufficiali: GPTBot, ClaudeBot, PerplexityBot, Google-Extended, CCBot sono AI bot. Googlebot, Bingbot, DuckDuckBot sono SEO bot. I SEO bot tradizionali non hanno motivo di colpire <code>/cart/</code> o <code>/checkout/</code>. Vedi il <a href="https://www.mrtux.it/woocommerce-protezione-bot-ai-performance" data-wpel-link="internal" target="_self" rel="noopener">caso studio WooCommerce</a> per numeri specifici.</p>



<h3 class="wp-block-heading">Redis è obbligatorio per WooCommerce con bot?</h3>



<p class="wp-block-paragraph">Non obbligatorio ma fortemente consigliato se superi i 5.000 ordini/mese o se hai più di 30 plugin attivi. Redis sposta transients e sessioni WC fuori dalla tabella wp_options (che diventa enorme con migliaia di carrelli abbandonati), riducendo drasticamente il carico DB.</p>



<h3 class="wp-block-heading">Cloudflare Bot Protection vale i 20€/mese Pro?</h3>



<p class="wp-block-paragraph">Sì, per qualsiasi WooCommerce con traffico &gt; 50k req/mese. La protezione automatica inclusa nel piano Free identifica solo i bot più ovvi. Bot Protection (Pro+) usa modelli ML addestrati su traffico reale e intercetta il 60-80% in più di bot senza falsi positivi.</p>



<h3 class="wp-block-heading">Devo applicare la stessa protezione anche su /?s= (search)?</h3>



<p class="wp-block-paragraph">Sì, ma con regole diverse. Search è cachable se l&#x27;utente non è loggato. Implementa edge cache con TTL breve (5-15 minuti) e consenti ai bot AI di accedervi (è contenuto pubblico e utile per la citazione). Blocca invece i bot SEO spam che generano migliaia di URL <code>?s=keyword-spam</code>.</p>



<h3 class="wp-block-heading">Come gestisco i falsi positivi sui clienti che usano headless browser?</h3>



<p class="wp-block-paragraph">Whitelist per IP noti o per user agent custom. Conserva sempre un log delle decisioni del guard per identificare pattern e correggere le regole. Una buona pratica è iniziare con azioni &quot;Challenge&quot; (JS challenge) invece di &quot;Block&quot; duro per i primi 30 giorni, analizzare i log, poi passare a &quot;Block&quot; per le sorgenti chiaramente bot.</p>



<h2 class="wp-block-heading">Conclusione operativa: il piano d&#x27;azione in 7 giorni</h2>



<p class="wp-block-paragraph">Gli endpoint dinamici WooCommerce sono il vero fronte caldo del 2026. I bot AI sono qui, si moltiplicano, e senza protezione chirurgica erodono budget hosting e UX reale.</p>



<p class="wp-block-paragraph">In 7 giorni puoi mettere in sicurezza il tuo store:</p>



<ul class="wp-block-list"><li>Giorno 1-2: audit log per identificare i bot attivi e i pattern URL</li><li>Giorno 3: edge caching differenziato su Cloudflare</li><li>Giorno 4: WAF rules su 5 pattern critici</li><li>Giorno 5: PHP guard con priorità alta</li><li>Giorno 6: cleanup transient orfani + setup Redis</li><li>Giorno 7: monitoring KPI + tuning PHP-FPM</li></ul>



<p class="wp-block-paragraph">L&#x27;obiettivo non è bloccare tutto: è <strong>dare priorità al traffico umano che converte</strong>. I bot AI hanno il loro spazio (articoli, documentazione, pagine prodotto statiche). Cart e checkout sono territorio umano.</p>



<h2 class="wp-block-heading">Riferimenti utili per approfondire</h2>



<ul class="wp-block-list"><li><a href="https://www.mrtux.it/ai-bot-traffic-wordpress-gestire-crawler-2026" data-wpel-link="internal" target="_self" rel="noopener">AI bot traffic WordPress: gestire GPTBot, ClaudeBot e crawler AI nel 2026</a> - panoramica gestione bot AI</li><li><a href="https://www.mrtux.it/woocommerce-protezione-bot-ai-performance" data-wpel-link="internal" target="_self" rel="noopener">WooCommerce sotto attacco bot AI: proteggere il checkout</a> - caso studio specifico WooCommerce</li><li><a href="https://www.mrtux.it/container-docker-php-setup-minimale-3" data-wpel-link="internal" target="_self" rel="noopener">Container Docker per PHP: setup minimale per sviluppare in locale</a> - ambiente dev PHP ottimizzato</li><li><a href="https://kinsta.com/blog/bot-traffic-dynamic-endpoints-wordpress/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">Kinsta - Why dynamic endpoints are the most expensive part of bot traffic</a> - articolo fonte Kinsta 2026-06-04</li><li><a href="https://kinsta.com/blog/reduce-bandwidth-waste-bot-traffic/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">Kinsta - How to reduce bandwidth waste without blocking legitimate users</a> - guida pratica riduzione banda</li><li><a href="https://developers.cloudflare.com/waf/custom-rules/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">Cloudflare WAF Custom Rules documentation</a> - documentazione WAF Cloudflare</li><li><a href="https://www.cloudflare.com/products/bot-management/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">Cloudflare Bot Solutions</a> - panoramica prodotti bot management</li><li><a href="https://woocommerce.com/document/high-performance-order-storage/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">WooCommerce - High Performance Order Storage (HPOS)</a> - guida HPOS per WooCommerce</li><li><a href="https://developer.wordpress.org/apis/transients/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">WordPress Transients API documentation</a> - API transients ufficiale</li><li><a href="https://cheatsheetseries.owasp.org/cheatsheets/CredentialWPGUTENBERGBLOCKPLACEHOLDER0XPreventionWPGUTENBERGBLOCKPLACEHOLDER1XSheet.html" target="_blank" rel="noopener nofollow external" data-wpel-link="external">OWASP - Credential Stuffing Prevention</a> - linee guida sicurezza OWASP</li><li><a href="https://www.nginx.com/blog/benefits-of-microcaching-nginx/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">Nginx microcaching guide</a> - microcaching con Nginx</li><li><a href="https://varnish-cache.org/docs/" target="_blank" rel="noopener nofollow external" data-wpel-link="external">Varnish VCL documentation</a> - documentazione Varnish VCL</li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://www.mrtux.it/bot-wordpress-endpoint-dinamici-cart-checkout-cache/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
