Nel 2024 ho deciso di costruire da zero un portale dedicato all’analisi tecnica dei mercati finanziari.
Quello che sembrava un progetto semplice si è trasformato in un sistema complesso che oggi gestisce
oltre 220 contenuti su due siti gemelli — uno in italiano (analisi-tecnica.it)
e uno in inglese (technical-analysis-pro.com).
In questo articolo racconto le decisioni tecniche, i problemi incontrati e le soluzioni adottate.
Perché ho scelto WordPress
La prima domanda che mi sono posto è stata: quale CMS usare? Le alternative erano Hugo (statico),
Gatsby, o un custom backend. Ho scelto WordPress per tre motivi concreti:
- Ecosistema SEO maturo — RankMath e Yoast offrono Schema Markup, sitemap XML e meta tag gestiti automaticamente
- REST API nativa — permette upload programmatico dei contenuti via Python senza accesso diretto al database
- LiteSpeed Cache — l’hosting Aruba include LiteSpeed, che gestisce il caching a livello server senza configurazione
La struttura permalink scelta è stata /%postname%/ (flat), senza date nella URL.
Questo migliora la stabilità dei link nel tempo e semplifica la gestione degli slug.
L’architettura dei contenuti
Entrambi i siti seguono la stessa architettura a 4 categorie: Fondamentali, Indicatori,
Pattern e Strategie. Ogni categoria ha:
- Una hub page dedicata con elenco di tutti gli articoli raggruppati per argomento
- Articoli individuali da 2.000 a 5.000 parole ciascuno
- Un glossario con 50 termini finanziari (100 pagine totali sui due siti)
- 12 calcolatori interattivi (position size, pip value, risk/reward, fibonacci, ecc.)
La scelta di avere hub page separate dalle archive di WordPress è stata determinante:
le archive WordPress hanno URL del tipo /category/indicatori/, difficili da ottimizzare.
Le hub page custom hanno URL pulite come /indicatori-hub/ e contenuto SEO dedicato.
Automazione con Python: il cuore del progetto
Il vero differenziatore è stato costruire un sistema di automazione completo in Python.
Scrivere manualmente 220+ articoli è impraticabile; il sistema permette di gestire tutto
da terminale con script ripetibili e idempotenti.
Upload automatico degli articoli
Il flusso base funziona così: l’articolo è scritto in HTML locale, poi uno script Python
chiama la REST API WordPress per creare o aggiornare il post:
import requests
API_URL = "https://www.analisi-tecnica.it/wp-json/wp/v2/posts"
headers = {
"Authorization": "Basic " + base64.b64encode(b"api-user:app-password").decode(),
"Content-Type": "application/json"
}
post_data = {
"title": "Indicatore RSI: guida completa",
"slug": "indicatori-rsi-indicatore",
"content": html_content,
"status": "publish",
"categories": [3] # Indicatori
}
response = requests.post(API_URL, json=post_data, headers=headers)
Per gli aggiornamenti massivi (es. aggiungere un blocco a tutti gli articoli di una categoria)
ho scritto script con stato persistente in JSON, così un’interruzione non richiede di ricominciare da zero.
Il problema dei meta SEO via REST API
RankMath non espone i propri meta field via REST API di default. La soluzione è stata
un mu-plugin (must-use plugin) PHP che registra i campi mancanti:
<?php
// wp-content/mu-plugins/rankmath-rest-meta.php
add_action('rest_api_init', function() {
$fields = ['rank_math_title', 'rank_math_description', 'rank_math_focus_keyword'];
foreach ($fields as $field) {
register_rest_field('post', $field, [
'get_callback' => fn($obj) => get_post_meta($obj['id'], $field, true),
'update_callback' => fn($val, $obj) => update_post_meta($obj->ID, $field, $val),
'schema' => ['type' => 'string'],
]);
}
});
Aggiornamenti diretti al database
Per contenuti molto grandi (30KB+), la REST API va in timeout anche con credenziali valide.
La soluzione è stata bypassare WordPress completamente e scrivere direttamente nella tabella
wp_posts via $wpdb:
// Approccio diretto per contenuti grandi
$wpdb->update(
$wpdb->posts,
['post_content' => $content, 'post_modified' => current_time('mysql')],
['ID' => $post_id],
['%s', '%s'],
['%d']
);
clean_post_cache($post_id);
Questo approccio bypassa tutti gli hook WordPress (incluso quello che causava i timeout),
aggiorna il timestamp di modifica e invalida la cache del post.
Schema Markup: BreadcrumbList e FAQPage custom
RankMath genera automaticamente Schema BlogPosting, WebSite e Organization,
ma mancavano BreadcrumbList e FAQPage sui singoli articoli.
Ho costruito un mu-plugin PHP che:
- Legge il contenuto del post cercando il pattern
<h2 id="faq">seguito da tag<h3> - Costruisce il JSON-LD per
FAQPagecon le domande trovate - Inietta il blocco
<script type="application/ld+json">viawp_head
La scoperta più importante: RankMath sanitizza l’output del suo filtro rank_math/json_ld
e rimuove entità non riconosciute. L’unico modo per aggiungere nuovi tipi di schema è iniettarli
come blocchi separati, non tentare di modificare il JSON di RankMath.
Diagrammi SVG generati programmaticamente
Ogni articolo ha diagrammi tecnici illustrativi: grafici di indicatori, pattern candlestick,
schemi di trading. Invece di crearli manualmente in Figma o Illustrator, ho scritto
un sistema Python che genera SVG scalabili a partire da dati strutturati.
Il sistema è organizzato in primitive (linee, aree, candele) e moduli per articolo
(ogni articolo ha il suo file Python che descrive i diagrammi da generare).
304 SVG totali deployati su entrambi i siti via FTP.
Indicatori per MetaTrader 4 e 5
Una sezione dedicata raccoglie 15 indicatori custom sviluppati in MQL4/MQL5:
RSI con alert, Bollinger Squeeze, Multi-Timeframe Dashboard, Support/Resistance automatico, ecc.
Gli indicatori vengono compilati localmente e distribuiti via download gratuito,
con guide di installazione integrate nelle pagine del sito.
Risultati e prossimi passi
Dopo circa un anno di lavoro il sistema è in produzione con:
- 111 articoli su analisi-tecnica.it (sito italiano sull’analisi tecnica)
- 112 articoli su technical-analysis-pro.com (versione inglese)
- 100 pagine di glossario (50 termini × 2 lingue)
- 24 calcolatori di trading (12 × 2 lingue)
- 304 diagrammi SVG originali
- 30 pagine di comparazione broker
- Bot Telegram per l’invio automatico degli articoli quotidiani
Il progetto ha confermato che è possibile costruire contenuti di qualità a scala
con una buona architettura di automazione. La chiave è trattare il CMS come un’API
e orchestrare tutto da script Python mantenibili e idempotenti.
Domande frequenti
Quanto tempo ci vuole per costruire un sito simile?
Dipende molto dalla quantità di contenuto. L’infrastruttura tecnica (WordPress, mu-plugin,
script Python base) richiede 2-4 settimane. I contenuti veri e propri sono il collo di bottiglia:
scrivere 100+ articoli di qualità richiede mesi, anche con automazione parziale.
Vale la pena usare WordPress rispetto a un sito statico?
Per un sito di contenuti con monetizzazione AdSense e aggiornamenti frequenti, sì.
La REST API, l’ecosistema di plugin SEO e la facilità di deploy tramite hosting condiviso
compensano i compromessi in termini di performance rispetto a soluzioni statiche.
Come gestire i contenuti in due lingue senza un plugin multilingua?
Ho scelto di avere due installazioni WordPress separate, ognuna con il proprio dominio.
Questo evita la complessità di WPML o Polylang, e permette SEO completamente indipendente
per le due audience. Gli script Python gestiscono il deploy parallelo sui due siti.
Come fare aggiornamenti massivi senza la REST API?
Per update su larga scala uso script PHP temporanei caricati via FTP che accedono
direttamente a $wpdb. Lo script si auto-elimina dopo l’esecuzione.
È meno elegante della REST API ma funziona senza limiti di timeout o memoria.