Major refactoring to create a clean, integrated CLI application: ### New Features: - Unified CLI executable (./seo) with simple command structure - All commands accept optional CSV file arguments - Auto-detection of latest files when no arguments provided - Simplified output directory structure (output/ instead of output/reports/) - Cleaner export filename format (all_posts_YYYY-MM-DD.csv) ### Commands: - export: Export all posts from WordPress sites - analyze [csv]: Analyze posts with AI (optional CSV input) - recategorize [csv]: Recategorize posts with AI - seo_check: Check SEO quality - categories: Manage categories across sites - approve [files]: Review and approve recommendations - full_pipeline: Run complete workflow - analytics, gaps, opportunities, report, status ### Changes: - Moved all scripts to scripts/ directory - Created config.yaml for configuration - Updated all scripts to use output/ directory - Deprecated old seo-cli.py in favor of new ./seo - Added AGENTS.md and CHANGELOG.md documentation - Consolidated README.md with updated usage ### Technical: - Added PyYAML dependency - Removed hardcoded configuration values - All scripts now properly integrated - Better error handling and user feedback Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
11 KiB
Multi-Site SEO Analyzer Guide
Purpose: Fetch posts from all 3 WordPress sites, analyze titles and meta descriptions, and provide AI-powered optimization recommendations.
Output: CSV with detailed analysis + Markdown summary report
Overview
The Multi-Site SEO Analyzer does the following:
- Fetches all published posts from your 3 WordPress sites (mistergeek.net, webscroll.fr, hellogeek.net)
- Analyzes each post's:
- Title (length, power words, numbers, readability)
- Meta description (presence, length, call-to-action)
- Scores posts on SEO best practices (0-100)
- Generates AI recommendations for your top priority posts
- Exports results to CSV for action
Setup
Step 1: Configure WordPress Access
Update your .env file with credentials for all 3 sites:
# Primary site (fallback for others if not specified)
WORDPRESS_URL=https://www.mistergeek.net
WORDPRESS_USERNAME=your_username
WORDPRESS_APP_PASSWORD=your_app_password
# Site 1: mistergeek.net (uses primary credentials if not specified)
WORDPRESS_MISTERGEEK_URL=https://www.mistergeek.net
WORDPRESS_MISTERGEEK_USERNAME=your_username
WORDPRESS_MISTERGEEK_PASSWORD=your_app_password
# Site 2: webscroll.fr
WORDPRESS_WEBSCROLL_URL=https://www.webscroll.fr
WORDPRESS_WEBSCROLL_USERNAME=your_username
WORDPRESS_WEBSCROLL_PASSWORD=your_app_password
# Site 3: hellogeek.net
WORDPRESS_HELLOGEEK_URL=https://www.hellogeek.net
WORDPRESS_HELLOGEEK_USERNAME=your_username
WORDPRESS_HELLOGEEK_PASSWORD=your_app_password
# OpenRouter API (for AI recommendations)
OPENROUTER_API_KEY=your_key
Note: If a site's credentials are not specified, the script uses the primary site credentials.
Step 2: Verify Your .env
cat .env | grep -E "WORDPRESS|OPENROUTER"
Usage
Basic Usage (with AI recommendations)
python scripts/multi_site_seo_analyzer.py
This will:
- Fetch all posts from 3 sites
- Analyze each post
- Generate AI recommendations for top 10 worst-scoring posts
- Export results to CSV and Markdown
Include Draft Posts
python scripts/multi_site_seo_analyzer.py --include-drafts
Analyzes both published and draft posts. Useful for:
- Optimizing posts before publishing
- Recovering removed content saved as drafts
- Getting full picture of all content
- CSV will show
statuscolumn (publish/draft)
Skip AI (Save Cost)
python scripts/multi_site_seo_analyzer.py --no-ai
Analyzes posts without AI recommendations. Good for:
- Quick overview
- Sites with >500 posts (AI costs add up)
- Budget testing
Generate AI for Top 20 Posts
python scripts/multi_site_seo_analyzer.py --top-n 20
AI recommendations for 20 worst-scoring posts instead of 10.
Combine Options
# Analyze published + drafts with AI for top 20
python scripts/multi_site_seo_analyzer.py --include-drafts --top-n 20
# Analyze drafts only (then filter in Excel to status=draft)
python scripts/multi_site_seo_analyzer.py --include-drafts --no-ai
Custom Output File
python scripts/multi_site_seo_analyzer.py --output output/custom_report.csv
Output Files
1. CSV Report: seo_analysis_TIMESTAMP.csv
Contains all analyzed posts with columns:
| Column | Description |
|---|---|
site |
Website (mistergeek.net, webscroll.fr, hellogeek.net) |
post_id |
WordPress post ID |
title |
Post title |
slug |
Post slug |
url |
Full post URL |
meta_description |
Current meta description |
title_score |
Title SEO score (0-100) |
title_issues |
Title problems (too short, no power words, etc.) |
title_recommendations |
How to improve title |
meta_score |
Meta description SEO score (0-100) |
meta_issues |
Meta description problems |
meta_recommendations |
How to improve meta |
overall_score |
Combined score (40% title + 60% meta) |
ai_recommendations |
Claude-generated specific recommendations |
2. Summary Report: seo_analysis_TIMESTAMP_summary.md
Human-readable markdown with:
- Overall statistics (total posts, average score, cost)
- Priority issues (missing meta, weak titles, weak descriptions)
- Per-site breakdown
- Top 5 posts to optimize on each site
- Legend explaining scores
Understanding Scores
Title Score (0-100)
What's analyzed:
- Length (target: 50-70 characters)
- Power words (best, complete, guide, ultimate, essential, etc.)
- Numbers (top 5, 2025, etc.)
- Special characters that might break rendering
Optimal title example: "The Complete 2025 Guide to VPN Services (Updated)"
- Length: 57 characters ✓
- Power words: "Complete", "Guide" ✓
- Numbers: "2025" ✓
- Score: 95/100
Meta Description Score (0-100)
What's analyzed:
- Presence (missing = 0 score)
- Length (target: 120-160 characters)
- Call-to-action (learn, discover, find, check, etc.)
Optimal meta example: "Discover the best VPN services for 2025. Compare 50+ options, learn about encryption, and find the perfect VPN for your needs. Updated monthly."
- Length: 149 characters ✓
- CTA: "Discover", "Compare", "learn", "find" ✓
- Score: 90/100
Overall Score (0-100)
Overall = (Title Score × 40%) + (Meta Score × 60%)
Meta description weighted heavier because it directly impacts click-through rates from search results.
Action Plan
1. Review Results
# Open the summary report
open output/reports/seo_analysis_*.md
# Or open the detailed CSV
open output/reports/seo_analysis_*.csv
2. Prioritize by Score
High Priority (Score < 50):
- Title issues OR missing/weak meta
- Implement AI recommendations immediately
- Estimated impact: 10-20% CTR improvement
Medium Priority (Score 50-75):
- Minor title or meta issues
- Apply recommendations when convenient
- Estimated impact: 5-10% CTR improvement
Low Priority (Score > 75):
- Already optimized
- Only update if major content changes
3. Batch Implementation
For WordPress:
-
Go to WordPress admin
-
Edit post
-
Update title (if recommended)
-
Update meta description in Yoast SEO or All in One SEO:
- Yoast: Bottom of editor → "SEO" tab → Meta description
- AIOSEO: Right sidebar → "General" → Description
-
Save post
OR use bulk operations if your SEO plugin supports it.
4. Monitor Impact
Re-run the analyzer in 30 days:
python scripts/multi_site_seo_analyzer.py
Track improvements:
- Average score increase
- Fewer posts with score < 50
- Posts moved from "Missing meta" to "Strong meta"
Cost Estimation
AI Recommendation Costs
Using Claude 3.5 Sonnet via OpenRouter ($3 input / $15 output per 1M tokens):
Scenario 1: 10 posts with AI
- ~2,500 input tokens per post × 10 = 25,000 input tokens
- ~500 output tokens per post × 10 = 5,000 output tokens
- Cost: (25,000 × $3 + 5,000 × $15) / 1,000,000 = $0.105 (~11¢)
Scenario 2: 50 posts with AI
- 125,000 input + 25,000 output tokens
- Cost: $0.525 (~52¢)
Scenario 3: No AI (--no-ai flag)
- Cost: $0.00
Monthly Scenarios
| Scenario | Frequency | Cost/Month |
|---|---|---|
| No AI | Weekly | $0 |
| 10 posts/week | Weekly | ~€0.40 |
| 20 posts/week | Weekly | ~€0.80 |
| 50 posts/month | Once | ~€0.50 |
Troubleshooting
"Connection refused" on a site
Problem: WordPress site is down or credentials are wrong.
Solutions:
- Check site URL is correct (https, www vs no-www)
- Verify credentials: Try logging in manually
- Check if site has REST API enabled:
https://yoursite.com/wp-json/ - Skip that site temporarily (remove from config, re-run)
"No posts found"
Problem: API returns 0 posts.
Solutions:
- Verify credentials have permission to read posts
- Check if posts exist on the site
- Try without authentication (remove from config)
- Check if REST API is disabled
AI recommendations are empty
Problem: OpenRouter API call failed.
Solutions:
- Verify OPENROUTER_API_KEY is set:
echo $OPENROUTER_API_KEY - Check API key is valid (not expired, has credits)
- Try with --no-ai flag to verify the rest works
- Check internet connection
Memory issues with 1000+ posts
Problem: Script runs out of memory.
Solutions:
- Run --no-ai version first (lighter)
- Analyze one site at a time (modify config temporarily)
- Increase system memory or close other apps
Advanced Usage
Analyze One Site
Temporarily comment out sites in config.py or create a custom script:
from scripts.multi_site_seo_analyzer import MultiSiteSEOAnalyzer
from scripts.config import Config
analyzer = MultiSiteSEOAnalyzer()
# Override to just one site
analyzer.sites_config = {
'mistergeek.net': Config.WORDPRESS_SITES['mistergeek.net']
}
analyzer.run(use_ai=True, top_n=20)
Export to Google Sheets
- Download the CSV
- Open Google Sheets
- File → Import → Upload CSV
- Share link with team
- Filter by site or score
- Add "Completed" checkbox column
- Track progress as you optimize
Integrate with WordPress via Zapier
- Export CSV from analyzer
- Use Zapier to trigger WordPress post updates
- Automatically update meta descriptions for high-priority posts
- (Advanced - requires Zapier Pro)
Examples
Example 1: Post with Low Title Score
Title: "VPN"
Title Issues: Too short (3), Missing power word, No number
Title Score: 10/100
Recommendation: Expand title to include benefit and year
Better Title: "Best VPN Services 2025: Complete Guide"
Example 2: Post with Missing Meta
Meta Description: [MISSING]
Meta Score: 0/100
AI Recommendation:
"Write a meta description: 'Learn about the best VPN services for 2025.
Compare 50+ providers, understand encryption, and choose the right VPN
for your needs. Updated weekly.' (150 characters)"
Example 3: Strong Post (No Changes Needed)
Title: "The Complete Guide to NordVPN: Features, Pricing, and Reviews"
Title Issues: None
Title Score: 95/100
Meta: "Comprehensive review of NordVPN including speed tests, security features, pricing plans, and user reviews. Find out if NordVPN is right for you."
Meta Issues: None
Meta Score: 95/100
Overall Score: 95/100
Status: No changes needed ✓
FAQ
Q: How often should I run this? A: Monthly or after publishing 10+ new posts. More frequent for highly competitive topics.
Q: Will changing titles affect SEO? A: No, titles can be improved without penalty. The URL stays the same, so search rankings are preserved.
Q: Should I update all weak meta descriptions? A: Prioritize posts with traffic. Update high-traffic posts first for maximum impact.
Q: Can I use this on a site with 5000+ posts? A: Yes, but consider:
- Using --no-ai on first run (faster)
- Running once per month instead of weekly
- Focusing AI analysis on high-traffic posts only
Q: What if my site uses a different SEO plugin? A: The script looks for common meta description fields. If it finds nothing, add one manually. Plugin doesn't matter; the meta description HTML is standard.
Next Steps
- Run the analyzer:
python scripts/multi_site_seo_analyzer.py - Review the report: Open
output/reports/seo_analysis_*_summary.md - Prioritize: Identify posts with score < 50
- Implement: Update titles and meta descriptions
- Track: Re-run in 30 days to measure improvement
- Monitor: Watch Google Search Console for CTR improvements
Ready to optimize? Let's go! 🚀