claude-plugin-wordpress-manager 2.12.0 → 2.12.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,50 @@
2
2
 
3
3
  All notable changes to the WordPress Manager plugin for Claude Code.
4
4
 
5
+ ## [2.12.2] — 2026-03-01
6
+
7
+ ### Fixed — Structured Data Tools Rewrite
8
+
9
+ **sd_inject: content-block approach (replaces broken meta approach)**
10
+ - JSON-LD now injected as `<!-- wp:html -->` block in post content
11
+ - No mu-plugin or `register_post_meta()` required — works out of the box
12
+ - Idempotent: re-injecting same @type replaces existing block, no duplicates
13
+
14
+ **sd_list_schemas: content scanning (replaces broken meta scanning)**
15
+ - Scans post content for `<script type="application/ld+json">` blocks
16
+ - No longer depends on unregistered `_schema_json_ld` meta field
17
+
18
+ **sd_validate: multi-block support**
19
+ - Now finds ALL JSON-LD scripts on a page (not just the first)
20
+ - Reports per-schema issues with type labels
21
+
22
+ ### Validated end-to-end on opencactus.com
23
+ - sd_inject Article on post 2348: ✅
24
+ - sd_list_schemas finds injected schema: ✅
25
+ - sd_validate on live URL: ✅ (2 schemas detected)
26
+ - Idempotency verified: ✅
27
+
28
+ ## [2.12.1] — 2026-03-01
29
+
30
+ ### Fixed — Critical MCP Tool Parameter Passing
31
+
32
+ **Server registration fix (affects ~60 tools)**
33
+ - Fixed `toZodType()` conversion in server.js: tools defined with JSON Schema properties (plain objects) instead of Zod `.shape` references were not receiving parameters from the MCP client
34
+ - Affected modules: GSC (8), Mailchimp (7), Buffer (5), SendGrid (6), Slack (3), CWV (4), Plausible (4), GA4 (6), LinkedIn (5), Twitter (5), Schema (3), WC-Webhooks (4), WC-Workflows (4)
35
+ - Original WordPress core (44) and WooCommerce (30) tools were unaffected (use Zod `.shape`)
36
+
37
+ **Schema tool fixes**
38
+ - Fixed import `makeRequest` → `makeWordPressRequest` in schema.js (prevented server startup)
39
+ - Fixed duplicated REST API path `wp/v2/wp/v2/posts` → `posts` in sd_list_schemas and sd_inject
40
+
41
+ **Documentation**
42
+ - Corrected tool count from 145 to 148 across GUIDE.md and package.json
43
+ - WordPress core: Plugins 6 (not 5), Users 6 (not 5), Media 5 (not 4), +Search (1)
44
+
45
+ ### Validated end-to-end on opencactus.com
46
+ - `get_active_site`, `list_content`, `sd_validate` (markup + URL), `sd_list_schemas`
47
+ - GSC, Mailchimp tools return correct "not configured" errors
48
+
5
49
  ## [2.12.0] — 2026-03-01
6
50
 
7
51
  ### Added — Content Generation + Structured Data (Tier 7: Content Factory Completeness)
@@ -25,7 +69,7 @@ All notable changes to the WordPress Manager plugin for Claude Code.
25
69
  - Router v18 (+2 categories: content generation, structured data)
26
70
  - Updated wp-content-strategist agent with AI generation and schema procedures
27
71
 
28
- **Stats:** 41 → 43 skills | 142 → 145 MCP tools | Router v17 → v18
72
+ **Stats:** 41 → 43 skills | 142 → 148 MCP tools | Router v17 → v18
29
73
 
30
74
  ### WCOP Score
31
75
  - Content Factory: 9/10 → 10/10 (AI generation + structured data)
package/docs/GUIDE.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # WordPress Manager - Guida Completa per Utenti e Amministratori
2
2
 
3
- **Versione:** 2.9.0
3
+ **Versione:** 2.12.2
4
4
  **Ultimo aggiornamento:** 2026-03-01
5
5
  **Repository:** https://github.com/morrealev/wordpress-manager
6
6
 
