# Lo script REST commentato — la bozza arriva su WordPress da sola (capitolo 6.2, strada A)

Questi sono i comandi della pipeline reale del capitolo 6.2, commentati riga per riga:
il giro che ha caricato l'articolo della Cantina Brunetti **come bozza** (post id 7,
`status: draft`) su un WordPress 7.0.1 di prova, con le tre verifiche in coda. P283 fa
costruire a Claude Code lo script completo (conversione Markdown → HTML compresa);
qui vedi — e puoi rifare a mano — il cuore REST, comando per comando.

Prima di iniziare ti servono le tre fondamenta del capitolo: un utente dedicato con
ruolo **Contributor**, la sua **password delle applicazioni** (profilo utente →
«Password delle applicazioni») e un file `.env` fuori dal codice per le credenziali.
Quelle qui sotto sono FINTE: sostituiscile con le tue.

```bash
# ── Credenziali: MAI nello script. Si caricano dal file .env ─────────────────────
# Il file .env contiene due righe:  WP_UTENTE=pipeline-blog
#                                   WP_APP_PASSWORD=xxxx xxxx xxxx xxxx xxxx xxxx
# e sta fuori da ogni cartella pubblica e da ogni repository (regola del 4.6).
source .env

# ── 1. Creazione della bozza ─────────────────────────────────────────────────────
# POST sull'endpoint dei post. Tre scelte deliberate:
#   -u        → l'application password viaggia come Basic Auth (per questo il sito
#               DEVE essere in HTTPS: su HTTP in chiaro WordPress la ignora e la
#               richiesta diventa anonima → 401);
#   --data-binary @file → il payload sta in un FILE UTF-8, non in linea: su Windows
#               il JSON incollato nel comando corrompe i caratteri speciali
#               (è successo davvero: 400 «Malformed UTF-8» per un trattino lungo);
#   "status":"draft" → FISSO nel payload, mai parametrico. È la riga in cui
#               «l'AI produce, l'umano approva» diventa ingegneria.
curl -X POST https://tuosito.it/wp-json/wp/v2/posts \
  -u "$WP_UTENTE:$WP_APP_PASSWORD" \
  -H 'Content-Type: application/json' \
  --data-binary @bozza-articolo.json
# bozza-articolo.json: {"title":"…","status":"draft","content":"<p>…HTML pulito…</p>"}
# Risposta attesa: HTTP 201 Created, con "id" e "status":"draft".
# Nel giro reale: 201 · id 7 · "slug":"degustazione-cantina-agosto".
# Occhio alle date nella risposta: sono in UTC (20:14 italiane → "18:14").

# ── 2. Verifica (a): la bozza NON è visibile a un visitatore anonimo ─────────────
# Stessa richiesta ma SENZA credenziali, come farebbe chiunque dal browser.
curl https://tuosito.it/wp-json/wp/v2/posts/7
# Risposta attesa: HTTP 401 {"code":"rest_forbidden",
#                            "message":"Non hai i permessi per farlo."}

# ── 3. Verifica (b): l'elenco pubblico dei post non la contiene ──────────────────
curl https://tuosito.it/wp-json/wp/v2/posts
# Risposta attesa: solo gli articoli già pubblicati (nel giro reale: "Hello world!").
# Controprova sulla home: il titolo della bozza non deve comparire da nessuna parte.
curl -s https://tuosito.it/ | grep -ci "titolo-della-bozza"     # atteso: 0

# ── 4. Verifica (c): la bozza esiste nell'elenco bozze AUTENTICATO ───────────────
# context=edit chiede la vista da redazione: serve l'autenticazione.
curl "https://tuosito.it/wp-json/wp/v2/posts?status=draft&context=edit" \
  -u "$WP_UTENTE:$WP_APP_PASSWORD"
# Risposta attesa: la tua bozza nell'elenco, con "status":"draft".
```

Le tre verifiche non si fanno una volta sola: lo script le ripete a ogni caricamento,
così ogni lunedì hai la prova che niente è sfuggito.

## Se qualcosa non torna (dai collaudi veri)

- **401 anche con credenziali giuste** → prima l'HTTPS, poi le credenziali, poi il
  ruolo: il messaggio è identico nei tre casi. In locale (Docker) si dichiara
  `WP_ENVIRONMENT_TYPE=local` per far accettare le application password su http.
- **La risposta è la homepage, con un 200** → mancano i permalink «parlanti»
  (Impostazioni → Permalink): senza, `/wp-json/` non esiste.
- **400 `rest_invalid_json` («Malformed UTF-8»)** → payload in un file UTF-8 e
  `--data-binary @file`, mai JSON in linea nel comando.

E il flusso n8n della strada B? Non è in questo kit: si adatta da quello del progetto
P5 (`site/kit/ufficio/flusso-p5-n8n.json`), come spiega il LEGGIMI. Il lato WordPress
è lo stesso endpoint di questo file, con lo stesso `status: draft` fisso.

Aggiornamenti e versioni nuove di questo kit: sull'hub del libro.
