claude-plugin-wordpress-manager 2.4.0 → 2.9.0
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/.claude-plugin/plugin.json +10 -3
- package/CHANGELOG.md +103 -0
- package/agents/wp-content-strategist.md +104 -0
- package/agents/wp-monitoring-agent.md +44 -0
- package/agents/wp-site-manager.md +19 -0
- package/docs/GUIDE.md +183 -23
- package/docs/plans/2026-03-01-tier4-5-implementation.md +1783 -0
- package/docs/plans/2026-03-01-tier4-5-observability-automation-design.md +426 -0
- package/docs/plans/2026-03-01-wcop-reassessment-v2.6.0.md +403 -0
- package/hooks/hooks.json +9 -0
- package/package.json +19 -3
- package/servers/wp-rest-bridge/build/tools/comments.d.ts +6 -6
- package/servers/wp-rest-bridge/build/tools/cwv.d.ts +3 -0
- package/servers/wp-rest-bridge/build/tools/cwv.js +196 -0
- package/servers/wp-rest-bridge/build/tools/ga4.d.ts +3 -0
- package/servers/wp-rest-bridge/build/tools/ga4.js +323 -0
- package/servers/wp-rest-bridge/build/tools/gsc.d.ts +3 -0
- package/servers/wp-rest-bridge/build/tools/gsc.js +354 -0
- package/servers/wp-rest-bridge/build/tools/index.d.ts +38 -38
- package/servers/wp-rest-bridge/build/tools/index.js +18 -0
- package/servers/wp-rest-bridge/build/tools/media.d.ts +2 -2
- package/servers/wp-rest-bridge/build/tools/multisite-sites.d.ts +2 -2
- package/servers/wp-rest-bridge/build/tools/plausible.d.ts +3 -0
- package/servers/wp-rest-bridge/build/tools/plausible.js +207 -0
- package/servers/wp-rest-bridge/build/tools/plugin-repository.d.ts +1 -1
- package/servers/wp-rest-bridge/build/tools/search.d.ts +2 -2
- package/servers/wp-rest-bridge/build/tools/slack.d.ts +3 -0
- package/servers/wp-rest-bridge/build/tools/slack.js +129 -0
- package/servers/wp-rest-bridge/build/tools/unified-content.d.ts +8 -8
- package/servers/wp-rest-bridge/build/tools/unified-taxonomies.d.ts +4 -4
- package/servers/wp-rest-bridge/build/tools/users.d.ts +6 -6
- package/servers/wp-rest-bridge/build/tools/wc-coupons.d.ts +1 -1
- package/servers/wp-rest-bridge/build/tools/wc-customers.d.ts +3 -3
- package/servers/wp-rest-bridge/build/tools/wc-orders.d.ts +4 -4
- package/servers/wp-rest-bridge/build/tools/wc-products.d.ts +8 -8
- package/servers/wp-rest-bridge/build/tools/wc-webhooks.d.ts +4 -4
- package/servers/wp-rest-bridge/build/tools/wc-workflows.d.ts +3 -0
- package/servers/wp-rest-bridge/build/tools/wc-workflows.js +222 -0
- package/servers/wp-rest-bridge/build/wordpress.d.ts +23 -0
- package/servers/wp-rest-bridge/build/wordpress.js +178 -0
- package/servers/wp-rest-bridge/package.json +1 -0
- package/skills/wordpress-router/SKILL.md +1 -1
- package/skills/wordpress-router/references/decision-tree.md +12 -2
- package/skills/wp-alerting/SKILL.md +142 -0
- package/skills/wp-alerting/references/alert-thresholds.md +79 -0
- package/skills/wp-alerting/references/escalation-paths.md +92 -0
- package/skills/wp-alerting/references/report-scheduling.md +142 -0
- package/skills/wp-alerting/references/slack-integration.md +109 -0
- package/skills/wp-alerting/scripts/alerting_inspect.mjs +150 -0
- package/skills/wp-analytics/SKILL.md +158 -0
- package/skills/wp-analytics/references/analytics-dashboards.md +83 -0
- package/skills/wp-analytics/references/cwv-monitoring.md +101 -0
- package/skills/wp-analytics/references/ga4-integration.md +76 -0
- package/skills/wp-analytics/references/plausible-setup.md +92 -0
- package/skills/wp-analytics/references/traffic-attribution.md +92 -0
- package/skills/wp-analytics/scripts/analytics_inspect.mjs +153 -0
- package/skills/wp-content/SKILL.md +1 -0
- package/skills/wp-content-attribution/SKILL.md +3 -0
- package/skills/wp-content-optimization/SKILL.md +173 -0
- package/skills/wp-content-optimization/references/content-freshness.md +234 -0
- package/skills/wp-content-optimization/references/headline-optimization.md +171 -0
- package/skills/wp-content-optimization/references/meta-optimization.md +243 -0
- package/skills/wp-content-optimization/references/readability-analysis.md +201 -0
- package/skills/wp-content-optimization/references/seo-content-scoring.md +245 -0
- package/skills/wp-content-optimization/scripts/content_optimization_inspect.mjs +237 -0
- package/skills/wp-content-workflows/SKILL.md +142 -0
- package/skills/wp-content-workflows/references/content-lifecycle-hooks.md +131 -0
- package/skills/wp-content-workflows/references/multi-channel-actions.md +151 -0
- package/skills/wp-content-workflows/references/schedule-triggers.md +118 -0
- package/skills/wp-content-workflows/references/trigger-management.md +159 -0
- package/skills/wp-content-workflows/references/wp-action-hooks.md +114 -0
- package/skills/wp-content-workflows/scripts/workflow_inspect.mjs +202 -0
- package/skills/wp-monitoring/SKILL.md +3 -0
- package/skills/wp-programmatic-seo/SKILL.md +2 -0
- package/skills/wp-search-console/SKILL.md +122 -0
- package/skills/wp-search-console/references/competitor-gap-analysis.md +226 -0
- package/skills/wp-search-console/references/content-seo-feedback.md +181 -0
- package/skills/wp-search-console/references/gsc-setup.md +110 -0
- package/skills/wp-search-console/references/indexing-management.md +182 -0
- package/skills/wp-search-console/references/keyword-tracking.md +181 -0
- package/skills/wp-search-console/scripts/search_console_inspect.mjs +178 -0
- package/skills/wp-social-email/SKILL.md +1 -0
- package/skills/wp-webhooks/SKILL.md +1 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Traffic Attribution
|
|
2
|
+
|
|
3
|
+
## UTM Parameter Standards
|
|
4
|
+
|
|
5
|
+
UTM (Urchin Tracking Module) parameters tag URLs to track marketing campaign performance.
|
|
6
|
+
|
|
7
|
+
### Required Parameters
|
|
8
|
+
| Parameter | Purpose | Example |
|
|
9
|
+
|-----------|---------|---------|
|
|
10
|
+
| `utm_source` | Traffic origin | `google`, `facebook`, `newsletter` |
|
|
11
|
+
| `utm_medium` | Marketing channel | `cpc`, `email`, `social`, `referral` |
|
|
12
|
+
| `utm_campaign` | Campaign name | `spring-sale-2024`, `black-friday` |
|
|
13
|
+
|
|
14
|
+
### Optional Parameters
|
|
15
|
+
| Parameter | Purpose | Example |
|
|
16
|
+
|-----------|---------|---------|
|
|
17
|
+
| `utm_term` | Paid search keyword | `running+shoes` |
|
|
18
|
+
| `utm_content` | Ad variation / CTA | `cta-button-red`, `hero-banner` |
|
|
19
|
+
|
|
20
|
+
### URL Format
|
|
21
|
+
```
|
|
22
|
+
https://example.com/page?utm_source=google&utm_medium=cpc&utm_campaign=spring-sale
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Source/Medium Mapping
|
|
26
|
+
|
|
27
|
+
### Standard Mappings in GA4
|
|
28
|
+
| Source/Medium | Description |
|
|
29
|
+
|---------------|-------------|
|
|
30
|
+
| `google / organic` | Google organic search |
|
|
31
|
+
| `google / cpc` | Google Ads paid search |
|
|
32
|
+
| `facebook / social` | Facebook organic posts |
|
|
33
|
+
| `facebook / cpc` | Facebook paid ads |
|
|
34
|
+
| `newsletter / email` | Email marketing campaigns |
|
|
35
|
+
| `(direct) / (none)` | Direct traffic or untagged |
|
|
36
|
+
| `referral / referral` | Incoming links from other sites |
|
|
37
|
+
|
|
38
|
+
### Plausible Source Mapping
|
|
39
|
+
Plausible uses `visit:source` which maps to the referrer or `utm_source`:
|
|
40
|
+
- Organic search: `Google`, `Bing`, `DuckDuckGo`
|
|
41
|
+
- Social: `Facebook`, `Twitter`, `LinkedIn`
|
|
42
|
+
- UTM-tagged: uses the `utm_source` value directly
|
|
43
|
+
|
|
44
|
+
## Combining GA4 Traffic with WooCommerce Conversions
|
|
45
|
+
|
|
46
|
+
### Data Flow
|
|
47
|
+
1. **GA4** tracks the user journey: source, medium, pages visited, events
|
|
48
|
+
2. **WooCommerce** records the transaction: products, revenue, order ID
|
|
49
|
+
3. **Attribution** connects which traffic source led to which purchase
|
|
50
|
+
|
|
51
|
+
### Attribution Models
|
|
52
|
+
| Model | Logic | Best For |
|
|
53
|
+
|-------|-------|----------|
|
|
54
|
+
| Last click | Credits the last touchpoint before conversion | Simple campaigns |
|
|
55
|
+
| First click | Credits the first touchpoint in the journey | Brand awareness |
|
|
56
|
+
| Linear | Equal credit to all touchpoints | Multi-touch evaluation |
|
|
57
|
+
| Data-driven | ML-based credit distribution (GA4 default) | Complex funnels |
|
|
58
|
+
|
|
59
|
+
### Implementation Steps
|
|
60
|
+
1. Ensure GA4 enhanced e-commerce tracking is active (via Site Kit or GTM)
|
|
61
|
+
2. Map WooCommerce order IDs to GA4 transaction events
|
|
62
|
+
3. Use `ga4_conversions` tool with `purchase` event to get revenue by source
|
|
63
|
+
4. Cross-reference with WooCommerce order data for product-level attribution
|
|
64
|
+
|
|
65
|
+
## Cross-Platform Discrepancy Analysis
|
|
66
|
+
|
|
67
|
+
### Common Causes of Data Differences
|
|
68
|
+
| Issue | GA4 Impact | Plausible Impact |
|
|
69
|
+
|-------|-----------|-----------------|
|
|
70
|
+
| Ad blockers | Under-reports (blocked) | Under-reports (blocked) |
|
|
71
|
+
| Cookie consent | Under-reports if declined | No impact (cookieless) |
|
|
72
|
+
| Bot traffic | Filtered (mostly) | Filtered |
|
|
73
|
+
| SPA navigation | May miss if not configured | Tracks via History API |
|
|
74
|
+
| Caching | CDN may cache tracking | Same |
|
|
75
|
+
| Sampling | Large datasets sampled | No sampling |
|
|
76
|
+
|
|
77
|
+
### Reconciliation Steps
|
|
78
|
+
1. Compare total sessions (GA4) vs visits (Plausible) for the same period
|
|
79
|
+
2. Calculate the gap percentage: typically 10-30% difference is normal
|
|
80
|
+
3. Check source-level: organic search should be closest between platforms
|
|
81
|
+
4. Investigate large discrepancies in specific sources or pages
|
|
82
|
+
5. Use CWV data as an independent third reference for page-level traffic
|
|
83
|
+
|
|
84
|
+
## Campaign Tracking Best Practices
|
|
85
|
+
|
|
86
|
+
- **Always tag** paid campaign URLs with UTM parameters
|
|
87
|
+
- **Use consistent naming** conventions (lowercase, hyphens, no spaces)
|
|
88
|
+
- **Document all campaigns** in a shared spreadsheet or naming convention guide
|
|
89
|
+
- **Test tagged URLs** before launching campaigns
|
|
90
|
+
- **Monitor `(not set)`** values in GA4 — indicates untagged traffic
|
|
91
|
+
- **Review referral exclusions** in GA4 to prevent self-referrals
|
|
92
|
+
- **Set up conversion goals** in both GA4 and WooCommerce for accurate ROI
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* analytics_inspect.mjs — Detect analytics configuration readiness.
|
|
3
|
+
*
|
|
4
|
+
* Checks WP_SITES_CONFIG for GA4, Plausible, and Google API key credentials.
|
|
5
|
+
* Scans for analytics plugins and tracking code.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* node analytics_inspect.mjs [--cwd=/path/to/project]
|
|
9
|
+
*
|
|
10
|
+
* Exit codes:
|
|
11
|
+
* 0 — analytics configuration found
|
|
12
|
+
* 1 — no analytics configuration found
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { readFileSync, existsSync, readdirSync } from 'node:fs';
|
|
16
|
+
import { join, resolve } from 'node:path';
|
|
17
|
+
import { argv, stdout, exit } from 'node:process';
|
|
18
|
+
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// Helpers
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
|
|
23
|
+
function readFileSafe(filePath) {
|
|
24
|
+
try { return readFileSync(filePath, 'utf-8'); } catch { return null; }
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function existsSafe(filePath) {
|
|
28
|
+
try { return existsSync(filePath); } catch { return false; }
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function globDir(dirPath) {
|
|
32
|
+
try { return readdirSync(dirPath); } catch { return []; }
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
// Detectors
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
|
|
39
|
+
function detectGA4Config() {
|
|
40
|
+
const ga4 = { configured: false, indicators: [] };
|
|
41
|
+
const raw = process.env.WP_SITES_CONFIG;
|
|
42
|
+
if (!raw) return ga4;
|
|
43
|
+
|
|
44
|
+
let sites;
|
|
45
|
+
try { sites = JSON.parse(raw); } catch { return ga4; }
|
|
46
|
+
if (!Array.isArray(sites)) return ga4;
|
|
47
|
+
|
|
48
|
+
for (const site of sites) {
|
|
49
|
+
const label = site.id || site.url || 'unknown';
|
|
50
|
+
if (site.ga4_property_id) {
|
|
51
|
+
ga4.configured = true;
|
|
52
|
+
ga4.indicators.push(`ga4_property_id configured for ${label}`);
|
|
53
|
+
}
|
|
54
|
+
if (site.ga4_service_account_key) {
|
|
55
|
+
ga4.indicators.push(`ga4_service_account_key configured for ${label}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return ga4;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function detectPlausibleConfig() {
|
|
62
|
+
const pl = { configured: false, indicators: [] };
|
|
63
|
+
const raw = process.env.WP_SITES_CONFIG;
|
|
64
|
+
if (!raw) return pl;
|
|
65
|
+
|
|
66
|
+
let sites;
|
|
67
|
+
try { sites = JSON.parse(raw); } catch { return pl; }
|
|
68
|
+
if (!Array.isArray(sites)) return pl;
|
|
69
|
+
|
|
70
|
+
for (const site of sites) {
|
|
71
|
+
const label = site.id || site.url || 'unknown';
|
|
72
|
+
if (site.plausible_api_key) {
|
|
73
|
+
pl.configured = true;
|
|
74
|
+
pl.indicators.push(`plausible_api_key configured for ${label}`);
|
|
75
|
+
}
|
|
76
|
+
if (site.plausible_base_url) {
|
|
77
|
+
pl.indicators.push(`plausible_base_url: ${site.plausible_base_url}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return pl;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function detectGoogleApiKey() {
|
|
84
|
+
const cwv = { configured: false, indicators: [] };
|
|
85
|
+
const raw = process.env.WP_SITES_CONFIG;
|
|
86
|
+
if (!raw) return cwv;
|
|
87
|
+
|
|
88
|
+
let sites;
|
|
89
|
+
try { sites = JSON.parse(raw); } catch { return cwv; }
|
|
90
|
+
if (!Array.isArray(sites)) return cwv;
|
|
91
|
+
|
|
92
|
+
for (const site of sites) {
|
|
93
|
+
const label = site.id || site.url || 'unknown';
|
|
94
|
+
if (site.google_api_key) {
|
|
95
|
+
cwv.configured = true;
|
|
96
|
+
cwv.indicators.push(`google_api_key configured for ${label}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return cwv;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function detectAnalyticsPlugins(cwd) {
|
|
103
|
+
const indicators = [];
|
|
104
|
+
const pluginsDir = join(cwd, 'wp-content', 'plugins');
|
|
105
|
+
const plugins = globDir(pluginsDir);
|
|
106
|
+
|
|
107
|
+
const analyticsPlugins = [
|
|
108
|
+
'google-analytics-for-wordpress',
|
|
109
|
+
'google-site-kit',
|
|
110
|
+
'wp-google-analytics-events',
|
|
111
|
+
'plausible-analytics',
|
|
112
|
+
'koko-analytics',
|
|
113
|
+
'matomo',
|
|
114
|
+
'independent-analytics',
|
|
115
|
+
];
|
|
116
|
+
|
|
117
|
+
for (const plugin of analyticsPlugins) {
|
|
118
|
+
if (plugins.includes(plugin)) {
|
|
119
|
+
indicators.push(`plugin: ${plugin}`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return { found: indicators.length > 0, indicators };
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// ---------------------------------------------------------------------------
|
|
126
|
+
// Main
|
|
127
|
+
// ---------------------------------------------------------------------------
|
|
128
|
+
|
|
129
|
+
function main() {
|
|
130
|
+
const cwdArg = argv.find(a => a.startsWith('--cwd='));
|
|
131
|
+
const cwd = cwdArg ? resolve(cwdArg.split('=')[1]) : process.cwd();
|
|
132
|
+
|
|
133
|
+
const ga4 = detectGA4Config();
|
|
134
|
+
const plausible = detectPlausibleConfig();
|
|
135
|
+
const googleApiKey = detectGoogleApiKey();
|
|
136
|
+
const plugins = detectAnalyticsPlugins(cwd);
|
|
137
|
+
|
|
138
|
+
const anyConfigured = ga4.configured || plausible.configured || googleApiKey.configured || plugins.found;
|
|
139
|
+
|
|
140
|
+
const report = {
|
|
141
|
+
analytics_configured: anyConfigured,
|
|
142
|
+
ga4: ga4,
|
|
143
|
+
plausible: plausible,
|
|
144
|
+
google_api_key: googleApiKey,
|
|
145
|
+
analytics_plugins: plugins,
|
|
146
|
+
cwd,
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
stdout.write(JSON.stringify(report, null, 2) + '\n');
|
|
150
|
+
exit(anyConfigured ? 0 : 1);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
main();
|
|
@@ -106,3 +106,4 @@ Tool: assign_terms_to_content — assign terms to content
|
|
|
106
106
|
- **`wp-content-repurposing`** — transform existing content for social media, email, and multi-channel distribution
|
|
107
107
|
- **`wp-content-attribution`** — measure which content drives WooCommerce sales (UTM tracking, attribution models, ROI)
|
|
108
108
|
- **wp-social-email** — distribute content to social media and email after creation
|
|
109
|
+
- **wp-content-optimization** — optimize existing content: headlines, readability, SEO scoring, meta descriptions, freshness audit
|
|
@@ -95,3 +95,6 @@ The script checks WooCommerce presence, analytics plugins, UTM tracking setup, c
|
|
|
95
95
|
- `wp-content` — content management and editorial workflows
|
|
96
96
|
- `wp-monitoring` — ongoing site performance and health tracking
|
|
97
97
|
- `wp-content-repurposing` — transform high-ROI content into multi-channel formats
|
|
98
|
+
- `wp-search-console` — correlate GSC keyword data with WooCommerce conversions for content-commerce attribution
|
|
99
|
+
- `wp-content-optimization` — prioritize optimization of high-revenue content using attribution data
|
|
100
|
+
- Per correlazione contenuto→conversione completa, combina `wp-analytics` + `wp-content-attribution`
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: wp-content-optimization
|
|
3
|
+
description: This skill should be used when the user asks to "optimize content",
|
|
4
|
+
"improve headlines", "readability analysis", "SEO score", "content scoring",
|
|
5
|
+
"meta description optimization", "content freshness", "content audit",
|
|
6
|
+
"content triage", "bulk content optimization", "headline score",
|
|
7
|
+
"Flesch-Kincaid", "keyword density", or mentions improving existing
|
|
8
|
+
WordPress content quality and performance.
|
|
9
|
+
version: 1.0.0
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# WordPress Content Optimization Skill
|
|
13
|
+
|
|
14
|
+
## Overview
|
|
15
|
+
|
|
16
|
+
AI-driven content optimization using Claude's linguistic analysis combined with GSC data (v2.5.0) and WooCommerce attribution data. No external optimization APIs are needed — this skill uses existing WP REST Bridge tools plus Claude's built-in analysis capabilities to perform headline scoring, readability analysis, SEO density checks, meta optimization, content freshness audits, and bulk content triage.
|
|
17
|
+
|
|
18
|
+
## Philosophy
|
|
19
|
+
|
|
20
|
+
This is Claude-native. No external optimization APIs like Clearscope, SurferSEO, or MarketMuse are required. Claude itself performs headline analysis, readability scoring, SEO density checks, and content classification by leveraging its linguistic capabilities directly on content fetched through the WP REST Bridge.
|
|
21
|
+
|
|
22
|
+
## When to Use
|
|
23
|
+
|
|
24
|
+
- User wants to improve existing content quality
|
|
25
|
+
- User needs headline/title optimization with scoring
|
|
26
|
+
- User asks about readability (Flesch-Kincaid, sentence length)
|
|
27
|
+
- User wants SEO content scoring (keyword density, H-tag coverage)
|
|
28
|
+
- User needs meta description optimization based on CTR data
|
|
29
|
+
- User wants content freshness audit (find stale content)
|
|
30
|
+
- User needs bulk content triage (quick wins vs rewrite vs archive)
|
|
31
|
+
|
|
32
|
+
## Decision Tree
|
|
33
|
+
|
|
34
|
+
1. **What type of optimization?**
|
|
35
|
+
- "optimize headline" / "title score" / "headline analysis" → Headline Analysis (Section 1)
|
|
36
|
+
- "readability" / "Flesch-Kincaid" / "sentence length" → Readability Analysis (Section 2)
|
|
37
|
+
- "SEO score" / "keyword density" / "content scoring" → SEO Content Scoring (Section 3)
|
|
38
|
+
- "meta description" / "title tag" / "CTR optimization" → Meta Description Optimization (Section 4)
|
|
39
|
+
- "content freshness" / "stale content" / "outdated posts" → Content Freshness Audit (Section 5)
|
|
40
|
+
- "content triage" / "bulk optimize" / "content audit" → Bulk Content Triage (Section 6 — combines all above)
|
|
41
|
+
|
|
42
|
+
2. **Run detection first:**
|
|
43
|
+
```bash
|
|
44
|
+
node skills/wp-content-optimization/scripts/content_optimization_inspect.mjs [--cwd=/path/to/project]
|
|
45
|
+
```
|
|
46
|
+
This identifies available content, GSC integration status, and WooCommerce data availability.
|
|
47
|
+
|
|
48
|
+
## Procedures Overview
|
|
49
|
+
|
|
50
|
+
| # | Procedure | Input | Output |
|
|
51
|
+
|---|-----------|-------|--------|
|
|
52
|
+
| 1 | Headline Analysis | Title + target keyword | Score 1-10, 3 optimized alternatives |
|
|
53
|
+
| 2 | Readability Analysis | Body content | Flesch-Kincaid score, long sentences, suggestions |
|
|
54
|
+
| 3 | SEO Content Scoring | Body + keyword + GSC data | Keyword density, H2/H3 coverage, internal linking gaps |
|
|
55
|
+
| 4 | Meta Description Optimization | Current meta + GSC CTR data | Optimized meta for CTR, A/B variant |
|
|
56
|
+
| 5 | Content Freshness Audit | Content list + publish date | Stale content identified, update priorities |
|
|
57
|
+
| 6 | Bulk Content Triage | N contents + GSC data | Classified: quick wins, needs rewrite, archive |
|
|
58
|
+
|
|
59
|
+
## Bulk Content Triage Classification
|
|
60
|
+
|
|
61
|
+
| Category | Criteria | Action |
|
|
62
|
+
|----------|----------|--------|
|
|
63
|
+
| Quick Wins | High traffic + low CTR, weak headline | Optimize title/meta |
|
|
64
|
+
| Needs Rewrite | >12 months, low readability, keyword off-target | Rewrite content |
|
|
65
|
+
| Performing | High traffic + high CTR | Maintain, refresh date |
|
|
66
|
+
| Archive | Zero traffic >6 months, no keywords | 301 redirect or noindex |
|
|
67
|
+
|
|
68
|
+
## Sections
|
|
69
|
+
|
|
70
|
+
### Section 1: Headline Analysis
|
|
71
|
+
See `references/headline-optimization.md`
|
|
72
|
+
- Headline scoring criteria (1-10 scale based on keyword placement, power words, length, clarity)
|
|
73
|
+
- Power word categories (emotional, urgency, curiosity, value)
|
|
74
|
+
- Headline formulas (How-to, List, Question, Comparison)
|
|
75
|
+
- Target keyword placement in headlines
|
|
76
|
+
- A/B title generation workflow
|
|
77
|
+
- Example: fetch via `list_content` → Claude analyzes → generate alternatives → `update_content`
|
|
78
|
+
|
|
79
|
+
### Section 2: Readability Analysis
|
|
80
|
+
See `references/readability-analysis.md`
|
|
81
|
+
- Flesch-Kincaid scoring (target: 60-70 for general audience)
|
|
82
|
+
- Sentence length analysis (target: <20 words average)
|
|
83
|
+
- Passive voice detection and reduction
|
|
84
|
+
- Paragraph length guidelines
|
|
85
|
+
- Jargon and complexity detection
|
|
86
|
+
- Workflow: fetch content → analyze text → suggest improvements → update
|
|
87
|
+
|
|
88
|
+
### Section 3: SEO Content Scoring
|
|
89
|
+
See `references/seo-content-scoring.md`
|
|
90
|
+
- Keyword density check (target: 1-2% primary keyword)
|
|
91
|
+
- H2/H3 hierarchy coverage (are subheadings using secondary keywords?)
|
|
92
|
+
- Internal linking analysis (minimum 2-3 internal links per post)
|
|
93
|
+
- External linking (1-2 authoritative sources)
|
|
94
|
+
- Image alt text coverage
|
|
95
|
+
- Combining with `gsc_search_analytics` for keyword data
|
|
96
|
+
|
|
97
|
+
### Section 4: Meta Description Optimization
|
|
98
|
+
See `references/meta-optimization.md`
|
|
99
|
+
- Title tag best practices (under 60 chars, keyword first)
|
|
100
|
+
- Meta description guidelines (under 160 chars, compelling CTA, keyword inclusion)
|
|
101
|
+
- Using GSC CTR data to identify low-CTR pages for optimization
|
|
102
|
+
- A/B variant generation for testing
|
|
103
|
+
- Rich snippet optimization hints
|
|
104
|
+
|
|
105
|
+
### Section 5: Content Freshness Audit
|
|
106
|
+
See `references/content-freshness.md`
|
|
107
|
+
- Content decay patterns (traffic drop over time)
|
|
108
|
+
- Freshness signals (published date, modified date, data accuracy)
|
|
109
|
+
- Refresh strategies: date update, data refresh, section expansion, republish
|
|
110
|
+
- Evergreen vs temporal content classification
|
|
111
|
+
- Workflow: `list_content` by date → analyze age → check GSC traffic trends → prioritize
|
|
112
|
+
|
|
113
|
+
### Section 6: Bulk Content Triage
|
|
114
|
+
Combines all sections above into a single audit workflow:
|
|
115
|
+
1. Fetch all published content via `list_content`
|
|
116
|
+
2. Pull GSC performance data via `gsc_page_performance` and `gsc_top_queries`
|
|
117
|
+
3. Run headline analysis (Section 1) on each title
|
|
118
|
+
4. Run readability analysis (Section 2) on each body
|
|
119
|
+
5. Run SEO content scoring (Section 3) on each post
|
|
120
|
+
6. Cross-reference with GSC CTR data for meta optimization (Section 4)
|
|
121
|
+
7. Check publish dates for freshness audit (Section 5)
|
|
122
|
+
8. Classify each content piece into the triage categories above
|
|
123
|
+
9. Generate prioritized action list
|
|
124
|
+
|
|
125
|
+
## Reference Files
|
|
126
|
+
|
|
127
|
+
| File | Content |
|
|
128
|
+
|------|---------|
|
|
129
|
+
| `references/headline-optimization.md` | Headline formulas, power words, scoring criteria |
|
|
130
|
+
| `references/readability-analysis.md` | Flesch-Kincaid, sentence length, passive voice, jargon |
|
|
131
|
+
| `references/seo-content-scoring.md` | Keyword density, H-tag hierarchy, internal link analysis |
|
|
132
|
+
| `references/meta-optimization.md` | Title tag + meta description best practices, CTR optimization |
|
|
133
|
+
| `references/content-freshness.md` | Content decay, refresh strategies, evergreen vs temporal |
|
|
134
|
+
|
|
135
|
+
## MCP Tools Used
|
|
136
|
+
|
|
137
|
+
These are existing tools used by the optimization procedures (no new tools introduced):
|
|
138
|
+
|
|
139
|
+
### WP REST Bridge
|
|
140
|
+
|
|
141
|
+
| Tool | Usage |
|
|
142
|
+
|------|-------|
|
|
143
|
+
| `list_content` | Fetch published content for analysis |
|
|
144
|
+
| `get_content` | Get full content body for individual post analysis |
|
|
145
|
+
| `update_content` | Apply optimized titles, meta descriptions, content updates |
|
|
146
|
+
|
|
147
|
+
### Google Search Console (if available)
|
|
148
|
+
|
|
149
|
+
| Tool | Usage |
|
|
150
|
+
|------|-------|
|
|
151
|
+
| `gsc_page_performance` | Page-level traffic data for triage classification |
|
|
152
|
+
| `gsc_top_queries` | Top queries for keyword density validation |
|
|
153
|
+
| `gsc_search_analytics` | Detailed search metrics for CTR-based meta optimization |
|
|
154
|
+
|
|
155
|
+
### WooCommerce (if available)
|
|
156
|
+
|
|
157
|
+
| Tool | Usage |
|
|
158
|
+
|------|-------|
|
|
159
|
+
| `wc_get_orders` | Attribution data linking content to conversions |
|
|
160
|
+
| `wc_list_products` | Product pages for content-commerce optimization |
|
|
161
|
+
|
|
162
|
+
## Recommended Agent
|
|
163
|
+
|
|
164
|
+
Use the **`wp-content-strategist`** agent for content optimization workflows that combine Claude's linguistic analysis with search performance data and WordPress content management.
|
|
165
|
+
|
|
166
|
+
## Related Skills
|
|
167
|
+
|
|
168
|
+
- **`wp-content`** — create and manage WordPress content
|
|
169
|
+
- **`wp-search-console`** — search performance data for optimization decisions
|
|
170
|
+
- **`wp-content-attribution`** — track content sources and attribute traffic
|
|
171
|
+
- **`wp-programmatic-seo`** — generate SEO-optimized content at scale
|
|
172
|
+
- **`wp-social-email`** — distribute optimized content across channels
|
|
173
|
+
- Per prioritizzare ottimizzazione con dati CWV, combina `wp-analytics` + `wp-content-optimization`
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
# Content Freshness Audit
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Content freshness measures how current and accurate published content remains over time. Search engines factor freshness into rankings, and stale content can erode traffic and authority. Claude performs content freshness audits by analyzing publish dates, modification history, traffic trends from GSC, and content accuracy — then classifies content into refresh priorities. This workflow uses `list_content`, `get_content`, and GSC tools.
|
|
6
|
+
|
|
7
|
+
## Content Decay Patterns
|
|
8
|
+
|
|
9
|
+
### What Is Content Decay
|
|
10
|
+
Content decay occurs when a page gradually loses organic traffic over time due to:
|
|
11
|
+
- Newer, more comprehensive competitor content
|
|
12
|
+
- Outdated statistics, data, or references
|
|
13
|
+
- Changed search intent for target keywords
|
|
14
|
+
- Algorithm updates favoring fresher content
|
|
15
|
+
- Broken links or outdated external references
|
|
16
|
+
|
|
17
|
+
### Decay Timeline
|
|
18
|
+
|
|
19
|
+
| Content Age | Risk Level | Typical Action |
|
|
20
|
+
|-------------|-----------|----------------|
|
|
21
|
+
| 0-6 months | Low | Monitor, no action needed |
|
|
22
|
+
| 6-12 months | Medium | Review for accuracy, consider minor updates |
|
|
23
|
+
| 12-18 months | High | Data refresh, section updates required |
|
|
24
|
+
| 18-24 months | Very High | Major refresh or rewrite |
|
|
25
|
+
| 24+ months | Critical | Full rewrite, republish, or archive |
|
|
26
|
+
|
|
27
|
+
### Decay Signals
|
|
28
|
+
Indicators that content is decaying:
|
|
29
|
+
1. **Traffic decline** — steady month-over-month drop in organic traffic (via GSC)
|
|
30
|
+
2. **Position drops** — average position worsening for target keywords
|
|
31
|
+
3. **Impression decline** — fewer impressions means less search visibility
|
|
32
|
+
4. **Bounce rate increase** — users leaving quickly (content not meeting expectations)
|
|
33
|
+
5. **Outdated references** — statistics from 2+ years ago, dead links
|
|
34
|
+
|
|
35
|
+
## Freshness Signals
|
|
36
|
+
|
|
37
|
+
### What Search Engines Evaluate
|
|
38
|
+
|
|
39
|
+
| Signal | Description | WordPress Field |
|
|
40
|
+
|--------|-------------|-----------------|
|
|
41
|
+
| Published date | Original publication date | `date` |
|
|
42
|
+
| Modified date | Last content modification | `modified` |
|
|
43
|
+
| Content changes | Actual meaningful edits (not cosmetic) | Content diff |
|
|
44
|
+
| Data currency | Statistics and facts are current | Manual check |
|
|
45
|
+
| Link freshness | External links still active and current | Automated check |
|
|
46
|
+
|
|
47
|
+
### Meaningful vs Cosmetic Updates
|
|
48
|
+
```
|
|
49
|
+
Meaningful updates (search engines recognize):
|
|
50
|
+
- Adding new sections or paragraphs
|
|
51
|
+
- Updating statistics and data points
|
|
52
|
+
- Adding new examples or case studies
|
|
53
|
+
- Expanding topic coverage
|
|
54
|
+
- Updating recommendations based on new information
|
|
55
|
+
|
|
56
|
+
Cosmetic updates (do NOT count as fresh):
|
|
57
|
+
- Changing the date without content changes
|
|
58
|
+
- Fixing typos or minor formatting
|
|
59
|
+
- Rearranging existing content
|
|
60
|
+
- Adding images without new text
|
|
61
|
+
- Changing the author
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Refresh Strategies
|
|
65
|
+
|
|
66
|
+
### Strategy 1: Date and Data Refresh
|
|
67
|
+
**When to use:** Content is fundamentally sound but contains outdated numbers or references.
|
|
68
|
+
```
|
|
69
|
+
Effort: Low (30 min - 1 hour)
|
|
70
|
+
Impact: Medium
|
|
71
|
+
Actions:
|
|
72
|
+
- Update statistics with current data
|
|
73
|
+
- Replace outdated year references
|
|
74
|
+
- Verify all external links still work
|
|
75
|
+
- Update the modified date
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Strategy 2: Section Expansion
|
|
79
|
+
**When to use:** Content covers the topic but competitors have more depth.
|
|
80
|
+
```
|
|
81
|
+
Effort: Medium (1-3 hours)
|
|
82
|
+
Impact: High
|
|
83
|
+
Actions:
|
|
84
|
+
- Add 1-3 new sections addressing gaps
|
|
85
|
+
- Add FAQ section based on current search queries
|
|
86
|
+
- Include updated examples or case studies
|
|
87
|
+
- Add internal links to newer related content
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Strategy 3: Full Rewrite
|
|
91
|
+
**When to use:** Content is outdated, poorly structured, or fundamentally off-target.
|
|
92
|
+
```
|
|
93
|
+
Effort: High (3-6 hours)
|
|
94
|
+
Impact: Very High
|
|
95
|
+
Actions:
|
|
96
|
+
- Rewrite from scratch with current keyword research
|
|
97
|
+
- Maintain the same URL (preserve any existing backlinks)
|
|
98
|
+
- Update all meta elements (title, description)
|
|
99
|
+
- Republish with current date
|
|
100
|
+
- Submit to GSC for re-indexing
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Strategy 4: Republish
|
|
104
|
+
**When to use:** Content is significantly updated and should be treated as new.
|
|
105
|
+
```
|
|
106
|
+
Effort: Medium (after rewrite)
|
|
107
|
+
Impact: High
|
|
108
|
+
Actions:
|
|
109
|
+
- Change publish date to current date
|
|
110
|
+
- Share on social channels as new content
|
|
111
|
+
- Update internal links pointing to this page
|
|
112
|
+
- Submit URL to GSC for re-crawling
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Strategy 5: Archive / Redirect
|
|
116
|
+
**When to use:** Content has no traffic, no keyword value, and no update potential.
|
|
117
|
+
```
|
|
118
|
+
Effort: Low
|
|
119
|
+
Impact: Positive (reduces index bloat)
|
|
120
|
+
Actions:
|
|
121
|
+
- Set up 301 redirect to the most relevant active page
|
|
122
|
+
- Or add noindex meta tag
|
|
123
|
+
- Remove from XML sitemap
|
|
124
|
+
- Remove internal links pointing to this page
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Evergreen vs Temporal Content
|
|
128
|
+
|
|
129
|
+
### Classification
|
|
130
|
+
|
|
131
|
+
| Type | Characteristics | Freshness Need | Examples |
|
|
132
|
+
|------|----------------|----------------|----------|
|
|
133
|
+
| Evergreen | Topic stays relevant, answers don't change | Low (annual review) | "How to Install WordPress", "What Is SEO" |
|
|
134
|
+
| Semi-Evergreen | Core topic stable, details change | Medium (6-12 months) | "Best WordPress Plugins 2026", "WordPress Security Guide" |
|
|
135
|
+
| Temporal | Time-bound, loses relevance quickly | High (monthly or event-based) | "WordPress 6.5 New Features", "Black Friday Deals 2026" |
|
|
136
|
+
| News | Immediate relevance, short lifespan | Not refreshable | "WordPress Acquires Company X" |
|
|
137
|
+
|
|
138
|
+
### Strategy by Content Type
|
|
139
|
+
|
|
140
|
+
| Type | Refresh Strategy | Frequency |
|
|
141
|
+
|------|-----------------|-----------|
|
|
142
|
+
| Evergreen | Minor data updates, link checks | Every 12 months |
|
|
143
|
+
| Semi-Evergreen | Section expansion, data refresh | Every 6-12 months |
|
|
144
|
+
| Temporal | Full rewrite for new period or archive | When period expires |
|
|
145
|
+
| News | Archive (301 to evergreen resource) | When news cycle ends |
|
|
146
|
+
|
|
147
|
+
## Content Freshness Audit Workflow
|
|
148
|
+
|
|
149
|
+
### Step 1: Inventory All Content
|
|
150
|
+
```
|
|
151
|
+
Use list_content to fetch all published posts and pages.
|
|
152
|
+
Collect: post ID, title, URL, publish date, modified date, category.
|
|
153
|
+
Sort by publish date (oldest first).
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### Step 2: Calculate Content Age
|
|
157
|
+
```
|
|
158
|
+
For each content piece:
|
|
159
|
+
- Age = current date - publish date
|
|
160
|
+
- Days since last update = current date - modified date
|
|
161
|
+
- Flag: age > 12 months AND no modification in 6+ months
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Step 3: Pull Traffic Trends (GSC)
|
|
165
|
+
```
|
|
166
|
+
Use gsc_page_performance for each page (or top pages by age).
|
|
167
|
+
Compare last 3 months vs previous 3 months:
|
|
168
|
+
- Traffic trend: growing, stable, or declining
|
|
169
|
+
- Position trend: improving, stable, or worsening
|
|
170
|
+
- CTR trend: improving, stable, or declining
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### Step 4: Classify Each Content Piece
|
|
174
|
+
```
|
|
175
|
+
For each piece of content, assign a freshness category:
|
|
176
|
+
|
|
177
|
+
| Category | Criteria |
|
|
178
|
+
|----------|---------|
|
|
179
|
+
| Fresh | <6 months old OR recently updated with growing traffic |
|
|
180
|
+
| Aging | 6-12 months, stable traffic, no recent updates |
|
|
181
|
+
| Stale | 12-18 months, declining traffic, no updates |
|
|
182
|
+
| Decayed | 18+ months, significant traffic loss |
|
|
183
|
+
| Dead | 24+ months, near-zero traffic, no keyword rankings |
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### Step 5: Assign Refresh Priority
|
|
187
|
+
```
|
|
188
|
+
Priority 1 (Urgent): Stale content with high historical traffic → quick refresh
|
|
189
|
+
Priority 2 (High): Aging content in important categories → preventive refresh
|
|
190
|
+
Priority 3 (Medium): Decayed content with some keyword potential → rewrite
|
|
191
|
+
Priority 4 (Low): Dead content with no recovery potential → archive/redirect
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### Step 6: Generate Audit Report
|
|
195
|
+
```
|
|
196
|
+
Content Freshness Audit Report
|
|
197
|
+
══════════════════════════════
|
|
198
|
+
Total Content Pieces: 85
|
|
199
|
+
Fresh (0-6 months): 12 (14%)
|
|
200
|
+
Aging (6-12 months): 23 (27%)
|
|
201
|
+
Stale (12-18 months): 28 (33%)
|
|
202
|
+
Decayed (18-24 months): 15 (18%)
|
|
203
|
+
Dead (24+ months): 7 (8%)
|
|
204
|
+
|
|
205
|
+
Priority Actions:
|
|
206
|
+
┌─────────┬────────────────────────────────────┬───────────┬──────────────┐
|
|
207
|
+
│ Priority│ Content │ Age │ Action │
|
|
208
|
+
├─────────┼────────────────────────────────────┼───────────┼──────────────┤
|
|
209
|
+
│ 1 │ "WordPress Speed Guide" │ 14 months │ Data refresh │
|
|
210
|
+
│ 1 │ "Best WooCommerce Plugins" │ 16 months │ Rewrite │
|
|
211
|
+
│ 2 │ "How to Install WordPress" │ 10 months │ Review │
|
|
212
|
+
│ 4 │ "WordPress 5.9 Features" │ 26 months │ Archive │
|
|
213
|
+
└─────────┴────────────────────────────────────┴───────────┴──────────────┘
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### Step 7: Execute Refresh Plan
|
|
217
|
+
For each priority item, apply the appropriate refresh strategy:
|
|
218
|
+
```
|
|
219
|
+
Use get_content to fetch the full content.
|
|
220
|
+
Apply the selected refresh strategy (data refresh, expansion, rewrite).
|
|
221
|
+
Use update_content to publish the updated version.
|
|
222
|
+
Submit refreshed URLs to GSC for re-crawling if significantly changed.
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
## Best Practices
|
|
226
|
+
|
|
227
|
+
- Run freshness audits quarterly (every 3 months) for sites with 50+ posts
|
|
228
|
+
- Prioritize high-traffic decaying content over zero-traffic content
|
|
229
|
+
- Always refresh meaningfully — date-only changes do not fool search engines
|
|
230
|
+
- Track content age as a standard metric alongside traffic and rankings
|
|
231
|
+
- Set calendar reminders for semi-evergreen content refresh cycles
|
|
232
|
+
- When refreshing, also update internal links from other posts pointing to the refreshed content
|
|
233
|
+
- Keep a content calendar that includes refresh dates alongside new content publication
|
|
234
|
+
- Consider combining freshness audits with the Bulk Content Triage procedure (SKILL.md Section 6) for comprehensive content management
|