@@ -69,6 +69,11 @@ WordPress Manager e un plugin per **Claude Code** (la CLI ufficiale di Anthropic
69
69
  - **Analytics unificata**: GA4, Plausible e Core Web Vitals in un unico punto di accesso, con dashboard, trend e confronto pagine
70
70
  - **Smart alerting**: routing alerting basato su severity (info→Slack webhook, warning→Slack Bot con thread, critical→Slack + email) via Slack e SendGrid
71
71
  - **Workflow automatizzati**: trigger basati su schedule (cron), hook WordPress e lifecycle contenuti con azioni multi-canale (Slack, email, webhook)
72
+ - **Pubblicare su LinkedIn**: postare contenuti nel feed, articoli long-form, analytics engagement (impressions, click, reaction)
73
+ - **Pubblicare su Twitter/X**: tweet singoli, thread multi-tweet, metriche interazioni, gestione tweet
74
+ - **Auto-transform contenuti**: convertire automaticamente post WordPress in tweet, thread, post LinkedIn, articoli LinkedIn, email snippet con template per piattaforma
75
+ - **Generare contenuti AI**: pipeline 7 step (brief → keyword research → outline → draft → SEO optimize → structured data → publish) con template e pattern
76
+ - **Gestire dati strutturati**: validare, iniettare e auditare Schema.org/JSON-LD (Article, Product, FAQ, HowTo, LocalBusiness, Event, Organization, BreadcrumbList)
72
77
 
73
78
  ### Requisiti
74
79
 
@@ -92,7 +97,7 @@ WordPress Manager e un plugin per **Claude Code** (la CLI ufficiale di Anthropic
92
97
  wordpress-manager plugin
93
98
  / | \
94
99
  Hostinger MCP WP REST Bridge WordPress.com MCP
95
- (119 tool) (85 tool) (~15 tool)
100
+ (119 tool) (148 tool) (~15 tool)
96
101
  | | |
97
102
  Infrastruttura Contenuti + Siti hosted
98
103
  DNS, SSL, VPS Plugin, Utenti su WordPress.com
@@ -105,7 +110,7 @@ WordPress Manager e un plugin per **Claude Code** (la CLI ufficiale di Anthropic
105
110
  ### Componenti del Plugin
106
111
 
107
112
  ```
108
- wordpress-manager/ # v2.9.0
113
+ wordpress-manager/ # v2.12.2
109
114
  +-- .claude-plugin/plugin.json # Manifest
110
115
  +-- .mcp.json # Server MCP bundled
111
116
  +-- LICENSE # MIT + GPL-2.0-or-later
@@ -113,7 +118,7 @@ wordpress-manager/ # v2.9.0
113
118
  +-- agents/ # 12 agenti specializzati
114
119
  | +-- wp-site-manager.md # Orchestratore centrale
115
120
  | +-- wp-deployment-engineer.md # Specialista deploy
116
- | +-- wp-content-strategist.md # Contenuti, SEO, GSC feedback, AI optimization
121
+ | +-- wp-content-strategist.md # Contenuti, SEO, GSC feedback, AI optimization, content generation, structured data
117
122
  | +-- wp-security-auditor.md # Audit sicurezza (read-only)
118
123
  | +-- wp-security-hardener.md # Hardening e incident response
119
124
  | +-- wp-performance-optimizer.md # Performance e CWV
@@ -122,10 +127,10 @@ wordpress-manager/ # v2.9.0
122
127
  | +-- wp-ecommerce-manager.md # WooCommerce store management (v1.8.0)
123
128
  | +-- wp-cicd-engineer.md # CI/CD pipeline specialist (v2.0.0)
124
129
  | +-- wp-monitoring-agent.md # Site monitoring read-only (v2.1.0)
125
- | +-- wp-distribution-manager.md # Multi-channel distribution (v2.4.0)
130
+ | +-- wp-distribution-manager.md # Multi-channel distribution + LinkedIn + Twitter/X (v2.10.0)
126
131
  +-- commands/ # 5 slash commands
127
132
  | +-- wp-status.md / wp-deploy.md / wp-audit.md / wp-backup.md / wp-setup.md
128
- +-- skills/ # 39 skill totali
133
+ +-- skills/ # 43 skill totali
129
134
  | +-- [OPERATIVE - 5 skill]
130
135
  | +-- wp-deploy/ # Procedure deploy
131
136
  | +-- wp-audit/ # Checklist audit
@@ -135,7 +140,7 @@ wordpress-manager/ # v2.9.0
135
140
  | +-- [AMBIENTE LOCALE - 1 skill]
136
141
  | +-- wp-local-env/ # Studio/LocalWP/wp-env
137
142
  | +-- [SVILUPPO - 13 skill da WordPress/agent-skills]
138
- | +-- wordpress-router/ # Router unificato v16 (dev + local + ops + multisite + cicd + monitoring + webhooks + repurposing + pseo + attribution + multilang + distribution + gsc + content-optimization + analytics + alerting + workflows)
143
+ | +-- wordpress-router/ # Router unificato v18 (dev + local + ops + multisite + cicd + monitoring + webhooks + repurposing + pseo + attribution + multilang + distribution + gsc + content-optimization + analytics + alerting + workflows + linkedin + twitter + content-generation + structured-data)
139
144
  | +-- wp-project-triage/ # Auto-detect tipo progetto
140
145
  | +-- wp-block-development/ # Blocchi Gutenberg
141
146
  | +-- wp-block-themes/ # Temi a blocchi
@@ -173,8 +178,13 @@ wordpress-manager/ # v2.9.0
173
178
  | +-- wp-analytics/ # GA4, Plausible, Core Web Vitals unificati (v2.7.0)
174
179
  | +-- wp-alerting/ # Smart alerting severity-based via Slack/SendGrid (v2.8.0)
175
180
  | +-- wp-content-workflows/ # Workflow triggers (schedule, lifecycle, hooks) con azioni multi-canale (v2.9.0)
176
- +-- hooks/ # 10 hook di sicurezza
177
- | +-- hooks.json # 8 prompt + 2 command
181
+ | +-- [DISTRIBUZIONE DIRETTA + CONTENT FACTORY - 4 skill]
182
+ | +-- wp-linkedin/ # LinkedIn direct posting e analytics (v2.10.0)
183
+ | +-- wp-twitter/ # Twitter/X direct posting e thread (v2.10.0)
184
+ | +-- wp-structured-data/ # Schema.org/JSON-LD validation e injection (v2.12.2)
185
+ | +-- wp-content-generation/ # AI content generation pipeline (v2.12.2)
186
+ +-- hooks/ # 12 hook di sicurezza
187
+ | +-- hooks.json # 10 prompt + 2 command
178
188
  | +-- scripts/ # Script per hook command-type
179
189
  +-- scripts/ # Utility
180
190
  +-- servers/wp-rest-bridge/ # MCP Server custom (TypeScript)
@@ -582,8 +592,8 @@ Il plugin include **12 agenti** organizzati per area di competenza. Alcuni agent
582
592
  | Proprieta | Valore |
583
593
  |-----------|--------|
584
594
  | Colore | Magenta |
585
- | Ruolo | Creazione contenuti, SEO, gestione editoriale, contenuti multilingue, GSC feedback, AI optimization |
586
- | Attivazione | Creazione post, ottimizzazione SEO, gestione tassonomie, keyword tracking, content optimization |
595
+ | Ruolo | Creazione contenuti, SEO, gestione editoriale, contenuti multilingue, GSC feedback, AI optimization, content generation, structured data |
596
+ | Attivazione | Creazione post, ottimizzazione SEO, gestione tassonomie, keyword tracking, content optimization, genera contenuto, structured data, Schema.org |
587
597
 
588
598
  **Ciclo di vita contenuti**:
589
599
  ```
@@ -609,7 +619,11 @@ IDEAZIONE -> BOZZA -> REVISIONE -> OTTIMIZZAZIONE -> PUBBLICAZIONE -> MONITORAGG
609
619
 
610
620
  **AI Content Optimization** (v2.6.0): Pipeline AI-driven in 5 step per ottimizzazione contenuti: headline scoring → readability analysis (Flesch-Kincaid) → SEO scoring → meta optimization → content freshness check. Include bulk triage per analisi rapida di tutti i contenuti con classificazione Quick Wins / Maintain / Deep Review / Outdated. Usa la skill `wp-content-optimization`.
611
621
 
612
- **Skill correlata**: `wp-content`, `wp-i18n`, `wp-content-repurposing`, `wp-programmatic-seo`, `wp-search-console`, `wp-content-optimization`
622
+ **AI Content Generation** (v2.12.2): Pipeline completa 7 step per generare contenuti da zero: brief → keyword research (GSC se disponibile) → outline (4 pattern: standard, tutorial, listicle, FAQ) → draft (calibrato sulla voce del sito) → SEO optimize → structured data injection → publish as draft. Procedure-based, usa tool MCP esistenti (`wp/v2`, `gsc_*`, `sd_*`). Usa la skill `wp-content-generation`.
623
+
624
+ **Structured Data Management** (v2.12.2): Gestione completa Schema.org/JSON-LD con 3 tool MCP dedicati: `sd_validate` (validazione markup via URL o inline), `sd_inject` (iniezione JSON-LD nei post), `sd_list_schemas` (audit sitewide). 8 tipi supportati: Article, Product, FAQ, HowTo, LocalBusiness, Event, Organization, BreadcrumbList. Usa la skill `wp-structured-data`.
625
+
626
+ **Skill correlata**: `wp-content`, `wp-i18n`, `wp-content-repurposing`, `wp-programmatic-seo`, `wp-search-console`, `wp-content-optimization`, `wp-content-generation`, `wp-structured-data`
613
627
 
614
628
  ---
615
629
 
@@ -860,27 +874,30 @@ Complementa `wp-security-auditor`: l'auditor **trova** i problemi, l'hardener **
860
874
  | Proprieta | Valore |
861
875
  |-----------|--------|
862
876
  | Colore | Indigo |
863
- | Ruolo | Distribuzione multi-canale contenuti su Mailchimp, Buffer e SendGrid |
864
- | Attivazione | "Distribuisci il post", "invia newsletter", "programma social", "email campaign", "Buffer schedule" |
877
+ | Ruolo | Distribuzione multi-canale contenuti su Mailchimp, Buffer, SendGrid, LinkedIn e Twitter/X |
878
+ | Attivazione | "Distribuisci il post", "invia newsletter", "programma social", "email campaign", "Buffer schedule", "pubblica su LinkedIn", "pubblica tweet", "Twitter thread" |
865
879
 
866
- **3 canali supportati**:
880
+ **5 canali supportati**:
867
881
 
868
882
  | Canale | Servizio | Tool prefix | Operazioni |
869
883
  |--------|----------|-------------|-----------|
870
884
  | Email Marketing | Mailchimp | `mc_*` | Liste, campagne, template, audience |
871
- | Social Media | Buffer | `buf_*` | Profili, post scheduling, analytics |
885
+ | Social Scheduling | Buffer | `buf_*` | Profili, post scheduling, analytics |
872
886
  | Email Transazionale | SendGrid | `sg_*` | Template, invio, contatti, statistiche |
887
+ | LinkedIn Direct | LinkedIn API | `li_*` | Post feed, articoli long-form, analytics engagement (v2.10.0) |
888
+ | Twitter/X Direct | Twitter API v2 | `tw_*` | Tweet, thread, metriche, gestione tweet (v2.10.0) |
873
889
 
874
890
  **Workflow distribuzione**:
875
891
  1. Seleziona contenuto WordPress da distribuire (via `list_content`)
876
892
  2. Detection con `distribution_inspect.mjs` (servizi configurati, credenziali)
877
893
  3. Adatta contenuto per ogni canale (lunghezza, formato, CTA)
878
- 4. Programma o invia su canali selezionati
879
- 5. Report: conferma invio, link preview, metriche
894
+ 4. Auto-transform se disponibile: usa template pipeline per conversioni blog→tweet, blog→thread, blog→LinkedIn post (v2.11.0)
895
+ 5. Programma o invia su canali selezionati
896
+ 6. Report: conferma invio, link preview, metriche
880
897
 
881
- **Prerequisiti**: Almeno un servizio configurato in `WP_SITES_CONFIG` (Mailchimp API key, Buffer access token, o SendGrid API key).
898
+ **Prerequisiti**: Almeno un servizio configurato in `WP_SITES_CONFIG` (Mailchimp API key, Buffer access token, SendGrid API key, LinkedIn access token, o Twitter Bearer/OAuth tokens).
882
899
 
883
- **Skill correlata**: `wp-social-email`
900
+ **Skill correlata**: `wp-social-email`, `wp-linkedin`, `wp-twitter`, `wp-content-repurposing`
884
901
 
885
902
  ---
886
903
 
@@ -906,7 +923,7 @@ Il `wp-site-manager` puo delegare a tutti i 12 agent specializzati:
906
923
  | WooCommerce, e-commerce | `wp-ecommerce-manager` |
907
924
  | CI/CD pipeline | `wp-cicd-engineer` |
908
925
  | Site monitoring e health reports | `wp-monitoring-agent` |
909
- | Distribuzione social/email | `wp-distribution-manager` |
926
+ | Distribuzione social/email, LinkedIn, Twitter | `wp-distribution-manager` |
910
927
 
911
928
  ---
912
929
 
@@ -948,10 +965,11 @@ Le skill di sviluppo provengono da due fonti:
948
965
  - **3 skill strategia + SEO internazionale** (MIT) aggiunte in v2.3.0: Programmatic SEO, Content-Commerce Attribution, Multi-Language Network.
949
966
  - **3 skill distribuzione + SEO avanzato** (MIT) aggiunte in v2.4.0-v2.6.0: Social/Email Distribution, Google Search Console, AI Content Optimization.
950
967
  - **3 skill analytics + alerting + automazione** (MIT) aggiunte in v2.7.0-v2.9.0: Analytics (GA4/Plausible/CWV), Smart Alerting (Slack/SendGrid severity routing), Automated Workflows (triggers + multi-channel actions).
968
+ - **4 skill distribuzione diretta + content factory** (MIT) aggiunte in v2.10.0-v2.12.2: LinkedIn Direct (posting + analytics), Twitter/X Direct (tweet + thread + metriche), Structured Data (Schema.org/JSON-LD), AI Content Generation (pipeline 7-step).
951
969
 
952
970
  ### Il Router Unificato
953
971
 
954
- La skill `wordpress-router` (v16) e il punto d'ingresso per tutti i task WordPress. Classifica automaticamente il task in **diciassette categorie**: sviluppo, ambiente locale, operativo, multisite, CI/CD, monitoring, content repurposing, webhook, programmatic SEO, content attribution, multi-language network, social/email distribution, search console, content optimization, analytics, alerting, content workflows.
972
+ La skill `wordpress-router` (v18) e il punto d'ingresso per tutti i task WordPress. Classifica automaticamente il task in **ventuno categorie**: sviluppo, ambiente locale, operativo, multisite, CI/CD, monitoring, content repurposing, webhook, programmatic SEO, content attribution, multi-language network, social/email distribution, search console, content optimization, analytics, alerting, content workflows, LinkedIn, Twitter/X, content generation, structured data.
955
973
 
956
974
  ```
957
975
  Utente: "Crea un blocco custom per la gallery"
@@ -1166,7 +1184,7 @@ Aggiunte in v2.4.0-v2.6.0, queste skill coprono distribuzione multi-canale, Goog
1166
1184
 
1167
1185
  ### Panoramica Skills Analytics + Alerting + Automazione (3)
1168
1186
 
1169
- Aggiunte in v2.7.0-v2.9.0, queste skill completano il WCOP (WordPress Content Operations Pipeline) portando il punteggio da 8/10 a 8.8/10.
1187
+ Aggiunte in v2.7.0-v2.9.0, queste skill completano il layer Observability + Automation del WCOP (WordPress Content Operations Pipeline).
1170
1188
 
1171
1189
  | Skill | Si attiva quando... | Risorse | Agent dedicato |
1172
1190
  |-------|---------------------|---------|----------------|
@@ -1174,9 +1192,20 @@ Aggiunte in v2.7.0-v2.9.0, queste skill completano il WCOP (WordPress Content Op
1174
1192
  | `wp-alerting` | "alert Slack", "notifica critiche", "severity routing", "escalation", "alert email" | 4 reference files, alerting_inspect.mjs | `wp-monitoring-agent` |
1175
1193
  | `wp-content-workflows` | "crea trigger", "workflow cron", "content lifecycle", "automatizza notifiche", "trigger schedule" | 5 reference files, workflow_inspect.mjs | `wp-site-manager` |
1176
1194
 
1195
+ ### Panoramica Skills Distribuzione Diretta + Content Factory (4)
1196
+
1197
+ Aggiunte in v2.10.0-v2.12.2, queste skill completano il WCOP portando il punteggio totale da 8.8/10 a 9.2/10 (Distribution 9/10, Content Factory 10/10).
1198
+
1199
+ | Skill | Si attiva quando... | Risorse | Agent dedicato |
1200
+ |-------|---------------------|---------|----------------|
1201
+ | `wp-linkedin` | "pubblica su LinkedIn", "LinkedIn post", "LinkedIn article", "B2B social", "LinkedIn analytics" | 3 reference files, linkedin_inspect.mjs | `wp-distribution-manager` |
1202
+ | `wp-twitter` | "pubblica tweet", "Twitter thread", "tweet analytics", "Twitter/X", "crea thread" | 3 reference files, twitter_inspect.mjs | `wp-distribution-manager` |
1203
+ | `wp-structured-data` | "structured data", "Schema.org", "JSON-LD", "rich snippet", "dati strutturati", "FAQ schema" | 3 reference files, schema_inspect.mjs | `wp-content-strategist` |
1204
+ | `wp-content-generation` | "genera contenuto", "scrivi post AI", "content brief", "crea articolo", "draft post" | 3 reference files, content_gen_inspect.mjs | `wp-content-strategist` |
1205
+
1177
1206
  ### Script di Rilevamento Automatico
1178
1207
 
1179
- Le skill includono 27 script Node.js (`.mjs`) che eseguono analisi automatica del progetto:
1208
+ Le skill includono 31 script Node.js (`.mjs`) che eseguono analisi automatica del progetto:
1180
1209
 
1181
1210
  | Script | Cosa rileva |
1182
1211
  |--------|-------------|
@@ -1207,6 +1236,10 @@ Le skill includono 27 script Node.js (`.mjs`) che eseguono analisi automatica de
1207
1236
  | `analytics_inspect.mjs` | GA4 property ID, Plausible config, Google API key, analytics setup (v2.7.0) |
1208
1237
  | `alerting_inspect.mjs` | Slack webhook/bot token, SendGrid config, monitoring setup, alert readiness (v2.8.0) |
1209
1238
  | `workflow_inspect.mjs` | Action channel config, automation plugins, custom REST endpoints, WP-Cron, webhook config (v2.9.0) |
1239
+ | `linkedin_inspect.mjs` | LinkedIn access token, profile info, API connectivity (v2.10.0) |
1240
+ | `twitter_inspect.mjs` | Twitter Bearer token, OAuth tokens, API v2 connectivity (v2.10.0) |
1241
+ | `schema_inspect.mjs` | SEO plugins (Yoast, Rank Math), existing JSON-LD in theme, Schema Pro (v2.12.2) |
1242
+ | `content_gen_inspect.mjs` | REST access, GSC credentials, pipeline step availability (v2.12.2) |
1210
1243
 
1211
1244
  ### WordPress Playground — Ambienti Disposable
1212
1245
 
@@ -1241,7 +1274,7 @@ Senza il server MCP, la skill usa conoscenza generale di `@wordpress/components`
1241
1274
  ```
1242
1275
  1. cd mio-progetto-wordpress/
1243
1276
  2. Claude esegue wp-project-triage → rileva "wp-block-plugin"
1244
- 3. wordpress-router v16 → instrada a wp-block-development
1277
+ 3. wordpress-router v18 → instrada a wp-block-development
1245
1278
  4. Claude guida la creazione con block.json, edit.js, save.js
1246
1279
  5. wp-e2e-testing + wp-test-engineer → esegue test E2E con Playwright
1247
1280
  6. wp-accessibility + wp-accessibility-auditor → verifica WCAG 2.2
@@ -1323,6 +1356,8 @@ Questi hook chiedono a Claude di valutare se l'operazione e stata esplicitamente
1323
1356
  | 6 | Invio campagna Mailchimp | `mc_send_campaign` | Conferma prima di inviare una campagna email (azione irreversibile verso tutti i destinatari) |
1324
1357
  | 7 | Invio email SendGrid | `sg_send_email` | Conferma prima di inviare email transazionali (azione irreversibile) |
1325
1358
  | 8 | Eliminazione workflow trigger | `wf_delete_trigger` | Conferma prima di eliminare un trigger di automazione (ferma tutte le notifiche e azioni associate) |
1359
+ | 9 | Eliminazione tweet | `tw_delete_tweet` | Conferma prima di eliminare un tweet (azione irreversibile) |
1360
+ | 10 | Pubblicazione articolo LinkedIn | `li_create_article` | Conferma prima di pubblicare un articolo long-form su LinkedIn (visibile pubblicamente) |
1326
1361
 
1327
1362
  ### Hook Command-Based (Validazione Script)
1328
1363
 
@@ -1379,19 +1414,20 @@ MCP (Model Context Protocol) e il protocollo che permette a Claude di comunicare
1379
1414
  | Sorgente | Custom TypeScript server in `servers/wp-rest-bridge/` |
1380
1415
  | Trasporto | stdio (JSON-RPC via stdin/stdout) |
1381
1416
  | Autenticazione | `WP_SITES_CONFIG` JSON env var |
1382
- | Tool disponibili | 132 (41 WordPress + 34 WooCommerce + 10 Multisite + 18 Distribution + 8 GSC + 14 Analytics + 3 Alerting + 4 Workflows) |
1417
+ | Tool disponibili | 148 (44 WordPress + 34 WooCommerce + 10 Multisite + 18 Distribution + 8 GSC + 14 Analytics + 3 Alerting + 4 Workflows + 5 LinkedIn + 5 Twitter + 3 Schema) |
1383
1418
 
1384
1419
  **Categorie tool WordPress** (`wp/v2`):
1385
1420
 
1386
1421
  | Categoria | Tool | Esempio |
1387
1422
  |-----------|------|---------|
1388
1423
  | Multi-site | 3 | `switch_site`, `list_sites`, `get_active_site` |
1389
- | Content | 8 | `list_content`, `create_content`, `find_content_by_url` |
1390
- | Taxonomies | 8 | `list_terms`, `create_term`, `assign_terms_to_content` |
1391
- | Plugins | 5 | `list_plugins`, `activate_plugin`, `deactivate_plugin` |
1392
- | Users | 5 | `list_users`, `create_user`, `update_user` |
1393
- | Comments | 5 | `list_comments`, `create_comment`, `delete_comment` |
1394
- | Media | 4 | `list_media`, `create_media`, `delete_media` |
1424
+ | Content | 8 | `list_content`, `get_content`, `create_content`, `find_content_by_url` |
1425
+ | Taxonomies | 8 | `list_terms`, `get_term`, `create_term`, `assign_terms_to_content` |
1426
+ | Plugins | 6 | `list_plugins`, `get_plugin`, `activate_plugin`, `deactivate_plugin`, `create_plugin`, `delete_plugin` |
1427
+ | Users | 6 | `list_users`, `get_user`, `get_me`, `create_user`, `update_user`, `delete_user` |
1428
+ | Comments | 5 | `list_comments`, `get_comment`, `create_comment`, `update_comment`, `delete_comment` |
1429
+ | Media | 5 | `list_media`, `get_media`, `create_media`, `edit_media`, `delete_media` |
1430
+ | Search | 1 | `wp_search` |
1395
1431
  | WP.org | 2 | `search_plugin_repository`, `get_plugin_details` |
1396
1432
 
1397
1433
  **Categorie tool WooCommerce** (`wc/v3`, richiede Consumer Key/Secret):
@@ -1451,6 +1487,32 @@ MCP (Model Context Protocol) e il protocollo che permette a Claude di comunicare
1451
1487
  |-----------|------|---------|
1452
1488
  | Trigger Management | 4 | `wf_list_triggers`, `wf_create_trigger`, `wf_update_trigger`, `wf_delete_trigger` |
1453
1489
 
1490
+ **Categorie tool LinkedIn** (`li_` prefix, richiede LinkedIn Access Token):
1491
+
1492
+ | Categoria | Tool | Esempio |
1493
+ |-----------|------|---------|
1494
+ | Profile | 1 | `li_get_profile` |
1495
+ | Publishing | 2 | `li_create_post` (feed post), `li_create_article` (long-form article) |
1496
+ | Analytics | 1 | `li_get_analytics` (impressions, clicks, engagement rate) |
1497
+ | Listing | 1 | `li_list_posts` (recent user posts) |
1498
+
1499
+ **Categorie tool Twitter/X** (`tw_` prefix, richiede Twitter Bearer Token + OAuth):
1500
+
1501
+ | Categoria | Tool | Esempio |
1502
+ |-----------|------|---------|
1503
+ | Publishing | 2 | `tw_create_tweet` (single tweet), `tw_create_thread` (connected thread) |
1504
+ | Analytics | 1 | `tw_get_metrics` (impressions, likes, retweets, quotes) |
1505
+ | Listing | 1 | `tw_list_tweets` (recent user tweets) |
1506
+ | Management | 1 | `tw_delete_tweet` |
1507
+
1508
+ **Categorie tool Structured Data** (`sd_` prefix, usa WordPress REST API):
1509
+
1510
+ | Categoria | Tool | Esempio |
1511
+ |-----------|------|---------|
1512
+ | Validation | 1 | `sd_validate` (URL fetch + inline markup, controlla @context/@type) |
1513
+ | Injection | 1 | `sd_inject` (build JSON-LD, store in post meta `_schema_json_ld`) |
1514
+ | Audit | 1 | `sd_list_schemas` (scan sitewide, count per @type) |
1515
+
1454
1516
  **Architettura multi-sito**: Il server mantiene una `Map<siteId, AxiosInstance>` dove ogni sito ha la propria istanza HTTP autenticata. Il cambio sito e istantaneo.
1455
1517
 
1456
1518
  #### WordPress.com MCP
@@ -1934,6 +1996,67 @@ Claude (attiva wp-site-manager + skill wp-content-workflows):
1934
1996
  -> Report: 2 trigger configurati, Slack + email, prossima esecuzione cron
1935
1997
  ```
1936
1998
 
1999
+ ### Scenario 29: Pubblicare su LinkedIn dal Blog
2000
+
2001
+ ```
2002
+ Tu: "Pubblica l'ultimo post del blog su LinkedIn come post nel feed"
2003
+
2004
+ Claude (attiva wp-distribution-manager + skill wp-linkedin):
2005
+ 1. Detection con linkedin_inspect.mjs (access token configurato?)
2006
+ 2. Seleziona ultimo post via list_content
2007
+ 3. Estrae headline, key points, URL del post
2008
+ 4. Genera post LinkedIn (max 1300 char): hook + 3 insight + CTA + link
2009
+ 5. Pubblica con li_create_post
2010
+ 6. Recupera analytics con li_get_analytics (impressions, click, engagement)
2011
+ -> Report: post pubblicato, link al post LinkedIn, metriche iniziali
2012
+ ```
2013
+
2014
+ ### Scenario 30: Thread Twitter/X dal Blog
2015
+
2016
+ ```
2017
+ Tu: "Crea un thread Twitter dal mio ultimo articolo sul fico d'India"
2018
+
2019
+ Claude (attiva wp-distribution-manager + skill wp-twitter):
2020
+ 1. Detection con twitter_inspect.mjs (OAuth tokens configurati?)
2021
+ 2. Seleziona post via list_content (filtro keyword)
2022
+ 3. Estrae headline, H2 sections, key facts
2023
+ 4. Genera thread: hook tweet (280 char) + 3-5 tweet di contenuto (uno per H2) + CTA finale
2024
+ 5. Pubblica con tw_create_thread (connected tweets)
2025
+ 6. Recupera metriche con tw_get_metrics (impressions, like, retweet)
2026
+ -> Report: thread pubblicato (N tweet), link al primo tweet, metriche
2027
+ ```
2028
+
2029
+ ### Scenario 31: Generare Contenuto AI da Zero
2030
+
2031
+ ```
2032
+ Tu: "Scrivi un articolo sui benefici dell'acqua di cactus per l'idratazione"
2033
+
2034
+ Claude (attiva wp-content-strategist + skill wp-content-generation):
2035
+ 1. Brief: topic = acqua di cactus, audience = consumatori health-conscious, goal = informare, 1200-1500 parole
2036
+ 2. Keyword research: se GSC disponibile, gsc_query_analytics per keyword correlate; altrimenti suggerisce keyword semantiche
2037
+ 3. Outline: pattern "Standard Article" — intro + 4 H2 (benefici, scienza, vs alternative, come usare) + conclusione
2038
+ 4. Draft: scrive contenuto calibrato sulla voce del sito (analizza ultimi 5 post per tono)
2039
+ 5. SEO optimize: keyword in title/first paragraph/H2s, meta description, 2-3 internal links
2040
+ 6. Structured data: auto-detect Article schema, inject con sd_inject
2041
+ 7. Pubblica come bozza via create_content, presenta per revisione
2042
+ -> Output: articolo completo con SEO + schema, pronto per approvazione
2043
+ ```
2044
+
2045
+ ### Scenario 32: Audit e Injection Dati Strutturati
2046
+
2047
+ ```
2048
+ Tu: "Controlla quali pagine hanno dati strutturati e aggiungi FAQ schema ai post con domande"
2049
+
2050
+ Claude (attiva wp-content-strategist + skill wp-structured-data):
2051
+ 1. Audit esistente: sd_list_schemas per vedere tipi presenti (Article su 12 post, nessun FAQ)
2052
+ 2. Validazione: sd_validate su homepage e top 5 pagine per verificare markup corretto
2053
+ 3. Scan FAQ: list_content + analisi corpo per identificare pattern Q&A (H3 con "?")
2054
+ 4. Per ogni post con FAQ: genera FAQPage schema con mainEntity array
2055
+ 5. Injection: sd_inject per iniettare JSON-LD nei post identificati
2056
+ 6. Verifica: sd_validate su pagine modificate per confermare validita
2057
+ -> Report: N post con FAQ schema aggiunto, validazione completata, prossimi step
2058
+ ```
2059
+
1937
2060
  ---
1938
2061
 
1939
2062
  ## 14. Amministrazione Avanzata
@@ -2240,6 +2363,6 @@ bash ~/.claude/plugins/local/wordpress-manager/scripts/validate-wp-operation.sh
2240
2363
 
2241
2364
  ---
2242
2365
 
2243
- *Guida v2.9.0 — WordPress Manager Plugin per Claude Code*
2366
+ *Guida v2.12.2 — WordPress Manager Plugin per Claude Code*
2244
2367
  *Ultimo aggiornamento: 2026-03-01*
2245
2368
  *WCOP Score: 8.8/10 (Tier 4+5 complete)*
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "claude-plugin-wordpress-manager",
3
- "version": "2.12.0",
4
- "description": "Unified WordPress management and development plugin for Claude Code. Orchestrates Hostinger MCP, WP REST API bridge (145 tools incl. 30 WooCommerce + 10 Multisite + 4 Webhooks + 7 Mailchimp + 5 Buffer + 6 SendGrid + 8 GSC + 6 GA4 + 4 Plausible + 4 CWV + 3 Slack + 4 Workflows + 5 LinkedIn + 5 Twitter + 3 Schema), and WordPress.com MCP with 43 skills, 12 agents, and security hooks. v2.12.0 completes WCOP Tier 6+7 with content generation + structured data.",
3
+ "version": "2.12.2",
4
+ "description": "Unified WordPress management and development plugin for Claude Code. Orchestrates Hostinger MCP, WP REST API bridge (148 tools incl. 30 WooCommerce + 10 Multisite + 4 Webhooks + 7 Mailchimp + 5 Buffer + 6 SendGrid + 8 GSC + 6 GA4 + 4 Plausible + 4 CWV + 3 Slack + 4 Workflows + 5 LinkedIn + 5 Twitter + 3 Schema), and WordPress.com MCP with 43 skills, 12 agents, and security hooks. v2.12.0 completes WCOP Tier 6+7 with content generation + structured data.",
5
5
  "author": {
6
6
  "name": "vinmor",
7
7
  "email": "morreale.v@gmail.com"
@@ -30,6 +30,25 @@ server.tool('get_active_site', {}, async () => {
30
30
  const { getActiveSite } = await import('./wordpress.js');
31
31
  return { content: [{ type: 'text', text: getActiveSite() }] };
32
32
  });
33
+ // Convert a JSON Schema property to a Zod type, or return as-is if already Zod
34
+ function toZodType(prop, isRequired) {
35
+ if (prop instanceof z.ZodType)
36
+ return prop;
37
+ let zodType;
38
+ switch (prop.type) {
39
+ case 'string': zodType = z.string(); break;
40
+ case 'number': case 'integer': zodType = z.number(); break;
41
+ case 'boolean': zodType = z.boolean(); break;
42
+ case 'array': zodType = z.array(z.any()); break;
43
+ case 'object': zodType = z.record(z.any()); break;
44
+ default: zodType = z.any();
45
+ }
46
+ if (prop.description)
47
+ zodType = zodType.describe(prop.description);
48
+ if (!isRequired)
49
+ zodType = zodType.optional();
50
+ return zodType;
51
+ }
33
52
  // Register all WordPress content tools from the ported modules
34
53
  for (const tool of allTools) {
35
54
  const handler = toolHandlers[tool.name];
@@ -45,8 +64,13 @@ for (const tool of allTools) {
45
64
  isError: result.toolResult.isError,
46
65
  };
47
66
  };
48
- const zodSchema = z.object(tool.inputSchema.properties);
49
- server.tool(tool.name, zodSchema.shape, wrappedHandler);
67
+ const props = tool.inputSchema.properties || {};
68
+ const required = tool.inputSchema.required || [];
69
+ const zodShape = {};
70
+ for (const [key, prop] of Object.entries(props)) {
71
+ zodShape[key] = toZodType(prop, required.includes(key));
72
+ }
73
+ server.tool(tool.name, zodShape, wrappedHandler);
50
74
  }
51
75
  async function main() {
52
76
  const { logToStderr, initWordPress } = await import('./wordpress.js');
@@ -1,4 +1,4 @@
1
- import { makeRequest, getActiveSite } from '../wordpress.js';
1
+ import { makeWordPressRequest, getActiveSite } from '../wordpress.js';
2
2
  import axios from 'axios';
3
3
  import { z } from 'zod';
4
4
 
@@ -72,29 +72,35 @@ export const schemaHandlers = {
72
72
  return { toolResult: { isError: true, content: [{ type: "text", text: "Invalid JSON in markup parameter." }] } };
73
73
  }
74
74
  } else {
75
- // Fetch URL and extract JSON-LD
75
+ // Fetch URL and extract ALL JSON-LD blocks
76
76
  const response = await axios.get(url, { timeout: 15000 });
77
77
  const html = response.data;
78
- const jsonLdMatch = html.match(/<script[^>]*type="application\/ld\+json"[^>]*>([\s\S]*?)<\/script>/i);
79
- if (!jsonLdMatch) {
80
- return { toolResult: { content: [{ type: "text", text: JSON.stringify({ valid: false, error: "No JSON-LD found on page", url }, null, 2) }] } };
78
+ const jsonLdRegex = /<script[^>]*type="application\/ld\+json"[^>]*>([\s\S]*?)<\/script>/gi;
79
+ const allJsonLd = [];
80
+ let match;
81
+ while ((match = jsonLdRegex.exec(html)) !== null) {
82
+ try {
83
+ const parsed = JSON.parse(match[1]);
84
+ if (Array.isArray(parsed)) allJsonLd.push(...parsed);
85
+ else allJsonLd.push(parsed);
86
+ } catch { /* skip invalid JSON-LD blocks */ }
81
87
  }
82
- try {
83
- jsonLd = JSON.parse(jsonLdMatch[1]);
84
- } catch {
85
- return { toolResult: { content: [{ type: "text", text: JSON.stringify({ valid: false, error: "Invalid JSON-LD on page", url }, null, 2) }] } };
88
+ if (allJsonLd.length === 0) {
89
+ return { toolResult: { content: [{ type: "text", text: JSON.stringify({ valid: false, error: "No valid JSON-LD found on page", url }, null, 2) }] } };
86
90
  }
91
+ jsonLd = allJsonLd;
87
92
  }
88
93
 
89
94
  // Basic Schema.org validation
90
95
  const issues = [];
91
96
  const schemas = Array.isArray(jsonLd) ? jsonLd : [jsonLd];
92
97
  for (const schema of schemas) {
93
- if (!schema['@context'] || !schema['@context'].includes('schema.org')) {
94
- issues.push('Missing or invalid @context (should include schema.org)');
98
+ const schemaLabel = schema['@type'] || '(unnamed)';
99
+ if (!schema['@context'] || !String(schema['@context']).includes('schema.org')) {
100
+ issues.push(`${schemaLabel}: Missing or invalid @context (should include schema.org)`);
95
101
  }
96
102
  if (!schema['@type']) {
97
- issues.push('Missing @type');
103
+ issues.push(`${schemaLabel}: Missing @type`);
98
104
  }
99
105
  }
100
106
 
@@ -119,12 +125,22 @@ export const schemaHandlers = {
119
125
  '@context': 'https://schema.org',
120
126
  '@type': schema_type,
121
127
  ...schema_data,
122
- });
123
- // Store JSON-LD in post meta via WordPress REST API
124
- const response = await makeRequest('POST', `wp/v2/posts/${post_id}`, {
125
- meta: { _schema_json_ld: jsonLd },
126
- });
127
- return { toolResult: { content: [{ type: "text", text: JSON.stringify({ success: true, post_id, schema_type, stored: true }, null, 2) }] } };
128
+ }, null, 2);
129
+ const scriptBlock = `\n<!-- wp:html -->\n<script type="application/ld+json">\n${jsonLd}\n</script>\n<!-- /wp:html -->`;
130
+ // Fetch current post content
131
+ const post = await makeWordPressRequest('GET', `posts/${post_id}`, { _fields: 'content', context: 'edit' });
132
+ let content = post.content?.raw || post.content?.rendered || '';
133
+ // Remove existing JSON-LD block for this schema type if present
134
+ const existingPattern = new RegExp(
135
+ `\\n?<!-- wp:html -->\\n<script type="application/ld\\+json">\\n[\\s\\S]*?"@type":\\s*"${schema_type}"[\\s\\S]*?</script>\\n<!-- /wp:html -->`,
136
+ 'g'
137
+ );
138
+ content = content.replace(existingPattern, '');
139
+ // Append new JSON-LD block
140
+ content = content.trimEnd() + scriptBlock;
141
+ // Update post
142
+ await makeWordPressRequest('POST', `posts/${post_id}`, { content });
143
+ return { toolResult: { content: [{ type: "text", text: JSON.stringify({ success: true, post_id, schema_type, method: 'content_block', note: 'JSON-LD injected as wp:html block in post content' }, null, 2) }] } };
128
144
  } catch (error) {
129
145
  const errorMessage = error.response?.data?.message || error.message;
130
146
  return { toolResult: { isError: true, content: [{ type: "text", text: `Error injecting schema: ${errorMessage}` }] } };
@@ -134,19 +150,24 @@ export const schemaHandlers = {
134
150
  sd_list_schemas: async (params) => {
135
151
  try {
136
152
  const { schema_type } = params;
137
- // Fetch recent posts and check for JSON-LD in meta
138
- const posts = await makeRequest('GET', 'wp/v2/posts', { per_page: 100, _fields: 'id,title,meta' });
153
+ // Fetch posts and scan content for JSON-LD script blocks
154
+ const posts = await makeWordPressRequest('GET', 'posts', { per_page: 100, _fields: 'id,title,content' });
139
155
  const schemas = {};
156
+ const jsonLdRegex = /<script[^>]*type="application\/ld\+json"[^>]*>([\s\S]*?)<\/script>/gi;
140
157
  for (const post of posts) {
141
- const meta = post.meta?._schema_json_ld;
142
- if (meta) {
158
+ const content = post.content?.rendered || '';
159
+ let match;
160
+ while ((match = jsonLdRegex.exec(content)) !== null) {
143
161
  try {
144
- const parsed = JSON.parse(meta);
145
- const type = parsed['@type'] || 'Unknown';
146
- if (schema_type && type !== schema_type) continue;
147
- if (!schemas[type]) schemas[type] = { count: 0, posts: [] };
148
- schemas[type].count++;
149
- schemas[type].posts.push({ id: post.id, title: post.title?.rendered });
162
+ const parsed = JSON.parse(match[1]);
163
+ const items = Array.isArray(parsed) ? parsed : [parsed];
164
+ for (const item of items) {
165
+ const type = item['@type'] || 'Unknown';
166
+ if (schema_type && type !== schema_type) continue;
167
+ if (!schemas[type]) schemas[type] = { count: 0, posts: [] };
168
+ schemas[type].count++;
169
+ schemas[type].posts.push({ id: post.id, title: post.title?.rendered });
170
+ }
150
171
  } catch { /* skip invalid JSON */ }
151
172
  }
152
173
  }