claude-plugin-wordpress-manager 2.3.1 → 2.6.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 +15 -3
- package/CHANGELOG.md +62 -0
- package/agents/wp-content-strategist.md +104 -0
- package/agents/wp-distribution-manager.md +98 -0
- package/docs/GUIDE.md +183 -23
- package/docs/plans/2026-03-01-tier3-wcop-design.md +373 -0
- package/docs/plans/2026-03-01-tier3-wcop-implementation.md +915 -0
- package/hooks/hooks.json +18 -0
- package/package.json +18 -3
- package/servers/wp-rest-bridge/build/tools/buffer.d.ts +3 -0
- package/servers/wp-rest-bridge/build/tools/buffer.js +205 -0
- package/servers/wp-rest-bridge/build/tools/comments.d.ts +6 -6
- 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 +12 -0
- package/servers/wp-rest-bridge/build/tools/mailchimp.d.ts +3 -0
- package/servers/wp-rest-bridge/build/tools/mailchimp.js +265 -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/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/sendgrid.d.ts +3 -0
- package/servers/wp-rest-bridge/build/tools/sendgrid.js +255 -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/types.d.ts +122 -0
- package/servers/wp-rest-bridge/build/wordpress.d.ts +14 -0
- package/servers/wp-rest-bridge/build/wordpress.js +151 -0
- package/servers/wp-rest-bridge/package.json +1 -0
- package/skills/wordpress-router/references/decision-tree.md +8 -2
- package/skills/wp-content/SKILL.md +2 -0
- package/skills/wp-content-attribution/SKILL.md +2 -0
- package/skills/wp-content-optimization/SKILL.md +172 -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-repurposing/SKILL.md +1 -0
- package/skills/wp-monitoring/SKILL.md +1 -0
- package/skills/wp-programmatic-seo/SKILL.md +2 -0
- package/skills/wp-search-console/SKILL.md +121 -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 +152 -0
- package/skills/wp-social-email/references/audience-segmentation.md +173 -0
- package/skills/wp-social-email/references/buffer-social-publishing.md +124 -0
- package/skills/wp-social-email/references/content-to-distribution.md +156 -0
- package/skills/wp-social-email/references/distribution-analytics.md +208 -0
- package/skills/wp-social-email/references/mailchimp-integration.md +145 -0
- package/skills/wp-social-email/references/sendgrid-transactional.md +165 -0
- package/skills/wp-social-email/scripts/distribution_inspect.mjs +165 -0
- package/skills/wp-webhooks/SKILL.md +1 -0
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: wp-search-console
|
|
3
|
+
description: This skill should be used when the user asks about "Google Search Console",
|
|
4
|
+
"GSC", "keyword tracking", "keyword rankings", "search analytics",
|
|
5
|
+
"indexing status", "URL inspection", "sitemap management",
|
|
6
|
+
"search performance", "SEO feedback", "content SEO",
|
|
7
|
+
"competitor gap analysis", "keyword gap", or mentions monitoring
|
|
8
|
+
WordPress site search performance.
|
|
9
|
+
version: 1.0.0
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# WordPress Search Console Skill
|
|
13
|
+
|
|
14
|
+
## Overview
|
|
15
|
+
|
|
16
|
+
Google Search Console connects WordPress content to Google Search data via 8 MCP tools. These tools enable keyword tracking, indexing management, sitemap operations, and search performance analysis directly from the WordPress authoring environment. By bridging GSC data with WordPress content, you can identify optimization opportunities, monitor indexing health, and build data-driven content strategies.
|
|
17
|
+
|
|
18
|
+
## When to Use
|
|
19
|
+
|
|
20
|
+
- User wants to check how their WordPress pages perform in Google Search
|
|
21
|
+
- User needs to track keyword rankings and position changes over time
|
|
22
|
+
- User asks about indexing status or why a page is not appearing in Google
|
|
23
|
+
- User wants to submit or manage XML sitemaps
|
|
24
|
+
- User needs search analytics data (clicks, impressions, CTR, average position)
|
|
25
|
+
- User asks about content SEO improvements based on search data
|
|
26
|
+
- User wants to identify keyword gaps or content opportunities
|
|
27
|
+
- User needs to inspect a specific URL for crawl and indexing details
|
|
28
|
+
|
|
29
|
+
## Decision Tree
|
|
30
|
+
|
|
31
|
+
1. **What aspect of Search Console?**
|
|
32
|
+
- "setup" / "connect GSC" / "service account" / "verify site" → GSC setup (Section 1)
|
|
33
|
+
- "keyword tracking" / "rankings" / "position" / "top queries" → Keyword tracking (Section 2)
|
|
34
|
+
- "indexing" / "URL inspection" / "sitemap" / "crawl" / "not indexed" → Indexing management (Section 3)
|
|
35
|
+
- "content SEO" / "underperforming pages" / "content refresh" / "optimize title" → Content SEO feedback (Section 4)
|
|
36
|
+
- "competitor gap" / "keyword gap" / "content opportunities" / "missing keywords" → Competitor gap analysis (Section 5)
|
|
37
|
+
|
|
38
|
+
2. **Run detection first:**
|
|
39
|
+
```bash
|
|
40
|
+
node skills/wp-search-console/scripts/search_console_inspect.mjs [--cwd=/path/to/project]
|
|
41
|
+
```
|
|
42
|
+
This identifies configured GSC credentials and verified sites.
|
|
43
|
+
|
|
44
|
+
## Service Overview
|
|
45
|
+
|
|
46
|
+
| Service | Tools | Auth Type | Use Case |
|
|
47
|
+
|---------|-------|-----------|----------|
|
|
48
|
+
| Google Search Console | 8 tools (`gsc_*`) | Service Account JSON | Search analytics, indexing, sitemaps |
|
|
49
|
+
|
|
50
|
+
## Sections
|
|
51
|
+
|
|
52
|
+
### Section 1: GSC Setup
|
|
53
|
+
See `references/gsc-setup.md`
|
|
54
|
+
- Service account creation in Google Cloud Console
|
|
55
|
+
- JSON key file configuration
|
|
56
|
+
- WP_SITES_CONFIG setup with gsc_service_account_key and gsc_site_url
|
|
57
|
+
- Site verification and permissions
|
|
58
|
+
|
|
59
|
+
### Section 2: Keyword Tracking
|
|
60
|
+
See `references/keyword-tracking.md`
|
|
61
|
+
- Using gsc_search_analytics and gsc_top_queries for keyword monitoring
|
|
62
|
+
- Date range and dimension filters
|
|
63
|
+
- Tracking position changes over time
|
|
64
|
+
- Query-level analysis (clicks, impressions, CTR, average position)
|
|
65
|
+
|
|
66
|
+
### Section 3: Indexing Management
|
|
67
|
+
See `references/indexing-management.md`
|
|
68
|
+
- Using gsc_inspect_url for indexing status checks
|
|
69
|
+
- Sitemap operations (list, submit, delete)
|
|
70
|
+
- Monitoring crawl coverage
|
|
71
|
+
- Handling indexing issues and bulk URL inspection
|
|
72
|
+
|
|
73
|
+
### Section 4: Content SEO Feedback
|
|
74
|
+
See `references/content-seo-feedback.md`
|
|
75
|
+
- Connecting search data to WordPress content strategy
|
|
76
|
+
- Identifying underperforming pages with gsc_page_performance
|
|
77
|
+
- Content refresh strategies based on declining metrics
|
|
78
|
+
- Title and meta description optimization from search data
|
|
79
|
+
|
|
80
|
+
### Section 5: Competitor Gap Analysis
|
|
81
|
+
See `references/competitor-gap-analysis.md`
|
|
82
|
+
- Identifying keyword gaps using search analytics data
|
|
83
|
+
- Analyzing query coverage vs potential queries
|
|
84
|
+
- Finding content opportunities from query data
|
|
85
|
+
- Cross-referencing with WordPress content inventory
|
|
86
|
+
|
|
87
|
+
## Reference Files
|
|
88
|
+
|
|
89
|
+
| File | Content |
|
|
90
|
+
|------|---------|
|
|
91
|
+
| `references/gsc-setup.md` | Service account creation, JSON key config, site verification |
|
|
92
|
+
| `references/keyword-tracking.md` | Search analytics queries, position monitoring, dashboards |
|
|
93
|
+
| `references/indexing-management.md` | URL inspection, sitemap management, crawl coverage |
|
|
94
|
+
| `references/content-seo-feedback.md` | Page performance, content refresh, title optimization |
|
|
95
|
+
| `references/competitor-gap-analysis.md` | Keyword gaps, content opportunities, position strategies |
|
|
96
|
+
|
|
97
|
+
## MCP Tools
|
|
98
|
+
|
|
99
|
+
| Tool | Description |
|
|
100
|
+
|------|-------------|
|
|
101
|
+
| `gsc_list_sites` | List all verified sites in Google Search Console |
|
|
102
|
+
| `gsc_search_analytics` | Query search analytics data with dimensions and filters |
|
|
103
|
+
| `gsc_inspect_url` | Inspect a URL for indexing status and crawl details |
|
|
104
|
+
| `gsc_list_sitemaps` | List submitted sitemaps and their status |
|
|
105
|
+
| `gsc_submit_sitemap` | Submit a new sitemap URL to GSC |
|
|
106
|
+
| `gsc_delete_sitemap` | Remove a sitemap from GSC |
|
|
107
|
+
| `gsc_top_queries` | Get top search queries with clicks, impressions, CTR, position |
|
|
108
|
+
| `gsc_page_performance` | Get page-level performance data with search metrics |
|
|
109
|
+
|
|
110
|
+
## Recommended Agent
|
|
111
|
+
|
|
112
|
+
Use the **`wp-content-strategist`** agent for SEO feedback loops and content optimization workflows that combine Search Console data with WordPress content management.
|
|
113
|
+
|
|
114
|
+
## Related Skills
|
|
115
|
+
|
|
116
|
+
- **`wp-programmatic-seo`** — generate SEO-optimized content at scale using search data
|
|
117
|
+
- **`wp-content-attribution`** — track content sources and attribute search traffic
|
|
118
|
+
- **`wp-monitoring`** — monitor site health metrics alongside search performance
|
|
119
|
+
- **`wp-social-email`** — distribute optimized content across social and email channels
|
|
120
|
+
- **`wp-content`** — create and manage WordPress content informed by search analytics
|
|
121
|
+
- **`wp-content-optimization`** — use GSC data as input for AI-driven content optimization and triage
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
# Competitor Gap Analysis
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Competitor gap analysis uses Google Search Console data to identify keyword opportunities your WordPress site is missing. By analyzing your query coverage, position distribution, and content inventory, you can find topics where you have search visibility but no dedicated content, or where competitors likely rank for queries you do not yet target.
|
|
6
|
+
|
|
7
|
+
## Identifying Keyword Gaps
|
|
8
|
+
|
|
9
|
+
### Step 1: Export your full query coverage
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
Tool: gsc_search_analytics
|
|
13
|
+
Params:
|
|
14
|
+
site_url: "https://example.com/"
|
|
15
|
+
start_date: "2026-02-01"
|
|
16
|
+
end_date: "2026-02-28"
|
|
17
|
+
dimensions: ["query"]
|
|
18
|
+
row_limit: 5000
|
|
19
|
+
Returns: Array of all queries with clicks, impressions, ctr, position
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
This gives you every query Google associates with your site. Sort by impressions to see which topics generate the most search visibility.
|
|
23
|
+
|
|
24
|
+
### Step 2: Map queries to content
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
Tool: gsc_search_analytics
|
|
28
|
+
Params:
|
|
29
|
+
site_url: "https://example.com/"
|
|
30
|
+
start_date: "2026-02-01"
|
|
31
|
+
end_date: "2026-02-28"
|
|
32
|
+
dimensions: ["query", "page"]
|
|
33
|
+
row_limit: 5000
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
This maps each query to the page that ranks for it. Look for:
|
|
37
|
+
- **Queries without a dedicated page** — a query matches a generic page rather than a focused article
|
|
38
|
+
- **Multiple queries pointing to one page** — the page may be covering too many topics and could be split
|
|
39
|
+
- **Queries with position > 20** — you appear in results but have no strong content to compete
|
|
40
|
+
|
|
41
|
+
### Step 3: Identify content gaps
|
|
42
|
+
|
|
43
|
+
Cross-reference your queries with your WordPress content inventory:
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
# Get all published content
|
|
47
|
+
Step 1: wp_list_posts status="publish" per_page=100 → Array of posts with titles and URLs
|
|
48
|
+
|
|
49
|
+
# Get all queries with page mapping
|
|
50
|
+
Step 2: gsc_search_analytics dimensions=["query", "page"] row_limit=5000
|
|
51
|
+
|
|
52
|
+
# Compare: queries that map to pages not optimized for them = content gaps
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Analyzing Query Coverage
|
|
56
|
+
|
|
57
|
+
### Position distribution analysis
|
|
58
|
+
|
|
59
|
+
Categorize your queries by position to understand coverage quality:
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
Tool: gsc_search_analytics
|
|
63
|
+
Params:
|
|
64
|
+
site_url: "https://example.com/"
|
|
65
|
+
start_date: "2026-02-01"
|
|
66
|
+
end_date: "2026-02-28"
|
|
67
|
+
dimensions: ["query"]
|
|
68
|
+
row_limit: 5000
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Group results by position ranges:
|
|
72
|
+
|
|
73
|
+
| Position Range | Category | Strategy |
|
|
74
|
+
|----------------|----------|----------|
|
|
75
|
+
| 1-3 | Dominant | Protect — monitor and update regularly |
|
|
76
|
+
| 4-10 | Competitive | Optimize — content refresh, internal links, backlinks |
|
|
77
|
+
| 11-20 | Striking distance | Target — create supporting content, build topic clusters |
|
|
78
|
+
| 21-50 | Weak presence | Evaluate — is the content worth investing in? |
|
|
79
|
+
| 50+ | Minimal visibility | Decide — create new dedicated content or abandon |
|
|
80
|
+
|
|
81
|
+
### Topic cluster gaps
|
|
82
|
+
|
|
83
|
+
Group related queries into topic clusters to find areas where your coverage is incomplete:
|
|
84
|
+
|
|
85
|
+
1. Export all queries with `gsc_search_analytics`
|
|
86
|
+
2. Group queries by root topic (e.g., "wordpress seo", "wordpress performance", "wordpress security")
|
|
87
|
+
3. Count unique queries per topic and average position per topic
|
|
88
|
+
4. Topics with few queries or high average position are underserved
|
|
89
|
+
|
|
90
|
+
## Finding Content Opportunities
|
|
91
|
+
|
|
92
|
+
### High-impression, no-click queries
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
Tool: gsc_search_analytics
|
|
96
|
+
Params:
|
|
97
|
+
site_url: "https://example.com/"
|
|
98
|
+
start_date: "2026-02-01"
|
|
99
|
+
end_date: "2026-02-28"
|
|
100
|
+
dimensions: ["query", "page"]
|
|
101
|
+
row_limit: 1000
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Filter for queries where `impressions > 100` and `clicks == 0`. These are searches where Google shows your site but users never click — likely because:
|
|
105
|
+
- Your page does not match the query intent
|
|
106
|
+
- Your title and description are not compelling for that query
|
|
107
|
+
- You rank too low (position > 20) for the query to generate clicks
|
|
108
|
+
|
|
109
|
+
For each opportunity, decide whether to:
|
|
110
|
+
- **Optimize the existing page** for that query (if the topic is related)
|
|
111
|
+
- **Create a new dedicated page** targeting that query (if the topic is distinct)
|
|
112
|
+
|
|
113
|
+
### Question-based queries
|
|
114
|
+
|
|
115
|
+
Filter queries that start with question words (what, how, why, when, where, which, can, does, is):
|
|
116
|
+
|
|
117
|
+
```
|
|
118
|
+
Tool: gsc_search_analytics
|
|
119
|
+
Params:
|
|
120
|
+
site_url: "https://example.com/"
|
|
121
|
+
start_date: "2026-02-01"
|
|
122
|
+
end_date: "2026-02-28"
|
|
123
|
+
dimensions: ["query"]
|
|
124
|
+
dimension_filter_groups:
|
|
125
|
+
- filters:
|
|
126
|
+
- dimension: "query"
|
|
127
|
+
operator: "contains"
|
|
128
|
+
expression: "how to"
|
|
129
|
+
row_limit: 200
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Question queries map directly to FAQ content, how-to guides, and tutorial posts. If you appear for these queries but don't have dedicated content, create:
|
|
133
|
+
- FAQ sections on existing pages
|
|
134
|
+
- Standalone how-to articles
|
|
135
|
+
- Comprehensive guides that answer multiple related questions
|
|
136
|
+
|
|
137
|
+
### Long-tail opportunities
|
|
138
|
+
|
|
139
|
+
Queries with 4+ words are typically long-tail keywords with lower competition:
|
|
140
|
+
|
|
141
|
+
```
|
|
142
|
+
Tool: gsc_search_analytics
|
|
143
|
+
Params:
|
|
144
|
+
site_url: "https://example.com/"
|
|
145
|
+
start_date: "2026-02-01"
|
|
146
|
+
end_date: "2026-02-28"
|
|
147
|
+
dimensions: ["query"]
|
|
148
|
+
row_limit: 2000
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Filter for queries containing 4+ words with `impressions > 20`. Long-tail keywords often have:
|
|
152
|
+
- Higher conversion intent
|
|
153
|
+
- Lower competition
|
|
154
|
+
- More specific content requirements
|
|
155
|
+
|
|
156
|
+
Create focused content addressing the exact long-tail query.
|
|
157
|
+
|
|
158
|
+
## Position Improvement Strategies
|
|
159
|
+
|
|
160
|
+
### Strategy 1: Topic clusters
|
|
161
|
+
|
|
162
|
+
For queries where you rank 11-20, build topic clusters:
|
|
163
|
+
|
|
164
|
+
1. Identify the core topic from your query data
|
|
165
|
+
2. Create a **pillar page** — comprehensive guide covering the broad topic
|
|
166
|
+
3. Create **cluster pages** — focused articles on subtopics
|
|
167
|
+
4. **Interlink** all cluster pages to the pillar and vice versa
|
|
168
|
+
5. Monitor position changes with `gsc_search_analytics` over 4-8 weeks
|
|
169
|
+
|
|
170
|
+
### Strategy 2: Content depth expansion
|
|
171
|
+
|
|
172
|
+
For queries where you rank 4-10 but cannot break into top 3:
|
|
173
|
+
|
|
174
|
+
1. Analyze the query with `gsc_search_analytics` filtered by the specific query
|
|
175
|
+
2. Fetch the ranking page with `wp_get_post`
|
|
176
|
+
3. Expand the content:
|
|
177
|
+
- Add 500-1000 words of additional depth
|
|
178
|
+
- Include data, statistics, or original research
|
|
179
|
+
- Add images, tables, or diagrams
|
|
180
|
+
- Add expert quotes or citations
|
|
181
|
+
4. Update via `wp_update_post`
|
|
182
|
+
|
|
183
|
+
### Strategy 3: Internal link building
|
|
184
|
+
|
|
185
|
+
Boost underperforming pages with strategic internal links:
|
|
186
|
+
|
|
187
|
+
1. Identify pages ranking 11-30 for valuable queries
|
|
188
|
+
2. Find high-authority pages on your site (top performers from `gsc_page_performance`)
|
|
189
|
+
3. Add contextual internal links from high-authority pages to underperforming pages
|
|
190
|
+
4. Use the target query as anchor text (naturally, not forced)
|
|
191
|
+
|
|
192
|
+
## Cross-Referencing with WordPress Content
|
|
193
|
+
|
|
194
|
+
### Audit workflow
|
|
195
|
+
|
|
196
|
+
Complete gap analysis workflow combining GSC and WordPress data:
|
|
197
|
+
|
|
198
|
+
1. **Export all queries**: `gsc_search_analytics` with `dimensions: ["query"]`, `row_limit: 5000`
|
|
199
|
+
2. **Export all pages**: `gsc_page_performance` with `row_limit: 500`
|
|
200
|
+
3. **List WordPress content**: `wp_list_posts` with `status: "publish"`
|
|
201
|
+
4. **Map coverage**: For each WordPress post, check if it has GSC data
|
|
202
|
+
5. **Find orphans**: WordPress posts with no GSC impressions may have indexing or quality issues
|
|
203
|
+
6. **Find gaps**: Queries without a dedicated WordPress post are content opportunities
|
|
204
|
+
|
|
205
|
+
### Priority scoring
|
|
206
|
+
|
|
207
|
+
Score content opportunities by potential impact:
|
|
208
|
+
|
|
209
|
+
| Factor | Weight | Measurement |
|
|
210
|
+
|--------|--------|-------------|
|
|
211
|
+
| Impressions | High | More impressions = more potential traffic |
|
|
212
|
+
| Current position | Medium | Closer to page 1 = easier to improve |
|
|
213
|
+
| CTR gap | Medium | Low CTR vs expected = quick win with title optimization |
|
|
214
|
+
| Competition | Low | Long-tail queries typically have less competition |
|
|
215
|
+
| Business relevance | High | Queries related to products/services have higher value |
|
|
216
|
+
|
|
217
|
+
## Best Practices
|
|
218
|
+
|
|
219
|
+
- **Regular cadence**: Run gap analysis monthly to catch new opportunities as query landscape evolves
|
|
220
|
+
- **Focus on intent**: Not all queries are worth targeting; prioritize queries that align with your content goals and business objectives
|
|
221
|
+
- **Quality over quantity**: One comprehensive article targeting a cluster of related queries outperforms five thin articles each targeting a single query
|
|
222
|
+
- **Track outcomes**: After creating content for identified gaps, monitor its performance in GSC after 4-8 weeks
|
|
223
|
+
- **Avoid keyword cannibalization**: Before creating new content, check if an existing page already targets the same query cluster
|
|
224
|
+
- **Use search data directionally**: GSC data shows what Google associates with your site, not what your competitors rank for; use it as a map of your current footprint and expand from there
|
|
225
|
+
- **Combine with external tools**: For true competitive analysis (what competitors rank for that you do not), supplement GSC data with third-party tools like Ahrefs, SEMrush, or Moz
|
|
226
|
+
- **Content calendar integration**: Feed identified opportunities into your WordPress editorial calendar for systematic execution
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
# Content SEO Feedback
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Content SEO feedback connects Google Search Console performance data to WordPress content strategy. By analyzing page-level metrics (clicks, impressions, CTR, position), you can identify underperforming content, discover optimization opportunities, and make data-driven decisions about content refreshes, title rewrites, and new content creation.
|
|
6
|
+
|
|
7
|
+
## Identifying Underperforming Pages
|
|
8
|
+
|
|
9
|
+
### Get page-level performance data
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
Tool: gsc_page_performance
|
|
13
|
+
Params:
|
|
14
|
+
site_url: "https://example.com/"
|
|
15
|
+
start_date: "2026-02-01"
|
|
16
|
+
end_date: "2026-02-28"
|
|
17
|
+
row_limit: 200
|
|
18
|
+
Returns: Array of pages with clicks, impressions, ctr, position
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### Detect declining pages
|
|
22
|
+
|
|
23
|
+
Compare two periods to find pages with declining performance:
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
# Previous period
|
|
27
|
+
Tool: gsc_page_performance
|
|
28
|
+
Params:
|
|
29
|
+
site_url: "https://example.com/"
|
|
30
|
+
start_date: "2026-01-01"
|
|
31
|
+
end_date: "2026-01-31"
|
|
32
|
+
row_limit: 200
|
|
33
|
+
|
|
34
|
+
# Current period
|
|
35
|
+
Tool: gsc_page_performance
|
|
36
|
+
Params:
|
|
37
|
+
site_url: "https://example.com/"
|
|
38
|
+
start_date: "2026-02-01"
|
|
39
|
+
end_date: "2026-02-28"
|
|
40
|
+
row_limit: 200
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Compare results to identify:
|
|
44
|
+
- **Click decline > 20%** — high priority for content refresh
|
|
45
|
+
- **Impression decline > 30%** — content may be losing relevance or competitors have overtaken
|
|
46
|
+
- **Position increase > 3 positions** (lower is better) — content is dropping in rankings
|
|
47
|
+
|
|
48
|
+
### Categorize pages by performance
|
|
49
|
+
|
|
50
|
+
| Category | Criteria | Action |
|
|
51
|
+
|----------|----------|--------|
|
|
52
|
+
| High performers | Top 10% by clicks | Protect and expand — add internal links, update regularly |
|
|
53
|
+
| Declining stars | Previously top, now dropping | Content refresh — update data, add sections, improve media |
|
|
54
|
+
| Hidden gems | High impressions, low CTR | Title/meta optimization — rewrite to improve click-through |
|
|
55
|
+
| Dead weight | Low impressions, low clicks | Evaluate for removal, consolidation, or major rewrite |
|
|
56
|
+
| Rising pages | Increasing impressions and clicks | Accelerate — build more internal links, add supporting content |
|
|
57
|
+
|
|
58
|
+
## Content Refresh Strategies
|
|
59
|
+
|
|
60
|
+
### Strategy 1: Refresh based on declining clicks
|
|
61
|
+
|
|
62
|
+
1. **Identify declining pages** using period comparison (see above)
|
|
63
|
+
2. **Fetch the WordPress content** using `wp_get_post` with the page URL
|
|
64
|
+
3. **Analyze queries** driving traffic to the page using `gsc_search_analytics` with `dimensions: ["query"]` filtered by the page URL
|
|
65
|
+
4. **Update the content** to better address the top queries:
|
|
66
|
+
- Add missing subtopics that queries suggest users are looking for
|
|
67
|
+
- Update outdated statistics, dates, and references
|
|
68
|
+
- Expand thin sections with more depth
|
|
69
|
+
- Add FAQ sections based on question-type queries
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
# Find queries for a specific declining page
|
|
73
|
+
Tool: gsc_search_analytics
|
|
74
|
+
Params:
|
|
75
|
+
site_url: "https://example.com/"
|
|
76
|
+
start_date: "2026-02-01"
|
|
77
|
+
end_date: "2026-02-28"
|
|
78
|
+
dimensions: ["query"]
|
|
79
|
+
dimension_filter_groups:
|
|
80
|
+
- filters:
|
|
81
|
+
- dimension: "page"
|
|
82
|
+
operator: "equals"
|
|
83
|
+
expression: "https://example.com/blog/wordpress-performance/"
|
|
84
|
+
row_limit: 50
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Strategy 2: New content from high-impression queries
|
|
88
|
+
|
|
89
|
+
Queries with high impressions but low or zero clicks on your pages represent untapped opportunities:
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
Tool: gsc_search_analytics
|
|
93
|
+
Params:
|
|
94
|
+
site_url: "https://example.com/"
|
|
95
|
+
start_date: "2026-02-01"
|
|
96
|
+
end_date: "2026-02-28"
|
|
97
|
+
dimensions: ["query", "page"]
|
|
98
|
+
row_limit: 500
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Filter for queries where:
|
|
102
|
+
- `impressions > 200` and `clicks < 5` — your page appears but users do not click
|
|
103
|
+
- `position > 10` — you rank on page 2+ and need a dedicated, optimized page
|
|
104
|
+
|
|
105
|
+
These queries can inform new blog post topics or dedicated landing pages.
|
|
106
|
+
|
|
107
|
+
### Strategy 3: Content consolidation
|
|
108
|
+
|
|
109
|
+
Multiple pages ranking for the same query cannibalize each other:
|
|
110
|
+
|
|
111
|
+
```
|
|
112
|
+
Tool: gsc_search_analytics
|
|
113
|
+
Params:
|
|
114
|
+
site_url: "https://example.com/"
|
|
115
|
+
start_date: "2026-02-01"
|
|
116
|
+
end_date: "2026-02-28"
|
|
117
|
+
dimensions: ["query", "page"]
|
|
118
|
+
row_limit: 1000
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Look for queries that appear with 2+ different pages. When multiple pages compete:
|
|
122
|
+
1. Choose the strongest page (most clicks/best position)
|
|
123
|
+
2. Merge content from the weaker page into the stronger one
|
|
124
|
+
3. Redirect the weaker URL to the stronger page
|
|
125
|
+
4. Update internal links to point to the consolidated page
|
|
126
|
+
|
|
127
|
+
## Title and Meta Description Optimization
|
|
128
|
+
|
|
129
|
+
### Find CTR optimization opportunities
|
|
130
|
+
|
|
131
|
+
```
|
|
132
|
+
Tool: gsc_search_analytics
|
|
133
|
+
Params:
|
|
134
|
+
site_url: "https://example.com/"
|
|
135
|
+
start_date: "2026-02-01"
|
|
136
|
+
end_date: "2026-02-28"
|
|
137
|
+
dimensions: ["query", "page"]
|
|
138
|
+
row_limit: 200
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Target pages where:
|
|
142
|
+
- `position < 5` and `ctr < 0.05` — ranking well but not getting clicks (expected CTR for top 5 is 5-15%)
|
|
143
|
+
- `position < 3` and `ctr < 0.10` — top 3 positions should have 10%+ CTR
|
|
144
|
+
|
|
145
|
+
### Title tag optimization guidelines
|
|
146
|
+
|
|
147
|
+
Based on search data patterns:
|
|
148
|
+
- **Include the primary query** in the title — queries that appear verbatim in titles get higher CTR
|
|
149
|
+
- **Front-load keywords** — the first 60 characters are visible in SERPs
|
|
150
|
+
- **Add power words** — "Guide", "2026", "Complete", "Best" boost CTR by 5-15%
|
|
151
|
+
- **Use numbers** — "10 Tips", "5 Steps" increase CTR by 10-20% vs generic titles
|
|
152
|
+
- **Match intent** — if queries are questions, use question format in title
|
|
153
|
+
|
|
154
|
+
### Meta description optimization
|
|
155
|
+
|
|
156
|
+
- **Include target query** — Google bolds matching terms in descriptions
|
|
157
|
+
- **Add a CTA** — "Learn more", "Get started", "Read the full guide"
|
|
158
|
+
- **Stay under 155 characters** — longer descriptions get truncated
|
|
159
|
+
- **Differentiate from competitors** — include unique value propositions
|
|
160
|
+
|
|
161
|
+
## WordPress Integration Workflow
|
|
162
|
+
|
|
163
|
+
Complete content optimization loop using GSC data and WordPress tools:
|
|
164
|
+
|
|
165
|
+
1. **Pull page performance**: `gsc_page_performance` for all pages
|
|
166
|
+
2. **Identify targets**: Filter for declining or underperforming pages
|
|
167
|
+
3. **Get query context**: `gsc_search_analytics` filtered by target page URL
|
|
168
|
+
4. **Fetch WordPress content**: `wp_get_post` to get current content
|
|
169
|
+
5. **Update content**: `wp_update_post` with improved title, content, and meta
|
|
170
|
+
6. **Monitor results**: Re-check `gsc_page_performance` after 2-4 weeks
|
|
171
|
+
|
|
172
|
+
## Best Practices
|
|
173
|
+
|
|
174
|
+
- **Refresh cadence**: Review page performance monthly; refresh declining content quarterly
|
|
175
|
+
- **Data threshold**: Only act on pages with 100+ impressions — below that, data is statistically unreliable
|
|
176
|
+
- **Patience after changes**: Wait 2-4 weeks after content changes before measuring impact; Google needs time to re-crawl and re-evaluate
|
|
177
|
+
- **Track changes**: Note the date and nature of each content update so you can correlate with performance changes
|
|
178
|
+
- **Prioritize by impact**: Focus on pages with the highest impression volume first — small CTR improvements on high-impression pages yield more clicks than large improvements on low-impression pages
|
|
179
|
+
- **Seasonal awareness**: Some traffic drops are seasonal, not quality-related; compare year-over-year when possible
|
|
180
|
+
- **Avoid over-optimization**: Do not stuff keywords into titles or content; natural language performs better in modern search
|
|
181
|
+
- **Internal linking**: After refreshing content, add internal links from other relevant pages to boost crawl priority
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# GSC Setup
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Google Search Console integration requires a Google Cloud service account with Search Console API access. The service account's JSON key file is configured in `WP_SITES_CONFIG`, enabling all 8 GSC MCP tools to authenticate and query search data for your WordPress site.
|
|
6
|
+
|
|
7
|
+
## Setup
|
|
8
|
+
|
|
9
|
+
### Step 1: Create a Google Cloud Project
|
|
10
|
+
|
|
11
|
+
1. Go to [Google Cloud Console](https://console.cloud.google.com/)
|
|
12
|
+
2. Create a new project or select an existing one
|
|
13
|
+
3. Enable the **Google Search Console API** (also called "Search Console API" or "Webmasters API") under APIs & Services → Library
|
|
14
|
+
|
|
15
|
+
### Step 2: Create a Service Account
|
|
16
|
+
|
|
17
|
+
1. Navigate to IAM & Admin → Service Accounts
|
|
18
|
+
2. Click **Create Service Account**
|
|
19
|
+
3. Name it (e.g., `wp-search-console`) and add a description
|
|
20
|
+
4. No additional roles are needed at the project level
|
|
21
|
+
5. Click **Done**
|
|
22
|
+
|
|
23
|
+
### Step 3: Generate JSON Key File
|
|
24
|
+
|
|
25
|
+
1. Click on the newly created service account
|
|
26
|
+
2. Go to the **Keys** tab
|
|
27
|
+
3. Click **Add Key** → **Create new key** → **JSON**
|
|
28
|
+
4. Download the JSON key file and store it securely
|
|
29
|
+
|
|
30
|
+
The JSON key file contains:
|
|
31
|
+
|
|
32
|
+
```json
|
|
33
|
+
{
|
|
34
|
+
"type": "service_account",
|
|
35
|
+
"project_id": "your-project-id",
|
|
36
|
+
"private_key_id": "key-id",
|
|
37
|
+
"private_key": "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n",
|
|
38
|
+
"client_email": "wp-search-console@your-project.iam.gserviceaccount.com",
|
|
39
|
+
"client_id": "123456789",
|
|
40
|
+
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
|
|
41
|
+
"token_uri": "https://oauth2.googleapis.com/token"
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Step 4: Grant Search Console Access
|
|
46
|
+
|
|
47
|
+
1. Go to [Google Search Console](https://search.google.com/search-console)
|
|
48
|
+
2. Select your property (site)
|
|
49
|
+
3. Navigate to **Settings** → **Users and permissions**
|
|
50
|
+
4. Click **Add user**
|
|
51
|
+
5. Enter the service account email (e.g., `wp-search-console@your-project.iam.gserviceaccount.com`)
|
|
52
|
+
6. Set permission to **Full** (for read access and sitemap management) or **Restricted** (read-only)
|
|
53
|
+
|
|
54
|
+
### Step 5: Configure WP_SITES_CONFIG
|
|
55
|
+
|
|
56
|
+
Add GSC credentials to your site configuration:
|
|
57
|
+
|
|
58
|
+
```json
|
|
59
|
+
{
|
|
60
|
+
"sites": [{
|
|
61
|
+
"name": "my-site",
|
|
62
|
+
"url": "https://example.com",
|
|
63
|
+
"gsc": {
|
|
64
|
+
"gsc_service_account_key": "/path/to/service-account-key.json",
|
|
65
|
+
"gsc_site_url": "https://example.com/"
|
|
66
|
+
}
|
|
67
|
+
}]
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**Important notes on `gsc_site_url`:**
|
|
72
|
+
- Use the exact property URL as it appears in Search Console
|
|
73
|
+
- For domain properties, use `sc-domain:example.com`
|
|
74
|
+
- For URL-prefix properties, use the full URL with trailing slash: `https://example.com/`
|
|
75
|
+
- The value must match exactly — a mismatch will result in 403 errors
|
|
76
|
+
|
|
77
|
+
## Verification
|
|
78
|
+
|
|
79
|
+
After configuration, verify the setup works:
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
Tool: gsc_list_sites
|
|
83
|
+
Returns: Array of verified sites with siteUrl, permissionLevel
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
You should see your site listed with `permissionLevel` of `siteOwner` or `siteFullUser`.
|
|
87
|
+
|
|
88
|
+
## Permissions and Scopes
|
|
89
|
+
|
|
90
|
+
The service account requires the following OAuth scope:
|
|
91
|
+
|
|
92
|
+
- `https://www.googleapis.com/auth/webmasters.readonly` — for read-only access (search analytics, URL inspection, sitemap listing)
|
|
93
|
+
- `https://www.googleapis.com/auth/webmasters` — for full access (includes sitemap submission and deletion)
|
|
94
|
+
|
|
95
|
+
The MCP tools automatically request the appropriate scope based on the operation.
|
|
96
|
+
|
|
97
|
+
## Troubleshooting
|
|
98
|
+
|
|
99
|
+
- **403 Forbidden**: The service account email has not been added to Search Console, or `gsc_site_url` does not match the property URL
|
|
100
|
+
- **404 Not Found**: The site URL format is incorrect (missing trailing slash or wrong protocol)
|
|
101
|
+
- **Authentication errors**: The JSON key file path is invalid or the file is malformed
|
|
102
|
+
- **No data returned**: The site may be newly verified; Search Console data takes 24-48 hours to populate
|
|
103
|
+
|
|
104
|
+
## Best Practices
|
|
105
|
+
|
|
106
|
+
- **Key file security**: Store the JSON key file outside the project directory; never commit it to version control
|
|
107
|
+
- **Least privilege**: Use **Restricted** permission if you only need read access (search analytics, URL inspection)
|
|
108
|
+
- **Separate accounts**: Use a dedicated service account per project to isolate access
|
|
109
|
+
- **Key rotation**: Rotate service account keys periodically (every 90 days recommended)
|
|
110
|
+
- **Domain property**: Prefer domain-level properties (`sc-domain:example.com`) over URL-prefix properties for complete data coverage
|