Initial commit — SEO Guidelines & SmartCrawl reference
SmartCrawl plugin reference (11 docs): - Overview, configuration, titles & meta, schema, sitemaps, social/OG, redirects, breadcrumbs, content analysis, hooks/filters, known issues SEO strategy playbook (6 docs): - Keyword research, per-page-type selection, on-page optimization, local SEO, technical SEO, content strategy Reusable templates (3): - Site audit checklist, keyword research worksheet, page optimization checklist Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,66 @@
|
|||||||
|
# SEO Guidelines — SmartCrawl
|
||||||
|
|
||||||
|
A comprehensive reference repository for configuring and using the [SmartCrawl SEO plugin](https://wpmudev.com/project/smartcrawl-wordpress-seo/) across Keylink IT managed WordPress sites. Includes SmartCrawl configuration guides, SEO keyword strategy, and reusable templates.
|
||||||
|
|
||||||
|
## Purpose
|
||||||
|
|
||||||
|
When working on SEO for any Keylink IT client site that uses SmartCrawl, this repository serves as:
|
||||||
|
|
||||||
|
1. **Configuration reference** — How to set up every SmartCrawl module with optimal settings
|
||||||
|
2. **SEO strategy playbook** — Keyword research, on-page optimization, local SEO, and content strategy
|
||||||
|
3. **Reusable templates** — Audit checklists, keyword research worksheets, and per-page optimization checklists
|
||||||
|
|
||||||
|
## Repository Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
├── smartcrawl/
|
||||||
|
│ ├── overview.md Feature inventory, Pro vs Free, version info
|
||||||
|
│ ├── configuration.md Module-by-module setup with recommended settings
|
||||||
|
│ ├── titles-and-meta.md Template macros, per-page overrides, best practices
|
||||||
|
│ ├── schema-markup.md All supported types, LocalBusiness, WooCommerce
|
||||||
|
│ ├── sitemaps.md XML, News, Image sitemaps config + exclusions
|
||||||
|
│ ├── social-og-twitter.md Open Graph + Twitter Card setup
|
||||||
|
│ ├── redirects.md 301/302/307, regex, bulk import, gotchas
|
||||||
|
│ ├── breadcrumbs.md Shortcode usage, schema output, styling
|
||||||
|
│ ├── content-analysis.md Focus keywords, SEO checks, readability scoring
|
||||||
|
│ ├── hooks-and-filters.md Developer API reference (wds_* hooks)
|
||||||
|
│ └── known-issues.md Gotchas, conflicts, limitations
|
||||||
|
├── seo-strategy/
|
||||||
|
│ ├── keyword-research.md Fundamentals, free tools, competitor analysis
|
||||||
|
│ ├── keyword-selection-by-page.md Strategy per page type (home, service, blog, etc.)
|
||||||
|
│ ├── on-page-optimization.md Title tags, meta descriptions, headers, content, images
|
||||||
|
│ ├── local-seo.md GBP, NAP consistency, local schema, geo-keywords
|
||||||
|
│ ├── technical-seo.md Core Web Vitals, mobile-first, crawlability, canonicals
|
||||||
|
│ └── content-strategy.md Topic clusters, gap analysis, seasonal, prioritization
|
||||||
|
└── templates/
|
||||||
|
├── site-audit-checklist.md Pre-optimization audit template
|
||||||
|
├── keyword-research-template.md Worksheet for keyword research per site
|
||||||
|
└── page-optimization-template.md Per-page SEO checklist
|
||||||
|
```
|
||||||
|
|
||||||
|
## How to Use
|
||||||
|
|
||||||
|
### Starting SEO on a new site
|
||||||
|
|
||||||
|
1. Run the [Site Audit Checklist](templates/site-audit-checklist.md) to assess current state
|
||||||
|
2. Follow [SmartCrawl Configuration](smartcrawl/configuration.md) to set up the plugin
|
||||||
|
3. Use the [Keyword Research Template](templates/keyword-research-template.md) to identify targets
|
||||||
|
4. Apply the [Page Optimization Template](templates/page-optimization-template.md) to each priority page
|
||||||
|
|
||||||
|
### Optimizing an existing site
|
||||||
|
|
||||||
|
1. Review [On-Page Optimization](seo-strategy/on-page-optimization.md) for current best practices
|
||||||
|
2. Check [Known Issues](smartcrawl/known-issues.md) for any relevant gotchas
|
||||||
|
3. Use Search Console data mining from [Keyword Research](seo-strategy/keyword-research.md) to find quick wins
|
||||||
|
|
||||||
|
### Local business sites
|
||||||
|
|
||||||
|
Start with [Local SEO](seo-strategy/local-seo.md) — for small businesses, local optimization often has the highest ROI.
|
||||||
|
|
||||||
|
## SmartCrawl Version
|
||||||
|
|
||||||
|
This documentation is based on **SmartCrawl v3.15.0** (January 2026). Check for updates at [WPMU DEV](https://wpmudev.com/project/smartcrawl-wordpress-seo/).
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
Internal reference — Keylink IT
|
||||||
@@ -0,0 +1,147 @@
|
|||||||
|
# Content Strategy
|
||||||
|
|
||||||
|
How to plan, prioritize, and organize content for maximum SEO impact.
|
||||||
|
|
||||||
|
## Topic Clusters and Pillar Pages
|
||||||
|
|
||||||
|
The modern approach to building topical authority.
|
||||||
|
|
||||||
|
### Structure
|
||||||
|
|
||||||
|
- **Pillar page:** A comprehensive page covering a broad topic. Targets a competitive short-tail keyword.
|
||||||
|
- **Cluster pages:** 5-15 supporting pages each covering a subtopic in depth. Each targets a specific long-tail keyword.
|
||||||
|
- **Internal links:** Every cluster page links to the pillar page and vice versa. Cluster pages also link to each other.
|
||||||
|
|
||||||
|
### Example: Motorcycle Safety School
|
||||||
|
|
||||||
|
**Pillar page:** "Complete Guide to Getting Your Motorcycle License in Alaska"
|
||||||
|
- Targets: "motorcycle license Alaska"
|
||||||
|
|
||||||
|
**Cluster pages:**
|
||||||
|
- "What to Expect at a Basic Rider Course" → links to pillar
|
||||||
|
- "Motorcycle Gear Checklist for Beginners" → links to pillar
|
||||||
|
- "Alaska Motorcycle Laws and Requirements" → links to pillar
|
||||||
|
- "How to Choose the Right Motorcycle Safety Course" → links to pillar
|
||||||
|
- "MSF Certification: What It Means and Why It Matters" → links to pillar
|
||||||
|
- "Riding in Alaska: Weather, Roads, and Safety Tips" → links to pillar
|
||||||
|
|
||||||
|
**Why this works:** Google sees concentrated topical authority. The pillar page gets authority from all cluster pages. Cluster pages get authority from the pillar. The whole cluster ranks better than isolated pages would.
|
||||||
|
|
||||||
|
## Content Gap Analysis
|
||||||
|
|
||||||
|
Find topics competitors cover that you don't.
|
||||||
|
|
||||||
|
### Process
|
||||||
|
|
||||||
|
1. Search your primary keywords and study the top 5 results
|
||||||
|
2. List every subtopic, question, and section they cover
|
||||||
|
3. Compare against your own content
|
||||||
|
4. Prioritize gaps by: search intent match → search volume → difficulty
|
||||||
|
|
||||||
|
### Format Gaps
|
||||||
|
|
||||||
|
If competitors only have text and you create a video, infographic, or interactive tool — you can rank with a differentiated asset.
|
||||||
|
|
||||||
|
## Seasonal Keyword Opportunities
|
||||||
|
|
||||||
|
### Plan Ahead
|
||||||
|
|
||||||
|
Create seasonal content **2-3 months before peak** to give Google time to index and rank it.
|
||||||
|
|
||||||
|
| Business Type | Peak Season | Content Should Be Live By |
|
||||||
|
|--------------|-------------|--------------------------|
|
||||||
|
| Motorcycle training (Alaska) | Spring (March-May) | January-February |
|
||||||
|
| Event-based businesses | Season start | 2-3 months ahead |
|
||||||
|
| Portfolio/hiring | Q4 (hiring season) | September-October |
|
||||||
|
| General services | January (new year planning) | November-December |
|
||||||
|
|
||||||
|
### Seasonal Content Types
|
||||||
|
|
||||||
|
- "[Season] [Year] [Service] Schedule" pages
|
||||||
|
- Seasonal preparation guides
|
||||||
|
- Event announcements and previews
|
||||||
|
- Year-in-review or seasonal recap posts
|
||||||
|
|
||||||
|
### Reuse Strategy
|
||||||
|
|
||||||
|
Don't create new seasonal URLs each year. Update the same page:
|
||||||
|
- `/spring-motorcycle-courses/` (update content annually)
|
||||||
|
- NOT `/spring-2026-motorcycle-courses/` (dead URL next year)
|
||||||
|
|
||||||
|
## Prioritization Framework
|
||||||
|
|
||||||
|
### Tier 1 — Immediate (Highest ROI)
|
||||||
|
|
||||||
|
| Action | Why |
|
||||||
|
|--------|-----|
|
||||||
|
| Pages ranking positions 5-20 | "Striking distance" — small improvements = big gains |
|
||||||
|
| Service pages with transactional intent | Closest to revenue |
|
||||||
|
| Pages with high impressions but low CTR | Fix title/description for quick win |
|
||||||
|
|
||||||
|
### Tier 2 — Soon
|
||||||
|
|
||||||
|
| Action | Why |
|
||||||
|
|--------|-----|
|
||||||
|
| Homepage optimization | Highest-authority page |
|
||||||
|
| Core location pages | Foundation for local SEO |
|
||||||
|
| Top blog posts that could rank higher | Already have some authority |
|
||||||
|
|
||||||
|
### Tier 3 — Ongoing
|
||||||
|
|
||||||
|
| Action | Why |
|
||||||
|
|--------|-----|
|
||||||
|
| New blog content (topic clusters) | Builds topical authority over time |
|
||||||
|
| Portfolio/case study pages | Supports E-E-A-T |
|
||||||
|
| About/contact optimization | Supports local SEO |
|
||||||
|
| Content for identified gaps | Fills missing coverage |
|
||||||
|
|
||||||
|
### Golden Rule
|
||||||
|
|
||||||
|
**Optimize existing content before creating new content.** A page that already exists with some authority responds to improvements faster than a brand new page.
|
||||||
|
|
||||||
|
## Content Quality Standards
|
||||||
|
|
||||||
|
### Every Published Page Should Have
|
||||||
|
|
||||||
|
- [ ] One primary keyword targeted
|
||||||
|
- [ ] Clear search intent match
|
||||||
|
- [ ] Title tag optimized (50-60 chars, keyword near start)
|
||||||
|
- [ ] Meta description hand-crafted (150-160 chars)
|
||||||
|
- [ ] H1 with primary keyword
|
||||||
|
- [ ] Structured subheadings (H2/H3)
|
||||||
|
- [ ] Internal links to/from related pages
|
||||||
|
- [ ] At least one image with descriptive alt text
|
||||||
|
- [ ] Clear CTA (for commercial/transactional pages)
|
||||||
|
- [ ] SmartCrawl focus keyword set and analysis reviewed
|
||||||
|
|
||||||
|
### Content Types and Minimum Quality
|
||||||
|
|
||||||
|
| Type | Minimum Length | Key Elements |
|
||||||
|
|------|---------------|-------------|
|
||||||
|
| Service page | 500+ words | Pricing/CTA, features, FAQ, testimonials |
|
||||||
|
| Blog post | 800+ words | Answer the query thoroughly, internal links |
|
||||||
|
| Pillar page | 2,000+ words | Comprehensive coverage, links to all clusters |
|
||||||
|
| Location page | 500+ words | Unique local content, NAP, map |
|
||||||
|
| Portfolio piece | 300+ words | Project summary, skills, outcomes |
|
||||||
|
|
||||||
|
**Length is a guideline, not a rule.** A 400-word service page that perfectly answers the query will outrank a 2,000-word page that buries the answer.
|
||||||
|
|
||||||
|
## Content Calendar
|
||||||
|
|
||||||
|
### Monthly Rhythm
|
||||||
|
|
||||||
|
| Week | Activity |
|
||||||
|
|------|----------|
|
||||||
|
| Week 1 | Publish 1 new blog post (from topic cluster plan) |
|
||||||
|
| Week 2 | Optimize 2 existing pages (striking distance keywords) |
|
||||||
|
| Week 3 | Publish 1 new blog post or update an old one |
|
||||||
|
| Week 4 | Review Search Console data, plan next month |
|
||||||
|
|
||||||
|
### Quarterly Activities
|
||||||
|
|
||||||
|
- Review and update all service page content
|
||||||
|
- Audit internal links (find orphan pages, fix broken links)
|
||||||
|
- Check keyword rankings and adjust strategy
|
||||||
|
- Update seasonal content
|
||||||
|
|
||||||
|
This cadence is sustainable for small business sites and compounds over time.
|
||||||
@@ -0,0 +1,149 @@
|
|||||||
|
# Keyword Research
|
||||||
|
|
||||||
|
How to find the right keywords for any site, with an emphasis on free tools and methods applicable to small business WordPress sites.
|
||||||
|
|
||||||
|
## Fundamentals
|
||||||
|
|
||||||
|
### Primary vs Secondary Keywords
|
||||||
|
|
||||||
|
**Primary keyword:** The single most important search term a page should rank for. Every page gets exactly one. It should appear in the title tag, H1, URL slug, and first 100 words.
|
||||||
|
|
||||||
|
**Secondary keywords:** 3-5 closely related terms or synonyms that support the primary keyword. These go in H2/H3 headings, body content, and image alt text.
|
||||||
|
|
||||||
|
Google's NLP (BERT, MUM) understands synonyms and related concepts, so exact-match repetition is unnecessary — semantic relevance matters more.
|
||||||
|
|
||||||
|
**Example for a motorcycle safety course in Alaska:**
|
||||||
|
- Primary: "motorcycle safety course Anchorage"
|
||||||
|
- Secondary: "MSF basic rider course Alaska", "learn to ride motorcycle Anchorage", "motorcycle license training Alaska", "beginner motorcycle class near me"
|
||||||
|
|
||||||
|
### Long-Tail vs Short-Tail
|
||||||
|
|
||||||
|
| Aspect | Short-tail (1-2 words) | Long-tail (3+ words) |
|
||||||
|
|--------|----------------------|---------------------|
|
||||||
|
| Example | "motorcycle course" | "weekend motorcycle safety course Anchorage AK" |
|
||||||
|
| Search volume | High | Low |
|
||||||
|
| Competition | Very high | Low to moderate |
|
||||||
|
| Conversion rate | Low (vague intent) | High (specific intent) |
|
||||||
|
| Best for | Brand awareness, pillar pages | Service pages, blog posts, local pages |
|
||||||
|
|
||||||
|
**For small business sites, long-tail keywords are the priority.** You won't outrank national brands for "motorcycle course" but you can rank #1 for "motorcycle safety course Anchorage Alaska."
|
||||||
|
|
||||||
|
### Search Intent Types
|
||||||
|
|
||||||
|
Google categorizes every query by intent. **Matching intent is more important than keyword density or backlinks for ranking.**
|
||||||
|
|
||||||
|
| Intent | Signals | Content Type | Example |
|
||||||
|
|--------|---------|-------------|---------|
|
||||||
|
| **Informational** | "how to", "what is", "guide", questions | Blog posts, guides, FAQs | "how to prepare for a motorcycle safety course" |
|
||||||
|
| **Navigational** | Brand names, specific products | Homepage, branded pages | "Alaska Safe Riders" |
|
||||||
|
| **Commercial** | "best", "vs", "review", "top" | Comparison pages, service pages | "best motorcycle training courses in Alaska" |
|
||||||
|
| **Transactional** | "buy", "register", "near me", "price" | Service pages, registration, contact | "register motorcycle safety course Anchorage" |
|
||||||
|
|
||||||
|
**Check the current SERP for your target keyword** to see what Google considers the correct intent. If the top results are all blog posts, Google expects informational content — don't try to rank a service page there.
|
||||||
|
|
||||||
|
### Keyword Difficulty vs Search Volume
|
||||||
|
|
||||||
|
For small/local business sites, **ignore high-difficulty keywords at first.**
|
||||||
|
|
||||||
|
| Combination | Strategy |
|
||||||
|
|-------------|----------|
|
||||||
|
| Low difficulty + moderate volume | **Best opportunities — quick wins** |
|
||||||
|
| Low difficulty + low volume | Still valuable if commercial/transactional intent |
|
||||||
|
| High difficulty + high volume | Long-term goals only |
|
||||||
|
| High difficulty + low volume | Skip entirely |
|
||||||
|
|
||||||
|
**Quick difficulty check without paid tools:** Search your target keyword. If page 1 is dominated by Wikipedia, major publications, and government sites — too competitive. If you see other small businesses, local directories, and niche sites — achievable.
|
||||||
|
|
||||||
|
## Free Research Tools
|
||||||
|
|
||||||
|
### 1. Google Search Console (Your Best Tool)
|
||||||
|
|
||||||
|
Shows exactly what queries people use to find (or almost find) your site.
|
||||||
|
|
||||||
|
**Quick wins from Search Console:**
|
||||||
|
|
||||||
|
- **Performance > Queries > Sort by impressions:** See what Google shows your site for. High impressions + low clicks = fix your title/description or create dedicated content.
|
||||||
|
- **Position 8-20 keywords ("striking distance"):** These are queries where you're on page 1-2 but not top 5. A small content improvement or better title tag can push these up.
|
||||||
|
- **Pages report:** See which pages rank for which queries. If one page ranks for many unrelated queries, split content into separate focused pages.
|
||||||
|
- **Filter by query containing your location:** Find local search opportunities.
|
||||||
|
|
||||||
|
### 2. Google Autocomplete / People Also Ask / Related Searches
|
||||||
|
|
||||||
|
Free and directly reflects what people search for.
|
||||||
|
|
||||||
|
- **Autocomplete:** Type your service in Google and note every suggestion. Use the "alphabet soup" method: type `[service] a`, `[service] b`, etc.
|
||||||
|
- **People Also Ask (PAA):** Click on PAA questions to expand — Google loads more each time. Each question is a potential blog post or FAQ entry.
|
||||||
|
- **Related Searches:** At the bottom of the SERP. Semantically related queries Google considers relevant.
|
||||||
|
|
||||||
|
**Use incognito mode** and set location to your target area for accurate local results.
|
||||||
|
|
||||||
|
### 3. Google Trends
|
||||||
|
|
||||||
|
- **Compare seasonal patterns:** When do people search for your services most?
|
||||||
|
- **Compare keyword variations:** "motorcycle safety course" vs "motorcycle riding course" vs "motorcycle training"
|
||||||
|
- **Filter by region:** National trends may not match Alaska or Nashville patterns
|
||||||
|
- **Rising queries:** Terms growing in popularity — early opportunities
|
||||||
|
|
||||||
|
### 4. Free Tool Tiers
|
||||||
|
|
||||||
|
| Tool | Free Limit | Best For |
|
||||||
|
|------|-----------|----------|
|
||||||
|
| **Google Keyword Planner** | Unlimited (with Google Ads account) | Volume ranges, related keywords |
|
||||||
|
| **Ubersuggest** | 3 searches/day | Volume, difficulty, suggestions |
|
||||||
|
| **AnswerThePublic** | 3 searches/day | Questions people ask about a topic |
|
||||||
|
| **Keyword Surfer** (Chrome ext.) | Unlimited | Volume in Google search results |
|
||||||
|
| **AlsoAsked.com** | 3 searches/day | PAA data visualization |
|
||||||
|
| **Ahrefs Webmaster Tools** | Unlimited (site owner) | What you currently rank for |
|
||||||
|
|
||||||
|
### 5. Competitor Analysis (No Paid Tools)
|
||||||
|
|
||||||
|
- **Search your target keywords** and study who ranks on page 1:
|
||||||
|
- Their title tags and meta descriptions
|
||||||
|
- Content structure and length
|
||||||
|
- Header tags (view source)
|
||||||
|
- What topics they cover that you don't
|
||||||
|
- **Check competitor sitemaps:** `competitor.com/sitemap.xml` reveals their full content strategy
|
||||||
|
- **Google `site:competitor.com [your service]`** to see their pages targeting similar keywords
|
||||||
|
- **Ahrefs Free Backlink Checker:** Shows top backlinks for any URL
|
||||||
|
|
||||||
|
## The Keyword Matrix
|
||||||
|
|
||||||
|
For local businesses, create a grid:
|
||||||
|
|
||||||
|
| | Anchorage | Fairbanks | Wasilla | Eagle River |
|
||||||
|
|---|-----------|-----------|---------|-------------|
|
||||||
|
| motorcycle course | Target | Target | Assess | Assess |
|
||||||
|
| rider training | Target | Assess | -- | -- |
|
||||||
|
| motorcycle license | Target | Target | Assess | -- |
|
||||||
|
|
||||||
|
Each intersection with "Target" gets its own page or section. "Assess" means check volume before investing.
|
||||||
|
|
||||||
|
## Research Process
|
||||||
|
|
||||||
|
### Step 1: Seed Keywords
|
||||||
|
|
||||||
|
List everything you think your customers might search for. Include:
|
||||||
|
- Service names
|
||||||
|
- Problem descriptions ("how to get motorcycle license")
|
||||||
|
- Location variations
|
||||||
|
- Competitor brand names (for comparison content)
|
||||||
|
|
||||||
|
### Step 2: Expand with Tools
|
||||||
|
|
||||||
|
Run seed keywords through Google Autocomplete, PAA, Keyword Planner, and Ubersuggest. Note every relevant variation.
|
||||||
|
|
||||||
|
### Step 3: Classify by Intent
|
||||||
|
|
||||||
|
Tag each keyword as informational, navigational, commercial, or transactional.
|
||||||
|
|
||||||
|
### Step 4: Assess Difficulty
|
||||||
|
|
||||||
|
For each keyword, quick-check the SERP. Can you realistically compete?
|
||||||
|
|
||||||
|
### Step 5: Prioritize
|
||||||
|
|
||||||
|
Use the [Keyword Research Template](../templates/keyword-research-template.md) to organize and prioritize.
|
||||||
|
|
||||||
|
### Step 6: Map to Pages
|
||||||
|
|
||||||
|
Assign one primary keyword to each existing page. Create new pages for keywords that don't have a natural home.
|
||||||
@@ -0,0 +1,132 @@
|
|||||||
|
# Keyword Selection by Page Type
|
||||||
|
|
||||||
|
Every page on the site should target one primary keyword with a clear intent match. This guide covers how to choose keywords for each common page type.
|
||||||
|
|
||||||
|
## Homepage
|
||||||
|
|
||||||
|
| Aspect | Guidance |
|
||||||
|
|--------|---------|
|
||||||
|
| **Primary keyword** | Core service + primary location |
|
||||||
|
| **Intent** | Navigational + commercial |
|
||||||
|
| **Title pattern** | `[Brand Name] \| [Primary Service] in [Location]` |
|
||||||
|
| **Example** | "Alaska Safe Riders \| Motorcycle Safety Courses in Anchorage, AK" |
|
||||||
|
|
||||||
|
**Rules:**
|
||||||
|
- Establish what you do, where, and why you're the best choice
|
||||||
|
- Don't try to rank for everything — let inner pages handle specifics
|
||||||
|
- Don't keyword-stuff the homepage
|
||||||
|
|
||||||
|
## Service / Product Pages
|
||||||
|
|
||||||
|
| Aspect | Guidance |
|
||||||
|
|--------|---------|
|
||||||
|
| **Primary keyword** | Specific service + location |
|
||||||
|
| **Intent** | Commercial or transactional |
|
||||||
|
| **Title pattern** | `[Service Name] in [City, State] \| [Brand]` |
|
||||||
|
| **Example** | "Basic Rider Course in Anchorage, AK \| Alaska Safe Riders" |
|
||||||
|
|
||||||
|
**Rules:**
|
||||||
|
- **Each distinct service gets its own page** — "Basic Rider Course" and "Advanced Rider Course" should be separate pages
|
||||||
|
- Include pricing (or "contact for pricing"), what's included, duration, schedule, FAQs, testimonials
|
||||||
|
- Clear CTA (register, contact, sign up)
|
||||||
|
- Answer the questions a buyer would have before purchasing
|
||||||
|
|
||||||
|
## Blog Posts
|
||||||
|
|
||||||
|
| Aspect | Guidance |
|
||||||
|
|--------|---------|
|
||||||
|
| **Primary keyword** | Informational long-tail query |
|
||||||
|
| **Intent** | Informational |
|
||||||
|
| **Title pattern** | `[Question/Topic] — [Brand or Category]` |
|
||||||
|
| **Example** | "What to Wear to a Motorcycle Safety Course \| Alaska Safe Riders" |
|
||||||
|
|
||||||
|
**Rules:**
|
||||||
|
- Each post targets one specific question or topic
|
||||||
|
- Use Google's "People Also Ask" to find questions your audience searches
|
||||||
|
- **Internal link every blog post to relevant service pages** — this is the primary SEO purpose of blog content
|
||||||
|
- One blog post per topic — don't split thin content across multiple posts
|
||||||
|
|
||||||
|
## Portfolio Pages
|
||||||
|
|
||||||
|
| Aspect | Guidance |
|
||||||
|
|--------|---------|
|
||||||
|
| **Primary keyword** | Descriptive + role-based |
|
||||||
|
| **Intent** | Navigational or commercial investigation |
|
||||||
|
| **Title pattern** | `[Project Name] — [Role/Skill] Portfolio \| [Brand]` |
|
||||||
|
| **Example** | "IDT 5210 Capstone — Instructional Design Portfolio \| Chelsea Paige Mann" |
|
||||||
|
|
||||||
|
**Rules:**
|
||||||
|
- Each portfolio piece: descriptive title, project summary with natural keywords, skills/tools, outcomes
|
||||||
|
- Alt text on portfolio images should describe the work shown, not just "screenshot"
|
||||||
|
- Link to related pieces and back to the portfolio index
|
||||||
|
|
||||||
|
## Contact Page
|
||||||
|
|
||||||
|
| Aspect | Guidance |
|
||||||
|
|--------|---------|
|
||||||
|
| **Primary keyword** | "contact [brand]" or "[service] [location] contact" |
|
||||||
|
| **Intent** | Navigational / transactional |
|
||||||
|
| **Title pattern** | `Contact [Brand] \| [Location]` |
|
||||||
|
| **Example** | "Contact Alaska Safe Riders \| Anchorage, AK" |
|
||||||
|
|
||||||
|
**Rules:**
|
||||||
|
- Include full NAP (Name, Address, Phone)
|
||||||
|
- Embedded Google Map
|
||||||
|
- Contact form
|
||||||
|
- Business hours
|
||||||
|
- These signals support local SEO even if the page itself doesn't rank for much
|
||||||
|
|
||||||
|
## About Page
|
||||||
|
|
||||||
|
| Aspect | Guidance |
|
||||||
|
|--------|---------|
|
||||||
|
| **Primary keyword** | "[brand name] [location]" or "about [brand name]" |
|
||||||
|
| **Intent** | Navigational |
|
||||||
|
| **Title pattern** | `About [Brand] — [Qualifier] \| [Location]` |
|
||||||
|
| **Example** | "About Alaska Safe Riders — MSF-Certified Training Since 2015" |
|
||||||
|
|
||||||
|
**Rules:**
|
||||||
|
- Credentials, experience, team info, location details
|
||||||
|
- Supports E-E-A-T (Experience, Expertise, Authoritativeness, Trustworthiness)
|
||||||
|
- Natural keyword use (don't force it)
|
||||||
|
- Link to service pages and Google Business Profile
|
||||||
|
|
||||||
|
## Landing Pages
|
||||||
|
|
||||||
|
| Aspect | Guidance |
|
||||||
|
|--------|---------|
|
||||||
|
| **Primary keyword** | Highly specific transactional term |
|
||||||
|
| **Intent** | Transactional |
|
||||||
|
| **Title pattern** | `[Specific Offer] in [Location] \| [Brand]` |
|
||||||
|
| **Example** | "Spring 2026 Motorcycle Course — Register Now \| Alaska Safe Riders" |
|
||||||
|
|
||||||
|
**Rules:**
|
||||||
|
- Minimal navigation, singular CTA
|
||||||
|
- Everything on the page drives toward one action
|
||||||
|
- Seasonal landing pages capture time-specific traffic
|
||||||
|
- Can noindex after the season ends, then republish/update for the next cycle
|
||||||
|
|
||||||
|
## Location Pages (Multi-Location Businesses)
|
||||||
|
|
||||||
|
| Aspect | Guidance |
|
||||||
|
|--------|---------|
|
||||||
|
| **Primary keyword** | `[service] in [specific location]` |
|
||||||
|
| **Intent** | Commercial / transactional |
|
||||||
|
| **Title pattern** | `[Service] in [City] \| [Brand]` |
|
||||||
|
| **Example** | "Motorcycle Courses in Fairbanks, AK \| Alaska Safe Riders" |
|
||||||
|
|
||||||
|
**Rules:**
|
||||||
|
- **Each location page needs genuinely unique content** — local landmarks, directions, area-specific details, local testimonials
|
||||||
|
- **Do NOT create thin location pages** that only swap city names — Google penalizes doorway pages
|
||||||
|
- Only create if you have enough real content to differentiate each page
|
||||||
|
|
||||||
|
## Common Mistakes
|
||||||
|
|
||||||
|
| Mistake | Fix |
|
||||||
|
|---------|-----|
|
||||||
|
| Same keyword on multiple pages | One primary keyword per page. If two pages target the same term, merge them. |
|
||||||
|
| Homepage targeting specific long-tail | Let inner pages handle specifics. Homepage = broad brand + service + location. |
|
||||||
|
| Blog posts with no internal links to services | Every blog post should link to at least one relevant service page. |
|
||||||
|
| Service pages with no CTA | Every service page needs a clear next step (register, contact, buy). |
|
||||||
|
| Portfolio pages with no keywords | Add descriptive titles and summaries with natural keyword use. |
|
||||||
|
| Contact page with just a form | Add NAP, map, hours, and service area for local SEO signals. |
|
||||||
@@ -0,0 +1,201 @@
|
|||||||
|
# Local SEO
|
||||||
|
|
||||||
|
For small businesses with physical locations or defined service areas, local SEO often has the highest ROI of any optimization effort. This is critical for Alaska, Nashville, and other location-specific client sites.
|
||||||
|
|
||||||
|
## Google Business Profile (GBP)
|
||||||
|
|
||||||
|
The single most important local ranking factor.
|
||||||
|
|
||||||
|
### Setup Checklist
|
||||||
|
|
||||||
|
- [ ] **Business name:** Exact legal name (no keyword stuffing)
|
||||||
|
- [ ] **Address:** Full street address (or service area if no storefront)
|
||||||
|
- [ ] **Phone:** Local number (not toll-free if possible)
|
||||||
|
- [ ] **Hours:** Complete and accurate, including holidays
|
||||||
|
- [ ] **Website URL:** Link to homepage
|
||||||
|
- [ ] **Business description:** 750 characters max, include primary keywords naturally
|
||||||
|
- [ ] **Primary category:** Choose carefully — strongest ranking signal
|
||||||
|
- [ ] **Secondary categories:** Add all that apply (less weight but still help)
|
||||||
|
- [ ] **Services/Products:** List all offerings with descriptions
|
||||||
|
- [ ] **Attributes:** Check all applicable attributes (wheelchair accessible, etc.)
|
||||||
|
- [ ] **Photos:** Add 10+ photos at setup, then monthly updates
|
||||||
|
|
||||||
|
### Ongoing GBP Activities
|
||||||
|
|
||||||
|
| Activity | Frequency | Impact |
|
||||||
|
|----------|-----------|--------|
|
||||||
|
| Google Posts | Weekly | Shows activity, appears in knowledge panel |
|
||||||
|
| Photos | Monthly | 100+ photos = 520% more calls (BrightLocal data) |
|
||||||
|
| Review responses | Within 24-48 hours | Directly impacts ranking + trust |
|
||||||
|
| Q&A | Seed with common questions | Prevents random/incorrect answers |
|
||||||
|
| Hours updates | As needed | Especially holidays and seasonal changes |
|
||||||
|
|
||||||
|
### Getting Reviews
|
||||||
|
|
||||||
|
- Ask satisfied customers directly (in person or follow-up email)
|
||||||
|
- Share a direct review link: `search.google.com/local/writereview?placeid=[YOUR_PLACE_ID]`
|
||||||
|
- Respond to **every** review (positive and negative) professionally
|
||||||
|
- Never buy or incentivize reviews — Google penalizes this
|
||||||
|
|
||||||
|
## NAP Consistency
|
||||||
|
|
||||||
|
**NAP = Name, Address, Phone number.** Must be identical everywhere.
|
||||||
|
|
||||||
|
### The Rule
|
||||||
|
|
||||||
|
Pick ONE format and use it everywhere:
|
||||||
|
- "123 Main Street" vs "123 Main St." vs "123 Main St" — choose one
|
||||||
|
- Include or exclude suite numbers consistently
|
||||||
|
- Phone format: `(907) 555-0123` or `907-555-0123` — pick one
|
||||||
|
|
||||||
|
### Where NAP Must Appear
|
||||||
|
|
||||||
|
- Website (header, footer, contact page)
|
||||||
|
- Google Business Profile
|
||||||
|
- Yelp, Facebook, Instagram
|
||||||
|
- Industry-specific directories
|
||||||
|
- Chamber of Commerce, BBB
|
||||||
|
- Apple Maps, Bing Places
|
||||||
|
- Any citation or directory listing
|
||||||
|
|
||||||
|
### Auditing Citations
|
||||||
|
|
||||||
|
- Search your business name and manually check the top 20 results
|
||||||
|
- Use Moz Local checker (free) for a broader scan
|
||||||
|
- Fix inconsistencies immediately — they confuse Google
|
||||||
|
|
||||||
|
## Local Schema Markup
|
||||||
|
|
||||||
|
Add `LocalBusiness` schema to your website. See [Schema Markup](../smartcrawl/schema-markup.md) for SmartCrawl-specific implementation.
|
||||||
|
|
||||||
|
### Minimum Required
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "LocalBusiness",
|
||||||
|
"name": "Business Name",
|
||||||
|
"address": {
|
||||||
|
"@type": "PostalAddress",
|
||||||
|
"streetAddress": "123 Main St",
|
||||||
|
"addressLocality": "Anchorage",
|
||||||
|
"addressRegion": "AK",
|
||||||
|
"postalCode": "99501",
|
||||||
|
"addressCountry": "US"
|
||||||
|
},
|
||||||
|
"telephone": "+1-907-555-0123",
|
||||||
|
"url": "https://example.com"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Recommended Additional
|
||||||
|
|
||||||
|
- `openingHoursSpecification`
|
||||||
|
- `geo` (latitude/longitude)
|
||||||
|
- `areaServed`
|
||||||
|
- `priceRange`
|
||||||
|
- `image` (logo)
|
||||||
|
- `sameAs` (social profiles, directory listings)
|
||||||
|
|
||||||
|
Choose the most specific `@type` subtype that applies (e.g., `EducationalOrganization`, `ProfessionalService`).
|
||||||
|
|
||||||
|
## Location-Based Keywords
|
||||||
|
|
||||||
|
### Keyword Patterns
|
||||||
|
|
||||||
|
| Pattern | Example |
|
||||||
|
|---------|---------|
|
||||||
|
| `[service] + [city]` | "motorcycle course Anchorage" |
|
||||||
|
| `[service] + [state]` | "motorcycle safety training Alaska" |
|
||||||
|
| `[service] + near me` | Handled by Google via GBP/location signals |
|
||||||
|
| `[service] + [neighborhood]` | "riding lessons Eagle River" |
|
||||||
|
| `[service] + [qualifier] + [location]` | "affordable motorcycle course Anchorage AK" |
|
||||||
|
|
||||||
|
### Keyword Matrix
|
||||||
|
|
||||||
|
List all services down one side and all locations across the top. Each intersection is a potential target:
|
||||||
|
|
||||||
|
| | Anchorage | Fairbanks | Wasilla |
|
||||||
|
|---|-----------|-----------|---------|
|
||||||
|
| Basic Rider Course | Primary | Secondary | Assess |
|
||||||
|
| Advanced Course | Primary | -- | -- |
|
||||||
|
| Safety Clinic | Primary | Secondary | -- |
|
||||||
|
|
||||||
|
### "Near Me" Optimization
|
||||||
|
|
||||||
|
You do **NOT** optimize for "near me" by putting "near me" on your page. Google determines "near me" results based on:
|
||||||
|
- Searcher's physical location
|
||||||
|
- Your GBP location
|
||||||
|
- Local relevance signals (NAP, citations, reviews, local content)
|
||||||
|
|
||||||
|
**Optimize for `[service] + [city/state]` instead** — this covers both explicit geo-queries and implicit "near me" intent.
|
||||||
|
|
||||||
|
## Location Pages
|
||||||
|
|
||||||
|
### When to Create Them
|
||||||
|
|
||||||
|
Only if you have genuinely unique content for each location:
|
||||||
|
- Local landmarks, directions
|
||||||
|
- Area-specific service details
|
||||||
|
- Local testimonials
|
||||||
|
- Unique offerings per location
|
||||||
|
|
||||||
|
### When NOT to Create Them
|
||||||
|
|
||||||
|
**Do not create thin location pages** that only swap city names. Google penalizes doorway pages. A page that says the same thing as another page but with "Fairbanks" instead of "Anchorage" is a doorway page.
|
||||||
|
|
||||||
|
### Template for Good Location Pages
|
||||||
|
|
||||||
|
```
|
||||||
|
# [Service] in [City], [State]
|
||||||
|
|
||||||
|
[2-3 paragraphs about the service specific to this location]
|
||||||
|
|
||||||
|
## What to Expect
|
||||||
|
[Location-specific details]
|
||||||
|
|
||||||
|
## Getting Here
|
||||||
|
[Directions, parking, landmarks]
|
||||||
|
|
||||||
|
## Local Testimonials
|
||||||
|
[Reviews from customers in this area]
|
||||||
|
|
||||||
|
## Schedule & Pricing
|
||||||
|
[Location-specific schedule if different]
|
||||||
|
|
||||||
|
[CTA to register/contact]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Local Content Ideas
|
||||||
|
|
||||||
|
Content that signals local relevance to Google:
|
||||||
|
|
||||||
|
- Event coverage (local events you participate in or sponsor)
|
||||||
|
- Local partnerships and community involvement
|
||||||
|
- Area guides related to your industry
|
||||||
|
- Seasonal content specific to your region
|
||||||
|
- Local news or industry updates
|
||||||
|
- Customer success stories from the area
|
||||||
|
|
||||||
|
## Mobile Optimization
|
||||||
|
|
||||||
|
Most "near me" and local searches happen on mobile:
|
||||||
|
|
||||||
|
- Font size minimum 16px
|
||||||
|
- Tap targets minimum 48x48px
|
||||||
|
- Click-to-call phone numbers
|
||||||
|
- Embedded Google Map on contact page
|
||||||
|
- Fast load times (especially on mobile networks)
|
||||||
|
|
||||||
|
## Local SEO Checklist
|
||||||
|
|
||||||
|
- [ ] Google Business Profile fully completed and verified
|
||||||
|
- [ ] NAP consistent across all platforms
|
||||||
|
- [ ] LocalBusiness schema on website (validated)
|
||||||
|
- [ ] Location keywords in title tags and meta descriptions of key pages
|
||||||
|
- [ ] Contact page has full NAP + Google Map
|
||||||
|
- [ ] Collecting and responding to reviews
|
||||||
|
- [ ] Listed in relevant local directories
|
||||||
|
- [ ] Mobile-friendly and fast-loading
|
||||||
|
- [ ] Google Posts published weekly
|
||||||
|
- [ ] Photos updated monthly on GBP
|
||||||
@@ -0,0 +1,162 @@
|
|||||||
|
# On-Page Optimization
|
||||||
|
|
||||||
|
Current best practices (2025-2026) for optimizing individual pages. These apply regardless of the SEO plugin used.
|
||||||
|
|
||||||
|
## Title Tags
|
||||||
|
|
||||||
|
### Rules
|
||||||
|
|
||||||
|
- **Length:** 50-60 characters (Google truncates at ~580px pixel width)
|
||||||
|
- **Primary keyword:** As close to the beginning as possible
|
||||||
|
- **Unique:** Every page must have a unique title
|
||||||
|
- **Brand name:** At the end (builds recognition)
|
||||||
|
- **Don't stuff:** One primary keyword is enough
|
||||||
|
|
||||||
|
### CTR Optimization
|
||||||
|
|
||||||
|
Include value propositions, numbers, or power words:
|
||||||
|
|
||||||
|
| Weak | Strong |
|
||||||
|
|------|--------|
|
||||||
|
| `Home - My Website` | `Motorcycle Safety Courses Anchorage, AK \| Alaska Safe Riders` |
|
||||||
|
| `Services` | `Basic Rider Course (MSF Certified) \| Alaska Safe Riders` |
|
||||||
|
| `Blog Post Title` | `What to Expect at a Basic Rider Course (2026 Guide)` |
|
||||||
|
|
||||||
|
## Meta Descriptions
|
||||||
|
|
||||||
|
### Rules
|
||||||
|
|
||||||
|
- **Length:** 150-160 characters
|
||||||
|
- **Include primary keyword** naturally (Google bolds matching terms)
|
||||||
|
- **Include a CTA:** "Register today", "Learn more", "Contact us"
|
||||||
|
- **Include differentiators:** Price, location, certifications
|
||||||
|
- **Hand-craft** for important pages — auto-generated descriptions rarely perform well
|
||||||
|
|
||||||
|
### Example
|
||||||
|
|
||||||
|
> Learn to ride with Alaska's most experienced MSF-certified instructors. Weekend and weekday courses in Anchorage. Register online — classes fill fast.
|
||||||
|
|
||||||
|
**Note:** Google rewrites ~60% of meta descriptions, but well-written ones are kept and significantly improve CTR.
|
||||||
|
|
||||||
|
## Header Tags
|
||||||
|
|
||||||
|
### Hierarchy
|
||||||
|
|
||||||
|
- **H1:** Exactly one per page. Contains primary keyword. Closely matches the title tag.
|
||||||
|
- **H2:** Major sections (3-8 per page). Use secondary keywords and related topics.
|
||||||
|
- **H3:** Subsections under H2s. Use long-tail variations and questions.
|
||||||
|
- **Never skip levels** (no H1 directly to H3)
|
||||||
|
|
||||||
|
### Headers are semantic, not visual
|
||||||
|
|
||||||
|
Using `<b>` or large font size is NOT the same as a proper `<h2>`. Headers tell search engines about content hierarchy.
|
||||||
|
|
||||||
|
## Content Optimization
|
||||||
|
|
||||||
|
### Keyword Density is Dead
|
||||||
|
|
||||||
|
Google's algorithms (BERT, MUM, Helpful Content System) understand topics, not word frequency. What replaces it:
|
||||||
|
|
||||||
|
**Topical coverage:** Cover the topic comprehensively. If writing about motorcycle safety courses, naturally mention gear requirements, licensing, MSF certification, course duration, prerequisites, etc.
|
||||||
|
|
||||||
|
**E-E-A-T signals:**
|
||||||
|
- **Experience:** First-person accounts, original photos, real examples
|
||||||
|
- **Expertise:** Deep knowledge, cite specifics, avoid filler
|
||||||
|
- **Authoritativeness:** Author bios, credentials, industry affiliations
|
||||||
|
- **Trustworthiness:** Accurate information, transparent business info
|
||||||
|
|
||||||
|
**Google's Helpful Content guidelines:**
|
||||||
|
- Written for humans first, not search engines?
|
||||||
|
- Demonstrates first-hand experience?
|
||||||
|
- Reader will feel they learned enough to achieve their goal?
|
||||||
|
|
||||||
|
### Practical Rules
|
||||||
|
|
||||||
|
- Put the most important information first (inverted pyramid)
|
||||||
|
- Short paragraphs (2-4 sentences)
|
||||||
|
- Answer the searcher's question within the first 100-200 words
|
||||||
|
- Use lists, tables, and structured formatting
|
||||||
|
- Content should be as long as it needs to be — a focused 500-word service page can outrank a padded 3,000-word one
|
||||||
|
|
||||||
|
## Image Optimization
|
||||||
|
|
||||||
|
### Alt Text
|
||||||
|
|
||||||
|
- **Describe what the image shows** in plain language
|
||||||
|
- **Include keywords naturally** where they genuinely describe the image
|
||||||
|
- **Keep under 125 characters** (screen readers truncate longer)
|
||||||
|
- **Decorative images** get empty alt (`alt=""`)
|
||||||
|
|
||||||
|
### File Names
|
||||||
|
|
||||||
|
`basic-rider-course-anchorage.jpg` beats `DSC00451.jpg`
|
||||||
|
|
||||||
|
### Technical
|
||||||
|
|
||||||
|
- Use WebP or AVIF format for smaller file sizes
|
||||||
|
- Set explicit width and height attributes (prevents CLS)
|
||||||
|
- Lazy load below-the-fold images
|
||||||
|
- Compress to reasonable quality (80-85% is usually sufficient)
|
||||||
|
|
||||||
|
## Internal Linking
|
||||||
|
|
||||||
|
One of the most underused and highest-ROI SEO tactics.
|
||||||
|
|
||||||
|
### Rules
|
||||||
|
|
||||||
|
- **Every page should link to and be linked from 2-3+ other pages**
|
||||||
|
- **Descriptive anchor text** — "our basic rider course" not "click here"
|
||||||
|
- **Blog posts → service pages** (primary purpose of blog content for SEO)
|
||||||
|
- **Service pages → related services** (keeps users on site)
|
||||||
|
- **Fix orphan pages** — any page with zero internal links is nearly invisible to Google
|
||||||
|
|
||||||
|
### Site Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
Homepage
|
||||||
|
├── Service Page 1
|
||||||
|
│ ├── Blog Post A (links back to Service 1)
|
||||||
|
│ └── Blog Post B (links back to Service 1)
|
||||||
|
├── Service Page 2
|
||||||
|
│ ├── Blog Post C
|
||||||
|
│ └── Blog Post D
|
||||||
|
├── About
|
||||||
|
└── Contact
|
||||||
|
```
|
||||||
|
|
||||||
|
This pyramid distributes authority downward from the homepage.
|
||||||
|
|
||||||
|
## URL Slugs
|
||||||
|
|
||||||
|
### Rules
|
||||||
|
|
||||||
|
- **Short and descriptive:** `/basic-rider-course/`
|
||||||
|
- **Include primary keyword:** `/motorcycle-safety-course-anchorage/`
|
||||||
|
- **Hyphens, not underscores:** Google treats hyphens as word separators
|
||||||
|
- **Lowercase only**
|
||||||
|
- **No dates in URLs** unless truly time-bound content
|
||||||
|
- **Never change URLs without 301 redirects**
|
||||||
|
|
||||||
|
### Bad vs Good
|
||||||
|
|
||||||
|
| Bad | Good |
|
||||||
|
|-----|------|
|
||||||
|
| `/2026/04/09/blog-post/` | `/how-to-prepare-for-motorcycle-course/` |
|
||||||
|
| `/services/` | `/motorcycle-safety-courses-anchorage/` |
|
||||||
|
| `/page_about_us/` | `/about/` |
|
||||||
|
|
||||||
|
## Quick Optimization Checklist
|
||||||
|
|
||||||
|
For any page:
|
||||||
|
|
||||||
|
- [ ] Title tag: 50-60 chars, primary keyword near start, unique
|
||||||
|
- [ ] Meta description: 150-160 chars, keyword included, CTA, hand-crafted
|
||||||
|
- [ ] H1: Exactly one, contains primary keyword
|
||||||
|
- [ ] H2/H3: Use secondary keywords in subheadings
|
||||||
|
- [ ] Content: Answers the searcher's question in the first 200 words
|
||||||
|
- [ ] Images: Descriptive alt text, optimized file size, descriptive file names
|
||||||
|
- [ ] Internal links: 2-3+ links to/from related pages, descriptive anchors
|
||||||
|
- [ ] URL: Short, keyword-included, lowercase, hyphens
|
||||||
|
- [ ] Focus keyword set in SmartCrawl (up to 3)
|
||||||
|
- [ ] SmartCrawl SEO analysis: all green or justified yellow
|
||||||
|
- [ ] Readability: Flesch-Kincaid 60-70 target
|
||||||
@@ -0,0 +1,194 @@
|
|||||||
|
# Technical SEO
|
||||||
|
|
||||||
|
Technical foundations that must be in place for any SEO effort to succeed. These affect how Google crawls, indexes, and ranks your site.
|
||||||
|
|
||||||
|
## Core Web Vitals
|
||||||
|
|
||||||
|
Google's page experience signals. Content relevance is still more important, but poor performance can hold you back.
|
||||||
|
|
||||||
|
### Metrics
|
||||||
|
|
||||||
|
| Metric | Target | What It Measures |
|
||||||
|
|--------|--------|-----------------|
|
||||||
|
| **LCP** (Largest Contentful Paint) | Under 2.5s | How fast the main content loads |
|
||||||
|
| **INP** (Interaction to Next Paint) | Under 200ms | How responsive the page is to input |
|
||||||
|
| **CLS** (Cumulative Layout Shift) | Under 0.1 | How much the layout shifts during load |
|
||||||
|
|
||||||
|
### How to Improve
|
||||||
|
|
||||||
|
**LCP:**
|
||||||
|
- Optimize images (WebP/AVIF, proper sizing, lazy loading for below-fold)
|
||||||
|
- Reduce server response time (caching, CDN)
|
||||||
|
- Preload critical resources (fonts, hero images)
|
||||||
|
- Minimize render-blocking CSS/JS
|
||||||
|
|
||||||
|
**INP:**
|
||||||
|
- Minimize JavaScript execution time
|
||||||
|
- Break up long tasks
|
||||||
|
- Optimize event handlers
|
||||||
|
- Defer non-critical JavaScript
|
||||||
|
|
||||||
|
**CLS:**
|
||||||
|
- Set explicit width/height on images and embeds
|
||||||
|
- Don't insert content above existing content dynamically
|
||||||
|
- Use `font-display: swap` or preload web fonts
|
||||||
|
- Reserve space for ads/embeds
|
||||||
|
|
||||||
|
### WordPress Specifics
|
||||||
|
|
||||||
|
- Use server-level caching (EA-Nginx proxy cache is already configured on our server)
|
||||||
|
- Optimize images on upload (Smush or similar)
|
||||||
|
- Minimize plugin count — each plugin adds overhead
|
||||||
|
- Use Hummingbird or LiteSpeed Cache for asset optimization
|
||||||
|
- Purge Nginx cache after changes: `rm -rf /var/cache/ea-nginx/proxy/<account>/*`
|
||||||
|
|
||||||
|
## Mobile-First Indexing
|
||||||
|
|
||||||
|
Google uses the **mobile version** of your site for indexing and ranking. There is no separate desktop index.
|
||||||
|
|
||||||
|
### Requirements
|
||||||
|
|
||||||
|
- [ ] All desktop content is also visible on mobile
|
||||||
|
- [ ] Viewport meta tag present: `<meta name="viewport" content="width=device-width, initial-scale=1">`
|
||||||
|
- [ ] Font size minimum 16px body text
|
||||||
|
- [ ] Tap targets minimum 48x48px with 8px spacing
|
||||||
|
- [ ] No horizontal scrolling
|
||||||
|
- [ ] Content hidden in accordions/tabs is fine (as long as it's in the HTML)
|
||||||
|
|
||||||
|
### Testing
|
||||||
|
|
||||||
|
- Google's Mobile-Friendly Test
|
||||||
|
- Search Console > Mobile Usability report
|
||||||
|
- Chrome DevTools device emulator
|
||||||
|
|
||||||
|
## Crawlability and Indexability
|
||||||
|
|
||||||
|
### XML Sitemap
|
||||||
|
|
||||||
|
- Submit to Google Search Console
|
||||||
|
- SmartCrawl generates this automatically
|
||||||
|
- Verify at `yoursite.com/sitemap.xml`
|
||||||
|
- Include all important pages, exclude thin/duplicate content
|
||||||
|
|
||||||
|
### Robots.txt
|
||||||
|
|
||||||
|
Recommended content:
|
||||||
|
|
||||||
|
```
|
||||||
|
User-agent: *
|
||||||
|
Allow: /
|
||||||
|
Disallow: /wp-admin/
|
||||||
|
Allow: /wp-admin/admin-ajax.php
|
||||||
|
|
||||||
|
Sitemap: https://yoursite.com/sitemap.xml
|
||||||
|
```
|
||||||
|
|
||||||
|
**Do NOT block CSS/JS files** — Google needs them for mobile-first rendering.
|
||||||
|
|
||||||
|
### Crawl Budget
|
||||||
|
|
||||||
|
For small sites (<500 pages), crawl budget is rarely an issue. For larger sites:
|
||||||
|
- Don't waste budget on filter pages, parameter URLs, or thin pagination
|
||||||
|
- Use `noindex` on pages with no SEO value
|
||||||
|
- Keep the sitemap clean (only valuable URLs)
|
||||||
|
|
||||||
|
### Index Status
|
||||||
|
|
||||||
|
Check Search Console > Pages report for:
|
||||||
|
|
||||||
|
| Status | Meaning | Action |
|
||||||
|
|--------|---------|--------|
|
||||||
|
| Indexed | Page is in Google | Good |
|
||||||
|
| Discovered — not indexed | Google knows about it but hasn't indexed it | Improve content quality, add internal links |
|
||||||
|
| Crawled — not indexed | Google crawled it but chose not to index | Content isn't valuable enough — improve or noindex |
|
||||||
|
| Excluded by noindex | You set noindex | Intentional? If not, fix it |
|
||||||
|
|
||||||
|
### What to Noindex
|
||||||
|
|
||||||
|
- Thank you / confirmation pages
|
||||||
|
- Internal search results
|
||||||
|
- Tag archives with thin content
|
||||||
|
- Author archives on single-author sites
|
||||||
|
- Admin/login pages
|
||||||
|
- Paginated archives
|
||||||
|
- Media attachment pages
|
||||||
|
|
||||||
|
## Canonical URLs
|
||||||
|
|
||||||
|
### Self-Referencing Canonicals
|
||||||
|
|
||||||
|
Every page should have: `<link rel="canonical" href="https://example.com/current-page/">`
|
||||||
|
|
||||||
|
SmartCrawl handles this automatically for most cases.
|
||||||
|
|
||||||
|
### Choose One Format
|
||||||
|
|
||||||
|
Pick one and redirect all variations to it:
|
||||||
|
|
||||||
|
| Decision | Options |
|
||||||
|
|----------|---------|
|
||||||
|
| www vs non-www | `example.com` or `www.example.com` |
|
||||||
|
| HTTP vs HTTPS | Always HTTPS |
|
||||||
|
| Trailing slash | `/page/` or `/page` — pick one |
|
||||||
|
|
||||||
|
Redirect the other variations via `.htaccess` or server config (not SmartCrawl — this is a server-level concern).
|
||||||
|
|
||||||
|
## Structured Data
|
||||||
|
|
||||||
|
See [Schema Markup](../smartcrawl/schema-markup.md) for SmartCrawl implementation.
|
||||||
|
|
||||||
|
### Priority Order
|
||||||
|
|
||||||
|
| Schema Type | Rich Result | Priority |
|
||||||
|
|-------------|-------------|----------|
|
||||||
|
| **LocalBusiness** | Knowledge panel, maps | Every local business |
|
||||||
|
| **FAQ** | Expandable Q&A in SERPs | Pages with Q&A content |
|
||||||
|
| **BreadcrumbList** | Breadcrumb trail in SERPs | All pages (via Breadcrumbs module) |
|
||||||
|
| **Event** | Date/time/location in SERPs | Event listings |
|
||||||
|
| **Course** | Course listing | Educational offerings |
|
||||||
|
| **Article** | Article metadata | Blog posts |
|
||||||
|
| **Product** | Price, availability, rating | WooCommerce products |
|
||||||
|
| **Review / AggregateRating** | Stars in results | Review pages (genuine reviews only) |
|
||||||
|
|
||||||
|
### Validation
|
||||||
|
|
||||||
|
Always validate after deployment:
|
||||||
|
|
||||||
|
1. [Google Rich Results Test](https://search.google.com/test/rich-results)
|
||||||
|
2. [Schema.org Validator](https://validator.schema.org/)
|
||||||
|
3. Google Search Console > Enhancements (ongoing monitoring)
|
||||||
|
|
||||||
|
## HTTPS
|
||||||
|
|
||||||
|
- **Required.** No exceptions. Google uses HTTPS as a ranking signal.
|
||||||
|
- All HTTP URLs should 301 redirect to HTTPS
|
||||||
|
- Mixed content (HTTP resources on HTTPS pages) must be fixed
|
||||||
|
- SSL certificates are managed via cPanel on our server
|
||||||
|
|
||||||
|
## Page Speed Quick Wins
|
||||||
|
|
||||||
|
| Action | Impact | Effort |
|
||||||
|
|--------|--------|--------|
|
||||||
|
| Enable server-level caching | High | Already done (EA-Nginx) |
|
||||||
|
| Optimize images (WebP, compression) | High | Low |
|
||||||
|
| Lazy load below-fold images | Medium | Low |
|
||||||
|
| Minimize active plugins | Medium | Low |
|
||||||
|
| Preload critical fonts | Medium | Low |
|
||||||
|
| Defer non-critical JavaScript | Medium | Medium |
|
||||||
|
| Use a CDN | Medium | Medium |
|
||||||
|
| Inline critical CSS | Low | High |
|
||||||
|
|
||||||
|
## Technical SEO Audit Checklist
|
||||||
|
|
||||||
|
- [ ] Site loads over HTTPS (no mixed content)
|
||||||
|
- [ ] XML sitemap exists and is submitted to Search Console
|
||||||
|
- [ ] Robots.txt is correct (not blocking important resources)
|
||||||
|
- [ ] All pages have self-referencing canonical tags
|
||||||
|
- [ ] One URL format (www/non-www, slash/no-slash) with redirects for the rest
|
||||||
|
- [ ] No orphan pages (every page has internal links)
|
||||||
|
- [ ] Core Web Vitals pass (LCP < 2.5s, INP < 200ms, CLS < 0.1)
|
||||||
|
- [ ] Mobile-friendly test passes
|
||||||
|
- [ ] No 404 errors on important pages (check Search Console)
|
||||||
|
- [ ] Structured data validates without errors
|
||||||
|
- [ ] No duplicate title tags or meta descriptions
|
||||||
|
- [ ] Images have alt text and are optimized
|
||||||
@@ -0,0 +1,146 @@
|
|||||||
|
# Breadcrumbs
|
||||||
|
|
||||||
|
SmartCrawl provides breadcrumb navigation with built-in Schema.org `BreadcrumbList` markup. Breadcrumbs improve both UX (users can navigate up the site hierarchy) and SEO (Google displays breadcrumb trails in search results).
|
||||||
|
|
||||||
|
## Enabling Breadcrumbs
|
||||||
|
|
||||||
|
1. Go to **SmartCrawl > Advanced Tools > Breadcrumbs**
|
||||||
|
2. Toggle the module ON
|
||||||
|
3. Configure separator and display options
|
||||||
|
4. Add the breadcrumb output to your theme
|
||||||
|
|
||||||
|
## Adding Breadcrumbs to Your Theme
|
||||||
|
|
||||||
|
### Method 1: Shortcode
|
||||||
|
|
||||||
|
```
|
||||||
|
[smartcrawl_breadcrumbs]
|
||||||
|
```
|
||||||
|
|
||||||
|
Place this in any post, page, widget, or theme template.
|
||||||
|
|
||||||
|
### Method 2: Shortcode with Custom Wrapper
|
||||||
|
|
||||||
|
```
|
||||||
|
[smartcrawl_breadcrumbs before="<nav aria-label='Breadcrumb'>" after="</nav>"]
|
||||||
|
```
|
||||||
|
|
||||||
|
The `before` and `after` parameters wrap the breadcrumb trail with custom HTML.
|
||||||
|
|
||||||
|
### Method 3: PHP (Theme Template)
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
if ( function_exists( 'smartcrawl_breadcrumbs' ) ) {
|
||||||
|
smartcrawl_breadcrumbs();
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
```
|
||||||
|
|
||||||
|
Place this in your theme's `header.php`, `single.php`, `page.php`, or a custom template part.
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
### Separator
|
||||||
|
|
||||||
|
Choose from presets or enter custom HTML:
|
||||||
|
|
||||||
|
| Preset | Output |
|
||||||
|
|--------|--------|
|
||||||
|
| `>` | Home > Category > Page |
|
||||||
|
| `/` | Home / Category / Page |
|
||||||
|
| `»` | Home » Category » Page |
|
||||||
|
| Custom | Any HTML character or element |
|
||||||
|
|
||||||
|
**Recommendation:** Use `>` or `»` — they visually indicate hierarchy.
|
||||||
|
|
||||||
|
### Display Options
|
||||||
|
|
||||||
|
| Option | Description |
|
||||||
|
|--------|-------------|
|
||||||
|
| Show on homepage | Whether breadcrumbs appear on the homepage (usually no — it would just show "Home") |
|
||||||
|
| Home link text | Default "Home" — can be customized (e.g., site name) |
|
||||||
|
| Post breadcrumb type | Show category hierarchy or just parent page |
|
||||||
|
|
||||||
|
## Schema Output
|
||||||
|
|
||||||
|
SmartCrawl automatically outputs `BreadcrumbList` schema markup alongside the visible breadcrumbs:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "BreadcrumbList",
|
||||||
|
"itemListElement": [
|
||||||
|
{
|
||||||
|
"@type": "ListItem",
|
||||||
|
"position": 1,
|
||||||
|
"name": "Home",
|
||||||
|
"item": "https://example.com/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "ListItem",
|
||||||
|
"position": 2,
|
||||||
|
"name": "Services",
|
||||||
|
"item": "https://example.com/services/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "ListItem",
|
||||||
|
"position": 3,
|
||||||
|
"name": "Basic Rider Course"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
This produces breadcrumb navigation in Google search results:
|
||||||
|
|
||||||
|
```
|
||||||
|
example.com > Services > Basic Rider Course
|
||||||
|
```
|
||||||
|
|
||||||
|
## Styling
|
||||||
|
|
||||||
|
SmartCrawl outputs breadcrumbs with CSS classes you can target:
|
||||||
|
|
||||||
|
```css
|
||||||
|
/* Breadcrumb container */
|
||||||
|
.smartcrawl-breadcrumbs {
|
||||||
|
font-size: 14px;
|
||||||
|
padding: 10px 0;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Individual breadcrumb links */
|
||||||
|
.smartcrawl-breadcrumbs a {
|
||||||
|
color: #0066cc;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.smartcrawl-breadcrumbs a:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Separator */
|
||||||
|
.smartcrawl-breadcrumbs .separator {
|
||||||
|
margin: 0 8px;
|
||||||
|
color: #999;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Current page (last item, no link) */
|
||||||
|
.smartcrawl-breadcrumbs .current {
|
||||||
|
color: #333;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## White Label Support
|
||||||
|
|
||||||
|
SmartCrawl Pro supports white labeling the breadcrumb module — you can remove WPMU DEV branding from the output.
|
||||||
|
|
||||||
|
## Best Practices
|
||||||
|
|
||||||
|
1. **Place breadcrumbs near the top of the page** — above the main content, below the header
|
||||||
|
2. **Don't show on homepage** — it adds no value (just "Home")
|
||||||
|
3. **Keep the trail short** — Home > Category > Page is ideal. Avoid deep nesting.
|
||||||
|
4. **Validate the schema** at [Google Rich Results Test](https://search.google.com/test/rich-results)
|
||||||
|
5. **Ensure the hierarchy makes sense** — breadcrumbs should reflect the actual site structure
|
||||||
@@ -0,0 +1,230 @@
|
|||||||
|
# SmartCrawl Configuration Guide
|
||||||
|
|
||||||
|
Module-by-module setup with recommended settings for production WordPress sites.
|
||||||
|
|
||||||
|
## Initial Setup
|
||||||
|
|
||||||
|
### 1. Install and Activate
|
||||||
|
|
||||||
|
Install SmartCrawl from the WordPress plugin repository or upload the WPMU DEV Pro version. On activation, the Setup Wizard launches.
|
||||||
|
|
||||||
|
### 2. Setup Wizard
|
||||||
|
|
||||||
|
The wizard enables all modules by default. Recommended approach:
|
||||||
|
|
||||||
|
- **Run the wizard** — accept all defaults
|
||||||
|
- **Then configure each module** per the sections below
|
||||||
|
- **If migrating from another SEO plugin** (Yoast, Rank Math, AIOSEO): use the Import tool in Settings to pull in existing titles, descriptions, and meta data before making changes
|
||||||
|
|
||||||
|
### 3. Conflict Check
|
||||||
|
|
||||||
|
SmartCrawl detects other SEO plugins. **Never run two SEO plugins simultaneously** — they will output duplicate meta tags. Deactivate the old plugin after importing its data.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Module: Titles & Meta
|
||||||
|
|
||||||
|
See [titles-and-meta.md](titles-and-meta.md) for the full macro reference.
|
||||||
|
|
||||||
|
### Recommended Global Settings
|
||||||
|
|
||||||
|
**Homepage:**
|
||||||
|
```
|
||||||
|
Title: %%sitename%% %%sep%% [Primary service/value proposition]
|
||||||
|
Description: Hand-write this — 150-160 characters, include primary keyword + CTA
|
||||||
|
```
|
||||||
|
|
||||||
|
**Posts:**
|
||||||
|
```
|
||||||
|
Title: %%title%% %%sep%% %%sitename%%
|
||||||
|
Description: %%excerpt%% (override per-post for important pages)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Pages:**
|
||||||
|
```
|
||||||
|
Title: %%title%% %%sep%% %%sitename%%
|
||||||
|
Description: Leave blank at template level — hand-write per page
|
||||||
|
```
|
||||||
|
|
||||||
|
**Categories/Tags:**
|
||||||
|
```
|
||||||
|
Title: %%term_title%% %%sep%% %%sitename%%
|
||||||
|
Description: %%term_description%%
|
||||||
|
```
|
||||||
|
|
||||||
|
**Separator:** Use `|` or `—` (clean, modern look in SERPs)
|
||||||
|
|
||||||
|
### Key Settings
|
||||||
|
|
||||||
|
- **Noindex tag archives** unless your tags have substantial unique content
|
||||||
|
- **Noindex author archives** on single-author sites (duplicate of your posts page)
|
||||||
|
- **Noindex paginated archives** (`/page/2/`, `/page/3/`) — thin content
|
||||||
|
- **Check custom post types** — WooCommerce products, portfolio items, etc. must be explicitly enabled
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Module: Social (Open Graph & Twitter)
|
||||||
|
|
||||||
|
### Global Settings
|
||||||
|
|
||||||
|
| Setting | Recommendation |
|
||||||
|
|---------|---------------|
|
||||||
|
| Default OG Image | Set a branded fallback image (1200x630px) |
|
||||||
|
| Facebook OG | Enable for all post types |
|
||||||
|
| Twitter Cards | Enable — use `summary_large_image` card type |
|
||||||
|
| Pinterest Verification | Add your Pinterest meta tag if applicable |
|
||||||
|
|
||||||
|
### Per-Post Type Settings
|
||||||
|
|
||||||
|
- **Posts/Pages:** Enable OG and Twitter, use post title and excerpt as defaults
|
||||||
|
- **Products (WooCommerce):** Enable the "WooCommerce Product Open Graph" toggle — auto-adds `og:type=product`, price, availability
|
||||||
|
- **Custom post types:** Enable and verify OG tags render correctly
|
||||||
|
|
||||||
|
### Per-Post Overrides
|
||||||
|
|
||||||
|
For important pages, always set custom OG title, description, and image:
|
||||||
|
- OG title can differ from the SEO title (e.g., more engaging/clickable for social)
|
||||||
|
- OG image should be exactly **1200x630px** for best rendering across platforms
|
||||||
|
- OG description can be longer than meta description (up to ~300 characters)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Module: Sitemap
|
||||||
|
|
||||||
|
### Recommended Settings
|
||||||
|
|
||||||
|
| Setting | Value |
|
||||||
|
|---------|-------|
|
||||||
|
| XML Sitemap | Enable |
|
||||||
|
| Include post types | Posts, Pages, Products, and any public custom post types |
|
||||||
|
| Include taxonomies | Categories (yes), Tags (only if indexable), custom taxonomies |
|
||||||
|
| Image Sitemap | Enable — helps with Google Images indexing |
|
||||||
|
| Google News Sitemap | Enable only if the site publishes news-style content |
|
||||||
|
| Notify search engines | Automatic mode |
|
||||||
|
|
||||||
|
### Exclusions
|
||||||
|
|
||||||
|
Exclude from sitemap:
|
||||||
|
- Thank you / confirmation pages
|
||||||
|
- Internal-use pages (login, dashboard, etc.)
|
||||||
|
- Any page set to `noindex` — **SmartCrawl does not do this automatically**
|
||||||
|
- Thin content pages with little SEO value
|
||||||
|
|
||||||
|
### Important Notes
|
||||||
|
|
||||||
|
- Sitemap is limited to **1,000 most recent posts** to prevent memory errors
|
||||||
|
- After making sitemap changes, use the **"New Crawl" button** to notify Google
|
||||||
|
- Verify your sitemap loads at `yoursite.com/sitemap.xml`
|
||||||
|
- Submit the sitemap URL in Google Search Console
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Module: Schema / Structured Data
|
||||||
|
|
||||||
|
See [schema-markup.md](schema-markup.md) for the full type reference.
|
||||||
|
|
||||||
|
### Recommended Setup
|
||||||
|
|
||||||
|
1. **Organization Schema** — Enable globally with:
|
||||||
|
- Business name, logo, contact info
|
||||||
|
- Social media profile URLs
|
||||||
|
- Same-as links to directory listings
|
||||||
|
|
||||||
|
2. **LocalBusiness Schema** — For local businesses, add with:
|
||||||
|
- Full NAP (name, address, phone)
|
||||||
|
- Opening hours
|
||||||
|
- Geo coordinates
|
||||||
|
- Area served
|
||||||
|
- Appropriate subtype (60+ available)
|
||||||
|
|
||||||
|
3. **Article/WebPage Schema** — Default for posts and pages respectively
|
||||||
|
|
||||||
|
4. **Per-page schema** — Add specific types where applicable:
|
||||||
|
- **FAQ** on pages with Q&A content
|
||||||
|
- **Event** on event listing pages
|
||||||
|
- **Course** on educational offerings
|
||||||
|
- **Product** on WooCommerce products (auto-handled)
|
||||||
|
|
||||||
|
5. **Validate schema** at [Google Rich Results Test](https://search.google.com/test/rich-results) after deploying
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Module: Redirects
|
||||||
|
|
||||||
|
See [redirects.md](redirects.md) for the full reference.
|
||||||
|
|
||||||
|
### Quick Setup
|
||||||
|
|
||||||
|
- Enable the Redirects module
|
||||||
|
- Set default redirect type to **301 (Permanent)**
|
||||||
|
- Enable **"Auto-redirect deleted posts"** (v3.9.0+) to catch deleted content
|
||||||
|
- Import any existing redirects from `.htaccess` or a previous plugin
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Module: Content Analysis
|
||||||
|
|
||||||
|
See [content-analysis.md](content-analysis.md) for scoring details.
|
||||||
|
|
||||||
|
### Recommended Approach
|
||||||
|
|
||||||
|
- **Always set a focus keyword** for every published page/post
|
||||||
|
- Use **up to 3 keywords** per page (1 primary + 2 secondary)
|
||||||
|
- Aim for **all green checks** on the SEO analysis tab
|
||||||
|
- Target a **Flesch-Kincaid readability score of 60-70** (8th-grade level)
|
||||||
|
- Don't chase a perfect score at the expense of natural writing
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Module: Breadcrumbs
|
||||||
|
|
||||||
|
See [breadcrumbs.md](breadcrumbs.md) for implementation details.
|
||||||
|
|
||||||
|
### Quick Setup
|
||||||
|
|
||||||
|
1. Enable Breadcrumbs in the Advanced Tools module
|
||||||
|
2. Add `[smartcrawl_breadcrumbs]` shortcode to your theme template or use the PHP function
|
||||||
|
3. Choose a separator (` > ` or ` / ` are most common)
|
||||||
|
4. Verify the breadcrumb trail renders correctly and the schema output validates
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Module: Robots.txt (Pro Only)
|
||||||
|
|
||||||
|
### Recommended Content
|
||||||
|
|
||||||
|
```
|
||||||
|
User-agent: *
|
||||||
|
Allow: /
|
||||||
|
Disallow: /wp-admin/
|
||||||
|
Allow: /wp-admin/admin-ajax.php
|
||||||
|
|
||||||
|
Sitemap: https://yoursite.com/sitemap.xml
|
||||||
|
```
|
||||||
|
|
||||||
|
**Important:** Use full absolute URLs for sitemap directives.
|
||||||
|
|
||||||
|
**Do not block CSS/JS files** — Google needs them to render pages for mobile-first indexing.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Settings: Import/Export
|
||||||
|
|
||||||
|
- **Export** your SmartCrawl configuration as JSON after setting up a site
|
||||||
|
- **Import** that configuration when setting up similar sites to save time
|
||||||
|
- Settings are transferable between sites but **titles/descriptions are templates, not content** — they'll adapt to each site's content via macros
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Post-Setup Checklist
|
||||||
|
|
||||||
|
After configuring SmartCrawl:
|
||||||
|
|
||||||
|
- [ ] Run the **SEO Health Checkup** and address all red/yellow items
|
||||||
|
- [ ] Verify `sitemap.xml` loads and is submitted in Google Search Console
|
||||||
|
- [ ] Check 5-10 key pages for correct title tags and meta descriptions (view source)
|
||||||
|
- [ ] Verify Open Graph tags render correctly (use [Facebook Sharing Debugger](https://developers.facebook.com/tools/debug/))
|
||||||
|
- [ ] Validate schema markup with [Google Rich Results Test](https://search.google.com/test/rich-results)
|
||||||
|
- [ ] Check robots.txt at `yoursite.com/robots.txt`
|
||||||
|
- [ ] Confirm no duplicate SEO plugins are active
|
||||||
|
- [ ] Set focus keywords on all priority pages
|
||||||
@@ -0,0 +1,169 @@
|
|||||||
|
# Content Analysis
|
||||||
|
|
||||||
|
SmartCrawl provides real-time SEO and readability analysis in both the Classic Editor and Block Editor. This module is the primary tool for optimizing individual posts and pages.
|
||||||
|
|
||||||
|
## Focus Keywords
|
||||||
|
|
||||||
|
### How They Work
|
||||||
|
|
||||||
|
- Set **up to 3 focus keywords** per post/page (1 primary + 2 secondary)
|
||||||
|
- Enter as comma-separated values in the SmartCrawl meta box
|
||||||
|
- SmartCrawl checks the page content against each keyword
|
||||||
|
- The primary keyword gets the most checks; secondary keywords supplement
|
||||||
|
|
||||||
|
### Best Practices for Focus Keywords
|
||||||
|
|
||||||
|
| Rule | Details |
|
||||||
|
|------|---------|
|
||||||
|
| One primary keyword per page | The single most important search term this page should rank for |
|
||||||
|
| 1-2 secondary keywords | Closely related terms or long-tail variations |
|
||||||
|
| Match search intent | The keyword should match what the page actually delivers |
|
||||||
|
| Check for cannibalization | SmartCrawl shows the 10 most recent posts using the same keyphrase — avoid duplicates |
|
||||||
|
| Use natural language | "motorcycle safety course Anchorage" not "motorcycle+safety+course+anchorage" |
|
||||||
|
|
||||||
|
### Keyword Selection Per Page Type
|
||||||
|
|
||||||
|
| Page Type | Primary Keyword Pattern | Example |
|
||||||
|
|-----------|------------------------|---------|
|
||||||
|
| Homepage | Core service + location | "motorcycle safety courses Alaska" |
|
||||||
|
| Service page | Specific service + location | "basic rider course Anchorage" |
|
||||||
|
| Blog post | Informational long-tail | "what to wear to a motorcycle safety course" |
|
||||||
|
| Portfolio | Role + qualifier | "instructional design portfolio" |
|
||||||
|
| Contact | Brand + contact | "contact Alaska Safe Riders" |
|
||||||
|
| Landing page | Transactional long-tail | "register motorcycle course Anchorage May 2026" |
|
||||||
|
|
||||||
|
## SEO Analysis Checks
|
||||||
|
|
||||||
|
SmartCrawl runs these checks against your focus keyword(s):
|
||||||
|
|
||||||
|
### Title Tag
|
||||||
|
|
||||||
|
| Check | Pass Criteria |
|
||||||
|
|-------|---------------|
|
||||||
|
| Keyphrase in title | Primary keyphrase appears in the title tag |
|
||||||
|
| Title length | Between 50-60 characters |
|
||||||
|
| Title uniqueness | Not used by other posts |
|
||||||
|
|
||||||
|
### URL / Slug
|
||||||
|
|
||||||
|
| Check | Pass Criteria |
|
||||||
|
|-------|---------------|
|
||||||
|
| Keyphrase in URL | Primary keyphrase appears in the URL slug |
|
||||||
|
| URL structure | Uses hyphens (not underscores), reasonable length |
|
||||||
|
|
||||||
|
### Meta Description
|
||||||
|
|
||||||
|
| Check | Pass Criteria |
|
||||||
|
|-------|---------------|
|
||||||
|
| Keyphrase in description | Primary keyphrase appears in the meta description |
|
||||||
|
| Description length | 120-160 characters |
|
||||||
|
| Hand-crafted | Not auto-generated from content excerpt |
|
||||||
|
|
||||||
|
### Content
|
||||||
|
|
||||||
|
| Check | Pass Criteria |
|
||||||
|
|-------|---------------|
|
||||||
|
| Keyphrase in H1 | Primary keyphrase in the main heading |
|
||||||
|
| Keyphrase in subheadings | At least one H2/H3 contains the keyphrase |
|
||||||
|
| Keyphrase density | Appears a reasonable number of times (not too few, not stuffed) |
|
||||||
|
| Keyphrase in first paragraph | Appears within the first 100-200 words |
|
||||||
|
| Keyphrase in image alt text | At least one image has the keyphrase in its alt attribute |
|
||||||
|
| Content length | Sufficient content for the topic (no specific minimum enforced) |
|
||||||
|
|
||||||
|
### Links
|
||||||
|
|
||||||
|
| Check | Pass Criteria |
|
||||||
|
|-------|---------------|
|
||||||
|
| External links | At least one dofollow external link to a relevant, authoritative source |
|
||||||
|
| Internal links | Links to other pages on the site |
|
||||||
|
|
||||||
|
### Images
|
||||||
|
|
||||||
|
| Check | Pass Criteria |
|
||||||
|
|-------|---------------|
|
||||||
|
| Image optimization | Images have alt text, reasonable file names |
|
||||||
|
| Keyphrase in alt | At least one image alt includes the focus keyphrase |
|
||||||
|
|
||||||
|
## SEO Analysis Color Coding
|
||||||
|
|
||||||
|
| Color | Meaning |
|
||||||
|
|-------|---------|
|
||||||
|
| Green | Check passed — well optimized |
|
||||||
|
| Yellow/Gray | Needs improvement — suggestion provided |
|
||||||
|
| Red | Critical issue — should be fixed |
|
||||||
|
|
||||||
|
### Interpreting Results
|
||||||
|
|
||||||
|
- **Aim for all green** on important pages
|
||||||
|
- **Yellow is acceptable** when the suggestion would make content unnatural
|
||||||
|
- **Red should always be addressed** unless you have a specific reason to deviate
|
||||||
|
- **Don't sacrifice readability for a green check** — natural writing always wins
|
||||||
|
|
||||||
|
## Readability Analysis
|
||||||
|
|
||||||
|
SmartCrawl uses the **Flesch-Kincaid readability test** along with structural checks.
|
||||||
|
|
||||||
|
### Flesch-Kincaid Score
|
||||||
|
|
||||||
|
| Score | Reading Level | Assessment |
|
||||||
|
|-------|---------------|-----------|
|
||||||
|
| 90-100 | 5th grade | Very easy to read |
|
||||||
|
| 80-89 | 6th grade | Easy to read |
|
||||||
|
| 70-79 | 7th grade | Fairly easy |
|
||||||
|
| **60-69** | **8th-9th grade** | **Target range** |
|
||||||
|
| 50-59 | 10th-12th grade | Fairly difficult |
|
||||||
|
| 30-49 | College level | Difficult |
|
||||||
|
| 0-29 | Graduate level | Very difficult |
|
||||||
|
|
||||||
|
**Target: 60-70** (8th-grade level). This is readable by the widest audience while still sounding professional.
|
||||||
|
|
||||||
|
### Readability Checks
|
||||||
|
|
||||||
|
| Check | Standard |
|
||||||
|
|-------|----------|
|
||||||
|
| Sentence length | Average under 20 words. 14+ words = hard. 25+ words = very hard. |
|
||||||
|
| Passive voice | Minimize passive constructions (aim for <10% of sentences) |
|
||||||
|
| Paragraph length | 2-4 sentences per paragraph |
|
||||||
|
| Subheading distribution | Use subheadings every 200-300 words |
|
||||||
|
| Transition words | Use transition words to connect ideas |
|
||||||
|
|
||||||
|
### Readability Tips
|
||||||
|
|
||||||
|
- **Break up long sentences** — if a sentence has a comma and "and", it can usually be split
|
||||||
|
- **Use active voice** — "We teach motorcycle safety" not "Motorcycle safety is taught by us"
|
||||||
|
- **Short paragraphs** — walls of text hurt both readability scores and user engagement
|
||||||
|
- **Use lists and tables** where appropriate — they are easier to scan than prose
|
||||||
|
- **Write at 8th-grade level** — this is not "dumbing down," it is clear communication
|
||||||
|
|
||||||
|
> **Note:** SmartCrawl's readability analysis is reportedly "more difficult to please" than other plugins. A yellow readability score is acceptable if the content reads naturally.
|
||||||
|
|
||||||
|
## Content Analysis in the Editor
|
||||||
|
|
||||||
|
### Where to Find It
|
||||||
|
|
||||||
|
- **Classic Editor:** SmartCrawl meta box below the editor
|
||||||
|
- **Block Editor:** SmartCrawl panel in the right sidebar
|
||||||
|
|
||||||
|
### Real-Time Updates
|
||||||
|
|
||||||
|
Analysis updates as you type (with a short delay). No need to save/publish to see results.
|
||||||
|
|
||||||
|
### Keyword Cannibalization Check
|
||||||
|
|
||||||
|
When you enter a focus keyword, SmartCrawl checks your other posts and shows the **10 most recent posts using the same keyphrase**. If duplicates are found:
|
||||||
|
|
||||||
|
- Consider whether both pages are needed
|
||||||
|
- Differentiate their focus (e.g., one informational, one transactional)
|
||||||
|
- If truly duplicated, merge content into one page and redirect the other
|
||||||
|
|
||||||
|
## Workflow Recommendation
|
||||||
|
|
||||||
|
For every page you publish or optimize:
|
||||||
|
|
||||||
|
1. **Set the focus keyword(s)** before writing or after outlining
|
||||||
|
2. **Write naturally first** — don't write "for the SEO checker"
|
||||||
|
3. **Run the analysis** after drafting
|
||||||
|
4. **Address red items** — these are genuine issues
|
||||||
|
5. **Review yellow items** — fix what makes sense, skip what would make content unnatural
|
||||||
|
6. **Check readability** — simplify where possible without losing substance
|
||||||
|
7. **Preview the Google snippet** — verify title and description look good in the preview
|
||||||
@@ -0,0 +1,156 @@
|
|||||||
|
# Hooks and Filters (Developer API)
|
||||||
|
|
||||||
|
SmartCrawl exposes **99 documented hooks** for developers, using the `wds_` prefix. These allow programmatic control over SmartCrawl's output without modifying the plugin directly.
|
||||||
|
|
||||||
|
The complete hooks documentation is maintained in the [WPMU DEV hooks-documentation repository](https://github.com/wpmudev/hooks-documentation) in the `smartcrawl-seo-hooks-doc.html` file.
|
||||||
|
|
||||||
|
## Key Filters
|
||||||
|
|
||||||
|
### Title and Meta
|
||||||
|
|
||||||
|
```php
|
||||||
|
// Filter the SEO title output
|
||||||
|
add_filter( 'wds_title', function( $title ) {
|
||||||
|
// Modify the title tag output
|
||||||
|
return $title;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Filter the meta description output
|
||||||
|
add_filter( 'wds_metadesc', function( $description ) {
|
||||||
|
// Modify the meta description
|
||||||
|
return $description;
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Open Graph
|
||||||
|
|
||||||
|
```php
|
||||||
|
// Customize Open Graph title
|
||||||
|
add_filter( 'wds_custom_og_title', function( $title ) {
|
||||||
|
return $title;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Customize Open Graph description
|
||||||
|
add_filter( 'wds_custom_og_description', function( $description ) {
|
||||||
|
return $description;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Customize Open Graph image(s)
|
||||||
|
add_filter( 'wds_custom_og_image', function( $images ) {
|
||||||
|
// $images is an array of image URLs
|
||||||
|
return $images;
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Defaults and Options
|
||||||
|
|
||||||
|
```php
|
||||||
|
// Filter SmartCrawl default options
|
||||||
|
add_filter( 'wds_defaults', function( $defaults ) {
|
||||||
|
// Modify default option values
|
||||||
|
return $defaults;
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Admin UI
|
||||||
|
|
||||||
|
```php
|
||||||
|
// Control admin bar visibility
|
||||||
|
add_filter( 'wds-admin-ui-show_bar', function( $show ) {
|
||||||
|
// Return false to hide the SmartCrawl admin bar item
|
||||||
|
return $show;
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Sitemap
|
||||||
|
|
||||||
|
```php
|
||||||
|
// Exclude specific taxonomy terms from sitemaps
|
||||||
|
add_filter( 'wds_terms_sitemap_include_term_ids', function( $term_ids, $taxonomy ) {
|
||||||
|
// Remove specific term IDs
|
||||||
|
$exclude = array( 15, 23, 42 );
|
||||||
|
return array_diff( $term_ids, $exclude );
|
||||||
|
}, 10, 2 );
|
||||||
|
|
||||||
|
// Add extra images to sitemap entries
|
||||||
|
add_filter( 'wds_sitemap_extra_images', function( $images, $post_id ) {
|
||||||
|
// Add additional image URLs for a post
|
||||||
|
return $images;
|
||||||
|
}, 10, 2 );
|
||||||
|
```
|
||||||
|
|
||||||
|
## Key Actions
|
||||||
|
|
||||||
|
```php
|
||||||
|
// Fires after SmartCrawl saves post meta data
|
||||||
|
// Useful for syncing SEO data with external systems
|
||||||
|
add_action( 'wds_saved_postdata', function( $post_id ) {
|
||||||
|
// Handle post meta save cleanup
|
||||||
|
// SmartCrawl uses this internally to handle unchecked checkbox cleanup
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
## Common Use Cases
|
||||||
|
|
||||||
|
### Force a Specific Title on a Page
|
||||||
|
|
||||||
|
```php
|
||||||
|
add_filter( 'wds_title', function( $title ) {
|
||||||
|
if ( is_page( 'special-landing-page' ) ) {
|
||||||
|
return 'Custom Landing Page Title | Brand Name';
|
||||||
|
}
|
||||||
|
return $title;
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Add Custom OG Image for a Post Type
|
||||||
|
|
||||||
|
```php
|
||||||
|
add_filter( 'wds_custom_og_image', function( $images ) {
|
||||||
|
if ( is_singular( 'product' ) ) {
|
||||||
|
$custom_image = get_field( 'social_share_image' ); // ACF field
|
||||||
|
if ( $custom_image ) {
|
||||||
|
return array( $custom_image );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $images;
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Hide SmartCrawl Admin Bar for Non-Admins
|
||||||
|
|
||||||
|
```php
|
||||||
|
add_filter( 'wds-admin-ui-show_bar', function( $show ) {
|
||||||
|
if ( ! current_user_can( 'manage_options' ) ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return $show;
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Exclude a Specific Category from Sitemap
|
||||||
|
|
||||||
|
```php
|
||||||
|
add_filter( 'wds_terms_sitemap_include_term_ids', function( $term_ids, $taxonomy ) {
|
||||||
|
if ( $taxonomy === 'category' ) {
|
||||||
|
$exclude = array( get_cat_ID( 'Uncategorized' ) );
|
||||||
|
return array_diff( $term_ids, $exclude );
|
||||||
|
}
|
||||||
|
return $term_ids;
|
||||||
|
}, 10, 2 );
|
||||||
|
```
|
||||||
|
|
||||||
|
## Hook Naming Convention
|
||||||
|
|
||||||
|
All SmartCrawl hooks follow these patterns:
|
||||||
|
|
||||||
|
- **Filters:** `wds_{feature}` — e.g., `wds_title`, `wds_metadesc`
|
||||||
|
- **Actions:** `wds_{event}` — e.g., `wds_saved_postdata`
|
||||||
|
- **UI filters:** `wds-{area}-{feature}` — e.g., `wds-admin-ui-show_bar`
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
- The `wds_` prefix stands for "WPMU DEV SmartCrawl" (originally "WPMU DEV SEO")
|
||||||
|
- 96 of the 99 hooks were undocumented as of the last GitHub update — the three listed above are the most commonly used
|
||||||
|
- For the full list, inspect the plugin source code or check the hooks documentation repository
|
||||||
|
- Hook availability may vary between SmartCrawl Free and Pro versions
|
||||||
@@ -0,0 +1,126 @@
|
|||||||
|
# Known Issues and Gotchas
|
||||||
|
|
||||||
|
Confirmed issues, limitations, and workarounds for SmartCrawl v3.15.0.
|
||||||
|
|
||||||
|
## Fixed in v3.15.0 (Verify You're Updated)
|
||||||
|
|
||||||
|
These were bugs in prior versions — confirm you're on 3.15.0+:
|
||||||
|
|
||||||
|
| Issue | Description |
|
||||||
|
|-------|-------------|
|
||||||
|
| Editor freezing | Editor got stuck when typing for >2 minutes with SmartCrawl enabled |
|
||||||
|
| Focus keywords with numbers | SmartCrawl failed to detect focus keywords containing numbers |
|
||||||
|
| Large content pages | SEO checks failed on very large content pages |
|
||||||
|
| Social accounts erased | Social accounts wiped from Schema General Settings on save |
|
||||||
|
| Taxonomy archives | Categories/tags not saving under Taxonomy Archives settings |
|
||||||
|
| Blog/Posts archive | Global Titles & Meta didn't apply to blog archive when static front page was set |
|
||||||
|
|
||||||
|
## Current Known Issues
|
||||||
|
|
||||||
|
### Redirect Ordering
|
||||||
|
|
||||||
|
**Issue:** Redirects cannot be reordered once added.
|
||||||
|
|
||||||
|
**Workaround:** Delete the redirect and recreate it. For complex redirect lists, consider exporting as JSON, editing the order, and re-importing.
|
||||||
|
|
||||||
|
### Regex Redirects Inconsistency
|
||||||
|
|
||||||
|
**Issue:** Some users report regex patterns not working in SmartCrawl despite being valid on regex101.com.
|
||||||
|
|
||||||
|
**Workaround:** Use simpler patterns. Test thoroughly after creating. For complex regex redirects, consider handling them at the server level (`.htaccess` or Nginx config).
|
||||||
|
|
||||||
|
### Sitemap 1,000 Post Limit
|
||||||
|
|
||||||
|
**Issue:** Sitemaps are limited to 1,000 most recent posts per post type to prevent memory errors.
|
||||||
|
|
||||||
|
**Impact:** Older posts on large sites may not appear in the sitemap.
|
||||||
|
|
||||||
|
**Workaround:** For sites with 1,000+ posts, consider supplementing with a manual sitemap or contacting WPMU DEV support.
|
||||||
|
|
||||||
|
### Noindex + Sitemap Disconnect
|
||||||
|
|
||||||
|
**Issue:** Setting a page to `noindex` does NOT automatically exclude it from the sitemap.
|
||||||
|
|
||||||
|
**Workaround:** Manually exclude noindexed pages from the sitemap by post ID. **Always do both when noindexing a page.**
|
||||||
|
|
||||||
|
### No IndexNow Support
|
||||||
|
|
||||||
|
**Issue:** SmartCrawl does not support the IndexNow protocol (unlike Yoast and Rank Math).
|
||||||
|
|
||||||
|
**Impact:** Bing and Yandex won't get instant notification of content changes. Google does not support IndexNow anyway (they use their own crawl notification).
|
||||||
|
|
||||||
|
**Workaround:** Not critical — SmartCrawl's "Instant Indexing" feature notifies Google directly.
|
||||||
|
|
||||||
|
### Auto-Linking + WooCommerce Conflict (Pro)
|
||||||
|
|
||||||
|
**Issue:** Auto-linking can cause issues with WooCommerce cart and account page caching.
|
||||||
|
|
||||||
|
**Workaround:** Exclude WooCommerce cart, checkout, and account pages from auto-linking in the settings.
|
||||||
|
|
||||||
|
### WPML Duplicate Sitemap URLs
|
||||||
|
|
||||||
|
**Issue:** When using WPML (multilingual plugin), duplicate homepage URLs appear in the sitemap.
|
||||||
|
|
||||||
|
**Workaround:** Manually exclude duplicate URLs from the sitemap.
|
||||||
|
|
||||||
|
### OpenGraph Persistence After Disabling
|
||||||
|
|
||||||
|
**Issue:** OG tags can remain active on the homepage even after deactivating Open Graph in the setup wizard.
|
||||||
|
|
||||||
|
**Workaround:** Manually disable OG for the homepage in SmartCrawl > Social settings, or clear any cached pages.
|
||||||
|
|
||||||
|
### Auto-Linking Tab in Free Version
|
||||||
|
|
||||||
|
**Issue:** The auto-linking tab appears in the free version UI but the feature does not function without Pro.
|
||||||
|
|
||||||
|
**Impact:** Cosmetic only — confusing but not harmful.
|
||||||
|
|
||||||
|
### Plugin Update Data Loss (Rare)
|
||||||
|
|
||||||
|
**Issue:** At least one user reported keywords, descriptions, and titles being wiped on plugin update.
|
||||||
|
|
||||||
|
**Workaround:** Always export SmartCrawl settings (JSON backup) before updating the plugin. This is a rare issue but catastrophic when it happens.
|
||||||
|
|
||||||
|
## Plugin Conflicts
|
||||||
|
|
||||||
|
### Google Web Stories
|
||||||
|
|
||||||
|
**Issue:** SmartCrawl conflicts with the Google Web Stories editor.
|
||||||
|
|
||||||
|
**Workaround:** Exclude Web Stories post type from SmartCrawl processing, or use a different SEO plugin for Web Stories.
|
||||||
|
|
||||||
|
### Other SEO Plugins
|
||||||
|
|
||||||
|
**Issue:** Running multiple SEO plugins simultaneously causes duplicate meta tags, conflicting sitemaps, and schema errors.
|
||||||
|
|
||||||
|
**Fix:** Only run one SEO plugin at a time. Use SmartCrawl's import tool when migrating from another plugin.
|
||||||
|
|
||||||
|
### Caching Plugins
|
||||||
|
|
||||||
|
**Issue:** Page caching can serve stale meta tags after SmartCrawl changes.
|
||||||
|
|
||||||
|
**Fix:** Clear the cache after making SEO changes. On your server with EA-Nginx:
|
||||||
|
```bash
|
||||||
|
rm -rf /var/cache/ea-nginx/proxy/<account>/*
|
||||||
|
```
|
||||||
|
|
||||||
|
### WP Hummingbird
|
||||||
|
|
||||||
|
SmartCrawl and Hummingbird (both WPMU DEV) generally work well together. No known conflicts.
|
||||||
|
|
||||||
|
## Best Practices to Avoid Issues
|
||||||
|
|
||||||
|
1. **Export settings before every plugin update** — JSON backup takes 10 seconds
|
||||||
|
2. **Keep SmartCrawl updated** — many issues are fixed in recent versions
|
||||||
|
3. **Never run two SEO plugins** — deactivate the old one after importing
|
||||||
|
4. **Manually sync noindex and sitemap exclusions** — SmartCrawl doesn't auto-sync these
|
||||||
|
5. **Test redirects after creating** — especially regex patterns
|
||||||
|
6. **Clear cache after SEO changes** — especially on sites with server-level caching
|
||||||
|
7. **Be patient with Google** — title/description changes can take up to a week to reflect in SERPs
|
||||||
|
8. **Use the SEO Health Checkup** periodically — catches configuration drift
|
||||||
|
|
||||||
|
## Where to Get Help
|
||||||
|
|
||||||
|
- [WPMU DEV Documentation](https://wpmudev.com/docs/wpmu-dev-plugins/smartcrawl/)
|
||||||
|
- [WPMU DEV Support](https://wpmudev.com/hub/support/) (Pro members)
|
||||||
|
- [WordPress.org Support Forum](https://wordpress.org/support/plugin/smartcrawl-seo/) (Free version)
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
# SmartCrawl Overview
|
||||||
|
|
||||||
|
SmartCrawl is a WordPress SEO plugin by WPMU DEV. Current version: **3.15.0** (January 26, 2026). Available as a free plugin on WordPress.org and a Pro version through WPMU DEV membership. Supports WordPress Multisite and has been translated into 16 locales.
|
||||||
|
|
||||||
|
## Full Feature Inventory
|
||||||
|
|
||||||
|
### Core Modules
|
||||||
|
|
||||||
|
| Module | Description |
|
||||||
|
|--------|-------------|
|
||||||
|
| **Dashboard** | One-click Setup Wizard, SEO Health score, import/export settings (JSON) |
|
||||||
|
| **SEO Health / Checkup** | Full site SEO scan with color-coded grading and recommendations |
|
||||||
|
| **Titles & Meta** | Global templates with macros + per-post overrides, Google preview snippet |
|
||||||
|
| **Social** | Open Graph (Facebook, Instagram, LinkedIn, Pinterest) + Twitter/X Cards |
|
||||||
|
| **Sitemap Generator** | XML, Google News, and Image sitemaps with configurable inclusions/exclusions |
|
||||||
|
| **Schema / Structured Data** | 20+ pre-built types + custom schema builder |
|
||||||
|
| **Content Analysis** | In-editor SEO analysis + readability scoring, up to 3 focus keywords |
|
||||||
|
|
||||||
|
### Advanced Tools (Sub-modules)
|
||||||
|
|
||||||
|
| Sub-module | Description |
|
||||||
|
|------------|-------------|
|
||||||
|
| **Redirects** | 301/302/307 redirects, regex support, bulk import/export |
|
||||||
|
| **Automatic Linking** | Auto-convert keywords to links (Pro only) |
|
||||||
|
| **Breadcrumbs** | Shortcode-based breadcrumb navigation with schema markup |
|
||||||
|
| **Moz Integration** | Domain authority and link metrics in the WP dashboard |
|
||||||
|
| **Robots.txt Editor** | Edit robots.txt from the admin (Pro only) |
|
||||||
|
| **Meta Robots** | Per-post index/noindex, follow/nofollow controls |
|
||||||
|
|
||||||
|
### Additional Features
|
||||||
|
|
||||||
|
| Feature | Description |
|
||||||
|
|---------|-------------|
|
||||||
|
| **WooCommerce SEO** | Product schema, OG tags, category SEO settings |
|
||||||
|
| **Instant Indexing** | Notifies Google when content is added/updated (not IndexNow) |
|
||||||
|
| **Import/Export** | JSON-based settings transfer between sites |
|
||||||
|
| **Role-based Access** | Control which user roles can access SEO settings |
|
||||||
|
|
||||||
|
## Free vs Pro
|
||||||
|
|
||||||
|
### Free Version Includes
|
||||||
|
|
||||||
|
- One-click setup wizard
|
||||||
|
- Titles & Meta descriptions (global templates + per-post overrides)
|
||||||
|
- XML Sitemap generator (with exclusions)
|
||||||
|
- Google News Sitemap
|
||||||
|
- Image Sitemap
|
||||||
|
- Open Graph & Twitter Cards
|
||||||
|
- SEO content analysis & readability checks (up to 3 focus keywords)
|
||||||
|
- Schema markup (all pre-built types + custom schema builder)
|
||||||
|
- 301/302/307 Redirects (basic)
|
||||||
|
- Breadcrumbs with schema
|
||||||
|
- Moz integration
|
||||||
|
- Meta robots (index/noindex, follow/nofollow)
|
||||||
|
- Multisite support
|
||||||
|
- Import/Export settings
|
||||||
|
- WooCommerce SEO
|
||||||
|
|
||||||
|
### Pro Adds
|
||||||
|
|
||||||
|
| Feature | Details |
|
||||||
|
|---------|---------|
|
||||||
|
| Scheduled SEO Audits | Automated URL crawls with email reports |
|
||||||
|
| Automatic Linking | Keyword-to-link automation across all content |
|
||||||
|
| Location-based Redirects | Geolocation rules for redirect targeting |
|
||||||
|
| Site Crawler | Broken URL detection, 404 monitoring, redirect chain detection |
|
||||||
|
| Robots.txt Editor | Edit robots.txt from the admin panel |
|
||||||
|
| White Label | Custom branding (remove WPMU DEV references) |
|
||||||
|
| MaxMind DB | Geolocation integration for location-based features |
|
||||||
|
| Priority Support | 24/7 live chat with WPMU DEV team |
|
||||||
|
|
||||||
|
### Pricing
|
||||||
|
|
||||||
|
Pro requires WPMU DEV membership (~$7.50/month), which includes all WPMU DEV premium plugins (Hummingbird, Smush, Defender, Forminator, etc.).
|
||||||
|
|
||||||
|
## Comparison: SmartCrawl vs Yoast vs Rank Math
|
||||||
|
|
||||||
|
| Feature | SmartCrawl Free | Yoast Free | Rank Math Free |
|
||||||
|
|---------|----------------|------------|----------------|
|
||||||
|
| Focus keywords per post | 3 | 1 | 5 |
|
||||||
|
| Schema types | Many + custom builder | Basic | 18+ pre-defined |
|
||||||
|
| Redirects | Yes (301/302/307) | No (Pro only) | Yes + 404 monitor |
|
||||||
|
| Breadcrumbs | Yes | Yes | Yes |
|
||||||
|
| XML Sitemap | Yes | Yes | Yes |
|
||||||
|
| News Sitemap | Yes | No (Pro) | Pro only |
|
||||||
|
| Image Sitemap | Yes | Included in main | Included in main |
|
||||||
|
| Open Graph / Twitter | Yes | Yes | Yes |
|
||||||
|
| Readability analysis | Yes (Flesch-Kincaid) | Yes (more detailed) | Yes |
|
||||||
|
| Google Search Console | No | No (limited) | Yes (built-in) |
|
||||||
|
| Google Analytics | No | No | Yes (GA4) |
|
||||||
|
| IndexNow | No | Yes | Yes |
|
||||||
|
| Auto-linking | Pro only | No | Pro only |
|
||||||
|
| WooCommerce SEO | Yes | Yes (Pro) | Yes |
|
||||||
|
| White label | Pro only | No | Pro only |
|
||||||
|
| Moz integration | Yes | No | No |
|
||||||
|
|
||||||
|
### Positioning Summary
|
||||||
|
|
||||||
|
- **SmartCrawl** — Simplest UI, least overwhelming. Best for WPMU DEV ecosystem users. Generous free tier for schema. Weakest on analytics integration and IndexNow.
|
||||||
|
- **Yoast** — Most beginner-friendly (traffic-light system). Most detailed readability. Locks more behind Pro.
|
||||||
|
- **Rank Math** — Most feature-rich free tier. Best analytics integration. Most focus keywords. Rapidly adding AI-era features.
|
||||||
@@ -0,0 +1,126 @@
|
|||||||
|
# Redirects
|
||||||
|
|
||||||
|
SmartCrawl's Redirects module manages URL redirection from within WordPress, without editing `.htaccess` or server config. Found under Advanced Tools > Redirects.
|
||||||
|
|
||||||
|
## Redirect Types
|
||||||
|
|
||||||
|
| Code | Type | When to Use |
|
||||||
|
|------|------|-------------|
|
||||||
|
| **301** | Permanent | Page permanently moved. Passes ~90-99% of link equity. Default choice. |
|
||||||
|
| **302** | Temporary | Page temporarily moved. Does not pass link equity permanently. Use for A/B tests, maintenance. |
|
||||||
|
| **307** | Temporary (method preserved) | Like 302 but preserves the HTTP method and body. Rare use case. |
|
||||||
|
|
||||||
|
**Default recommendation:** Always use **301** unless you have a specific reason for temporary.
|
||||||
|
|
||||||
|
## Creating Redirects
|
||||||
|
|
||||||
|
### Basic (Plain Text)
|
||||||
|
|
||||||
|
1. Go to SmartCrawl > Advanced Tools > Redirects
|
||||||
|
2. Click "Add Redirect"
|
||||||
|
3. Enter the **source URL** (old URL path, e.g., `/old-page/`)
|
||||||
|
4. Enter the **destination URL** (new URL, e.g., `/new-page/` or full URL)
|
||||||
|
5. Select redirect type (301/302/307)
|
||||||
|
6. Save
|
||||||
|
|
||||||
|
### Regex Pattern
|
||||||
|
|
||||||
|
Switch to "Regex" mode for pattern-based redirects:
|
||||||
|
|
||||||
|
```
|
||||||
|
Source: /blog/(\d{4})/(\d{2})/(.*)
|
||||||
|
Destination: /blog/$3
|
||||||
|
Type: 301
|
||||||
|
```
|
||||||
|
|
||||||
|
This redirects dated blog URLs to non-dated versions.
|
||||||
|
|
||||||
|
**Regex tips:**
|
||||||
|
- Test patterns on [regex101.com](https://regex101.com) before applying
|
||||||
|
- Use capture groups `()` and backreferences `$1`, `$2`, etc.
|
||||||
|
- Some users report regex patterns not working despite being valid — test thoroughly
|
||||||
|
|
||||||
|
### Wildcard Redirects
|
||||||
|
|
||||||
|
Use regex mode for wildcards:
|
||||||
|
|
||||||
|
```
|
||||||
|
Source: /old-section/(.*)
|
||||||
|
Destination: /new-section/$1
|
||||||
|
Type: 301
|
||||||
|
```
|
||||||
|
|
||||||
|
This redirects all URLs under `/old-section/` to `/new-section/` while preserving the path.
|
||||||
|
|
||||||
|
## Auto-Redirect Deleted Posts (v3.9.0+)
|
||||||
|
|
||||||
|
Enable this to automatically create a 301 redirect when a post or page is deleted. The redirect points to:
|
||||||
|
- The parent page (if it was a child page)
|
||||||
|
- The homepage (if no logical parent)
|
||||||
|
|
||||||
|
**Recommendation:** Enable this to prevent 404s when content is removed.
|
||||||
|
|
||||||
|
## Bulk Import/Export
|
||||||
|
|
||||||
|
### Export
|
||||||
|
- SmartCrawl exports redirects as JSON
|
||||||
|
- Useful for backing up redirects before changes
|
||||||
|
|
||||||
|
### Import
|
||||||
|
- Import redirects from JSON file
|
||||||
|
- Useful when migrating between sites or restoring from backup
|
||||||
|
|
||||||
|
### Bulk Edit
|
||||||
|
- Change redirect types in bulk (e.g., convert all 302s to 301s)
|
||||||
|
- Delete all redirects at once (use with caution)
|
||||||
|
|
||||||
|
## Pro Features
|
||||||
|
|
||||||
|
### Location-Based Redirects
|
||||||
|
|
||||||
|
With SmartCrawl Pro + MaxMind GeoIP database:
|
||||||
|
- Redirect visitors based on their country or region
|
||||||
|
- Example: Redirect Canadian visitors to a `.ca` domain
|
||||||
|
- Requires MaxMind DB configuration in settings
|
||||||
|
|
||||||
|
## When to Use Redirects
|
||||||
|
|
||||||
|
| Scenario | Action |
|
||||||
|
|----------|--------|
|
||||||
|
| Page URL changed | 301 from old URL to new URL |
|
||||||
|
| Page deleted, replacement exists | 301 to the replacement page |
|
||||||
|
| Page deleted, no replacement | 301 to the most relevant parent or category page |
|
||||||
|
| Site migration (domain change) | 301 all old URLs to new domain equivalents |
|
||||||
|
| HTTP to HTTPS migration | 301 all HTTP URLs to HTTPS (better handled at server level) |
|
||||||
|
| www to non-www (or vice versa) | 301 (better handled at server level) |
|
||||||
|
| Temporary maintenance | 302 to a maintenance page |
|
||||||
|
| A/B testing | 302 to the test variant |
|
||||||
|
| Consolidating duplicate content | 301 all duplicates to the canonical version |
|
||||||
|
|
||||||
|
## Common Redirect Chains to Avoid
|
||||||
|
|
||||||
|
A redirect chain is when URL A redirects to URL B, which redirects to URL C. This wastes crawl budget and dilutes link equity.
|
||||||
|
|
||||||
|
**Bad:** `/old-page/` → `/newer-page/` → `/newest-page/`
|
||||||
|
**Good:** `/old-page/` → `/newest-page/` (and `/newer-page/` → `/newest-page/`)
|
||||||
|
|
||||||
|
When adding a new redirect, check if the destination already has a redirect pointing elsewhere. If so, update the chain to point directly to the final destination.
|
||||||
|
|
||||||
|
## Known Limitations
|
||||||
|
|
||||||
|
| Issue | Workaround |
|
||||||
|
|-------|-----------|
|
||||||
|
| Cannot reorder redirects | Delete and recreate in the desired order |
|
||||||
|
| Regex patterns sometimes fail | Test on regex101.com first; try simpler patterns |
|
||||||
|
| No 404 monitoring (Free) | Pro includes a site crawler that detects 404s |
|
||||||
|
| No redirect chain detection | Manually audit for chains |
|
||||||
|
| Large redirect lists can be slow | Consider moving high-volume redirects to `.htaccess` or server config |
|
||||||
|
|
||||||
|
## Best Practices
|
||||||
|
|
||||||
|
1. **Always redirect, never delete** — A 404 loses all SEO value the old URL had
|
||||||
|
2. **Redirect to the most relevant page** — not always the homepage
|
||||||
|
3. **Audit redirects quarterly** — remove redirects for URLs that no longer receive traffic
|
||||||
|
4. **Keep redirect lists manageable** — if you have 500+ redirects, consider server-level handling
|
||||||
|
5. **Test after creating** — visit the old URL in an incognito window to verify the redirect works
|
||||||
|
6. **Check redirect response code** — use [httpstatus.io](https://httpstatus.io) or browser dev tools Network tab
|
||||||
@@ -0,0 +1,190 @@
|
|||||||
|
# Schema / Structured Data
|
||||||
|
|
||||||
|
SmartCrawl provides both pre-built schema types and a custom schema builder. Schema markup generates rich results in search (star ratings, FAQ dropdowns, event dates, breadcrumbs, etc.) that significantly increase SERP visibility and click-through rates.
|
||||||
|
|
||||||
|
## Pre-Built Schema Types
|
||||||
|
|
||||||
|
SmartCrawl includes the following ready-to-use types:
|
||||||
|
|
||||||
|
| Schema Type | Rich Result | Best For |
|
||||||
|
|-------------|-------------|----------|
|
||||||
|
| **Article** | Article metadata | Blog posts, news articles |
|
||||||
|
| **Web Page** | Page metadata | Static pages |
|
||||||
|
| **FAQ** | Expandable Q&A in SERPs | FAQ pages, service pages with Q&A sections |
|
||||||
|
| **HowTo** | Step-by-step instructions in SERPs | Tutorial content, guides |
|
||||||
|
| **Product** | Price, availability, rating | WooCommerce products |
|
||||||
|
| **Local Business** | Knowledge panel, maps | Business homepages, location pages |
|
||||||
|
| **Recipe** | Rich recipe card | Food/recipe content |
|
||||||
|
| **Job Posting** | Job listing in Google Jobs | Career/hiring pages |
|
||||||
|
| **Movie** | Movie info panel | Entertainment/review sites |
|
||||||
|
| **Course** | Course listing | Educational offerings |
|
||||||
|
| **Book** | Book info panel | Book reviews, author sites |
|
||||||
|
| **Software Application** | App info | Software product pages |
|
||||||
|
| **Event** | Date, time, location in SERPs | Event listing pages |
|
||||||
|
| **Rating / Review** | Star ratings | Review pages (use only with genuine reviews) |
|
||||||
|
| **Video** | Video thumbnail in SERPs | Pages with embedded video |
|
||||||
|
| **Person** | Person knowledge panel | About pages, team pages |
|
||||||
|
| **Organization** | Org knowledge panel | Company about pages |
|
||||||
|
|
||||||
|
## Custom Schema Type Builder
|
||||||
|
|
||||||
|
SmartCrawl includes a **free** custom schema builder for creating schema types not in the pre-built list. Features:
|
||||||
|
|
||||||
|
- Define unlimited custom schema types
|
||||||
|
- Three property structures: **Simple**, **Nested**, or **Collection**
|
||||||
|
- Associate custom schemas with specific posts, pages, or taxonomies
|
||||||
|
- Full JSON-LD output
|
||||||
|
|
||||||
|
## Priority Schema Types to Implement
|
||||||
|
|
||||||
|
### Tier 1 — Every site should have these
|
||||||
|
|
||||||
|
1. **Organization** — Set globally in SmartCrawl's Schema settings
|
||||||
|
- Business name, logo URL, contact info
|
||||||
|
- Social media profile URLs (`sameAs`)
|
||||||
|
- Founding date, description
|
||||||
|
|
||||||
|
2. **LocalBusiness** (for businesses with a physical location or service area)
|
||||||
|
- 60+ subtypes available (e.g., `MotorcycleDealer`, `EducationalOrganization`, `ProfessionalService`)
|
||||||
|
- Full NAP: name, street address, city, state, ZIP, country
|
||||||
|
- Telephone, email
|
||||||
|
- Opening hours specification
|
||||||
|
- Geo coordinates (latitude, longitude)
|
||||||
|
- Area served
|
||||||
|
- Price range
|
||||||
|
|
||||||
|
3. **BreadcrumbList** — Automatic when Breadcrumbs module is enabled
|
||||||
|
|
||||||
|
### Tier 2 — Add where applicable
|
||||||
|
|
||||||
|
4. **FAQ** — Any page with Q&A content
|
||||||
|
- Can generate expandable FAQ directly in search results
|
||||||
|
- Each question/answer pair is a separate `Question` entity
|
||||||
|
- High-visibility rich result
|
||||||
|
|
||||||
|
5. **Event** — For event-based businesses
|
||||||
|
- Start date, end date, location
|
||||||
|
- Offers (price, availability, URL)
|
||||||
|
- Performer/organizer
|
||||||
|
- Shows date/time/location directly in SERPs
|
||||||
|
|
||||||
|
6. **Course** — For educational offerings
|
||||||
|
- Course name, description, provider
|
||||||
|
- Duration, schedule
|
||||||
|
- Price, enrollment URL
|
||||||
|
|
||||||
|
7. **Article / BlogPosting** — For blog content (usually default)
|
||||||
|
|
||||||
|
### Tier 3 — Situational
|
||||||
|
|
||||||
|
8. **Product** — WooCommerce (auto-handled)
|
||||||
|
9. **Video** — Pages with embedded video content
|
||||||
|
10. **HowTo** — Instructional/tutorial content
|
||||||
|
11. **Person** — Individual portfolio/about pages
|
||||||
|
|
||||||
|
## LocalBusiness Schema Setup
|
||||||
|
|
||||||
|
This is the most important schema for local businesses. Set it up in SmartCrawl > Schema > Types.
|
||||||
|
|
||||||
|
### Required Properties
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "LocalBusiness",
|
||||||
|
"name": "Alaska Safe Riders",
|
||||||
|
"address": {
|
||||||
|
"@type": "PostalAddress",
|
||||||
|
"streetAddress": "123 Main St",
|
||||||
|
"addressLocality": "Anchorage",
|
||||||
|
"addressRegion": "AK",
|
||||||
|
"postalCode": "99501",
|
||||||
|
"addressCountry": "US"
|
||||||
|
},
|
||||||
|
"telephone": "+1-907-555-0123",
|
||||||
|
"url": "https://alaskasaferiders.org"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Recommended Additional Properties
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"openingHoursSpecification": [
|
||||||
|
{
|
||||||
|
"@type": "OpeningHoursSpecification",
|
||||||
|
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
|
||||||
|
"opens": "09:00",
|
||||||
|
"closes": "17:00"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"geo": {
|
||||||
|
"@type": "GeoCoordinates",
|
||||||
|
"latitude": 61.2181,
|
||||||
|
"longitude": -149.9003
|
||||||
|
},
|
||||||
|
"areaServed": {
|
||||||
|
"@type": "State",
|
||||||
|
"name": "Alaska"
|
||||||
|
},
|
||||||
|
"priceRange": "$$",
|
||||||
|
"image": "https://example.com/logo.png",
|
||||||
|
"sameAs": [
|
||||||
|
"https://www.facebook.com/yourbusiness",
|
||||||
|
"https://www.instagram.com/yourbusiness"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### LocalBusiness Subtypes
|
||||||
|
|
||||||
|
SmartCrawl supports 60+ subtypes. Choose the most specific one that applies:
|
||||||
|
|
||||||
|
| Category | Examples |
|
||||||
|
|----------|----------|
|
||||||
|
| Automotive | `AutoDealer`, `AutoRepair`, `MotorcycleDealer`, `MotorcycleRepair` |
|
||||||
|
| Education | `EducationalOrganization`, `School`, `DrivingSchool` |
|
||||||
|
| Professional | `ProfessionalService`, `Consultant`, `LegalService` |
|
||||||
|
| Health | `MedicalBusiness`, `Dentist`, `Physician` |
|
||||||
|
| Food | `Restaurant`, `Bakery`, `BarOrPub`, `CafeOrCoffeeShop` |
|
||||||
|
| Entertainment | `EntertainmentBusiness`, `MovieTheater`, `NightClub` |
|
||||||
|
| Home | `HomeAndConstructionBusiness`, `Electrician`, `Plumber` |
|
||||||
|
| Store | `Store`, `ClothingStore`, `HardwareStore`, `SportingGoodsStore` |
|
||||||
|
|
||||||
|
## WooCommerce Product Schema
|
||||||
|
|
||||||
|
When enabled, SmartCrawl:
|
||||||
|
|
||||||
|
- **Replaces** WooCommerce's default schema (avoids duplicates)
|
||||||
|
- Auto-fetches product reviews and aggregate ratings
|
||||||
|
- Supports both simple and variable products
|
||||||
|
- Includes MPN, SKU, `priceValidUntil`
|
||||||
|
- Adds `offers` with price, currency, availability
|
||||||
|
|
||||||
|
Enable via: **SmartCrawl > Schema > WooCommerce Product Open Graph**
|
||||||
|
|
||||||
|
## Person Schema
|
||||||
|
|
||||||
|
As of v3.15.0, Person Schema can be limited to specific pages when Organization Schema is enabled globally. Useful for:
|
||||||
|
|
||||||
|
- Team member pages
|
||||||
|
- Author bio pages
|
||||||
|
- Individual portfolio sites (e.g., Chelsea Paige Mann)
|
||||||
|
|
||||||
|
## Validation
|
||||||
|
|
||||||
|
**Always validate schema after deployment:**
|
||||||
|
|
||||||
|
1. [Google Rich Results Test](https://search.google.com/test/rich-results) — checks if your schema qualifies for rich results
|
||||||
|
2. [Schema.org Validator](https://validator.schema.org/) — validates JSON-LD syntax
|
||||||
|
3. Google Search Console > Enhancements — monitors schema errors across your site over time
|
||||||
|
|
||||||
|
## Common Schema Mistakes
|
||||||
|
|
||||||
|
| Mistake | Fix |
|
||||||
|
|---------|-----|
|
||||||
|
| Duplicate schema from multiple plugins | Deactivate other SEO plugins' schema output |
|
||||||
|
| Using Review schema without genuine reviews | Only add if you have real, verifiable reviews |
|
||||||
|
| Missing required properties | Check Google's [structured data documentation](https://developers.google.com/search/docs/advanced/structured-data/) for requirements per type |
|
||||||
|
| Wrong LocalBusiness subtype | Use the most specific applicable type |
|
||||||
|
| Schema on pages it doesn't apply to | Only add schema types relevant to the page content |
|
||||||
@@ -0,0 +1,108 @@
|
|||||||
|
# Sitemaps
|
||||||
|
|
||||||
|
SmartCrawl generates three types of sitemaps: XML, Google News, and Image. All are configured under the Sitemap module.
|
||||||
|
|
||||||
|
## XML Sitemap
|
||||||
|
|
||||||
|
### Configuration
|
||||||
|
|
||||||
|
| Setting | Recommended Value |
|
||||||
|
|---------|------------------|
|
||||||
|
| Enable XML Sitemap | Yes |
|
||||||
|
| Post types included | Posts, Pages, Products, public custom post types |
|
||||||
|
| Taxonomies included | Categories (yes), Tags (only if indexed), custom taxonomies |
|
||||||
|
| Max URLs per file | Default (auto-splits into multiple files) |
|
||||||
|
| Notify search engines | Automatic |
|
||||||
|
|
||||||
|
### Access
|
||||||
|
|
||||||
|
Your sitemap is at: `https://yoursite.com/sitemap.xml`
|
||||||
|
|
||||||
|
SmartCrawl auto-generates a sitemap index that links to individual sitemaps per post type and taxonomy.
|
||||||
|
|
||||||
|
### Exclusions
|
||||||
|
|
||||||
|
Exclude specific content by:
|
||||||
|
- **Post/page ID** — Enter IDs in the exclusion list
|
||||||
|
- **Custom URLs** — Add specific URLs to exclude
|
||||||
|
- **Post type** — Uncheck entire post types from the include list
|
||||||
|
|
||||||
|
**Important:** If you set a page to `noindex`, also exclude it from the sitemap. SmartCrawl does **not** do this automatically.
|
||||||
|
|
||||||
|
### Limitation
|
||||||
|
|
||||||
|
SmartCrawl limits sitemaps to **1,000 most recent posts** per post type to prevent memory errors on large sites. If you have more than 1,000 posts, older content may not appear in the sitemap.
|
||||||
|
|
||||||
|
## Google News Sitemap
|
||||||
|
|
||||||
|
Enable this only if the site publishes news-style content that qualifies for Google News.
|
||||||
|
|
||||||
|
### Requirements for Google News
|
||||||
|
|
||||||
|
- Content must be timely, original news articles
|
||||||
|
- Published within the last 2 days (Google News requirement)
|
||||||
|
- Site should be registered with Google News Publisher Center
|
||||||
|
|
||||||
|
### Configuration
|
||||||
|
|
||||||
|
- Enable the Google News Sitemap toggle
|
||||||
|
- Select which post types to include (usually just Posts)
|
||||||
|
- Verify at `https://yoursite.com/news-sitemap.xml`
|
||||||
|
|
||||||
|
## Image Sitemap
|
||||||
|
|
||||||
|
One-click enable. Tells Google about images on your pages for Google Images indexing.
|
||||||
|
|
||||||
|
### When to Enable
|
||||||
|
|
||||||
|
- Sites with significant visual content (portfolios, galleries, products)
|
||||||
|
- Sites where image search traffic is valuable
|
||||||
|
- Always enable for WooCommerce sites (product images)
|
||||||
|
|
||||||
|
### What It Includes
|
||||||
|
|
||||||
|
SmartCrawl adds image entries to your existing XML sitemap (not a separate file). Each page entry includes its images with:
|
||||||
|
- Image URL
|
||||||
|
- Image title
|
||||||
|
- Image caption (if set)
|
||||||
|
|
||||||
|
## Sitemap Submission
|
||||||
|
|
||||||
|
### Google Search Console
|
||||||
|
|
||||||
|
1. Go to Search Console > Sitemaps
|
||||||
|
2. Enter `sitemap.xml` in the "Add a new sitemap" field
|
||||||
|
3. Click Submit
|
||||||
|
4. Verify status shows "Success" after Google fetches it
|
||||||
|
|
||||||
|
### Bing Webmaster Tools
|
||||||
|
|
||||||
|
1. Go to Bing Webmaster Tools > Sitemaps
|
||||||
|
2. Submit `https://yoursite.com/sitemap.xml`
|
||||||
|
|
||||||
|
### robots.txt
|
||||||
|
|
||||||
|
Add a sitemap directive to robots.txt (use full absolute URL):
|
||||||
|
|
||||||
|
```
|
||||||
|
Sitemap: https://yoursite.com/sitemap.xml
|
||||||
|
```
|
||||||
|
|
||||||
|
## After Making Changes
|
||||||
|
|
||||||
|
When you add/remove content or change sitemap settings:
|
||||||
|
|
||||||
|
1. Use the **"New Crawl" button** in SmartCrawl's sitemap tab to notify Google
|
||||||
|
2. Or wait for automatic notification (if set to Automatic mode)
|
||||||
|
3. Verify the updated sitemap at `yoursite.com/sitemap.xml`
|
||||||
|
4. Check Google Search Console > Sitemaps for any errors
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
| Issue | Fix |
|
||||||
|
|-------|-----|
|
||||||
|
| Sitemap returns 404 | Flush permalinks (Settings > Permalinks > Save) |
|
||||||
|
| Post type missing from sitemap | Check SmartCrawl Sitemap settings — ensure the post type is included |
|
||||||
|
| Noindexed pages appearing in sitemap | Manually exclude them by ID — SmartCrawl doesn't auto-exclude noindexed content |
|
||||||
|
| WPML duplicate URLs | Known issue — duplicate homepage URLs in sitemap when using WPML |
|
||||||
|
| Sitemap too large / memory error | SmartCrawl limits to 1,000 posts — contact WPMU DEV support for large sites |
|
||||||
@@ -0,0 +1,143 @@
|
|||||||
|
# Social: Open Graph & Twitter Cards
|
||||||
|
|
||||||
|
SmartCrawl controls how your pages appear when shared on social media platforms. Open Graph tags handle Facebook, Instagram, LinkedIn, and Pinterest. Twitter Card tags handle X (formerly Twitter).
|
||||||
|
|
||||||
|
## Open Graph (OG) Tags
|
||||||
|
|
||||||
|
### What They Control
|
||||||
|
|
||||||
|
When someone shares a link on Facebook, Instagram, LinkedIn, or Pinterest, the platform reads these tags to determine:
|
||||||
|
|
||||||
|
- **Title** — The headline shown in the share card
|
||||||
|
- **Description** — The preview text
|
||||||
|
- **Image** — The thumbnail/preview image
|
||||||
|
- **URL** — The canonical URL
|
||||||
|
- **Type** — Content type (website, article, product, etc.)
|
||||||
|
|
||||||
|
### Global Settings
|
||||||
|
|
||||||
|
| Setting | Recommendation |
|
||||||
|
|---------|---------------|
|
||||||
|
| Enable Open Graph | Yes (all post types) |
|
||||||
|
| Default OG Image | Set a branded fallback image (**1200x630px**) |
|
||||||
|
| Site Name | Your business name |
|
||||||
|
|
||||||
|
### Per-Post Type Defaults
|
||||||
|
|
||||||
|
Configure in SmartCrawl > Social for each post type:
|
||||||
|
|
||||||
|
- **Posts:** OG type = `article`, use post title and excerpt
|
||||||
|
- **Pages:** OG type = `website`, use page title and excerpt
|
||||||
|
- **Products:** Enable WooCommerce Product OG toggle (adds `og:type=product`, price, availability automatically)
|
||||||
|
|
||||||
|
### Per-Post Overrides
|
||||||
|
|
||||||
|
For important pages, set custom OG values in the SmartCrawl meta box:
|
||||||
|
|
||||||
|
| Field | Guidance |
|
||||||
|
|-------|----------|
|
||||||
|
| OG Title | Can differ from SEO title — make it more engaging/clickable for social |
|
||||||
|
| OG Description | Can be longer than meta description (up to ~300 characters). Write for social context. |
|
||||||
|
| OG Image | Must be **1200x630px** for optimal rendering. Avoid text-heavy images (Facebook may reject them). |
|
||||||
|
|
||||||
|
### Key OG Tags Output
|
||||||
|
|
||||||
|
```html
|
||||||
|
<meta property="og:title" content="Page Title" />
|
||||||
|
<meta property="og:description" content="Page description for social sharing" />
|
||||||
|
<meta property="og:image" content="https://example.com/image-1200x630.jpg" />
|
||||||
|
<meta property="og:url" content="https://example.com/page/" />
|
||||||
|
<meta property="og:type" content="article" />
|
||||||
|
<meta property="og:site_name" content="Site Name" />
|
||||||
|
```
|
||||||
|
|
||||||
|
## Twitter Cards
|
||||||
|
|
||||||
|
### Card Types
|
||||||
|
|
||||||
|
SmartCrawl supports:
|
||||||
|
|
||||||
|
| Type | Appearance |
|
||||||
|
|------|-----------|
|
||||||
|
| `summary` | Small square thumbnail + title + description |
|
||||||
|
| `summary_large_image` | Large image above title + description |
|
||||||
|
|
||||||
|
**Recommendation:** Use `summary_large_image` for most content — larger images get more engagement.
|
||||||
|
|
||||||
|
### Configuration
|
||||||
|
|
||||||
|
| Setting | Recommendation |
|
||||||
|
|---------|---------------|
|
||||||
|
| Enable Twitter Cards | Yes |
|
||||||
|
| Default Card Type | `summary_large_image` |
|
||||||
|
| Twitter Site Handle | `@yourbrand` (your brand's Twitter handle) |
|
||||||
|
|
||||||
|
### Per-Post Overrides
|
||||||
|
|
||||||
|
Twitter Card title, description, and image can be set separately from OG tags. This allows platform-specific messaging:
|
||||||
|
|
||||||
|
- **Twitter title:** Shorter, punchier (Twitter is fast-scrolling)
|
||||||
|
- **Twitter image:** Same 1200x630px works, but can use a different image optimized for Twitter's crop
|
||||||
|
|
||||||
|
## Pinterest Verification
|
||||||
|
|
||||||
|
Add your Pinterest verification meta tag in SmartCrawl > Social > Pinterest:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<meta name="p:domain_verify" content="your-verification-code" />
|
||||||
|
```
|
||||||
|
|
||||||
|
This verifies your website with Pinterest and enables rich pins.
|
||||||
|
|
||||||
|
## Image Guidelines
|
||||||
|
|
||||||
|
### Optimal Dimensions
|
||||||
|
|
||||||
|
| Platform | Recommended Size | Minimum |
|
||||||
|
|----------|-----------------|---------|
|
||||||
|
| Facebook | 1200x630px | 600x315px |
|
||||||
|
| Twitter | 1200x630px | 300x157px |
|
||||||
|
| LinkedIn | 1200x627px | 1200x627px |
|
||||||
|
| Pinterest | 1000x1500px (2:3 ratio) | 600x900px |
|
||||||
|
|
||||||
|
### Image Best Practices
|
||||||
|
|
||||||
|
- Use **1200x630px** as the universal default (works well on all platforms)
|
||||||
|
- Avoid images with more than 20% text overlay (Facebook may throttle reach)
|
||||||
|
- Use high-contrast images that are recognizable at small sizes
|
||||||
|
- Set a **default/fallback OG image** in SmartCrawl's global settings for pages without featured images
|
||||||
|
- Product pages should use the product image as OG image
|
||||||
|
|
||||||
|
## Debugging Social Shares
|
||||||
|
|
||||||
|
### Facebook
|
||||||
|
|
||||||
|
Use the [Facebook Sharing Debugger](https://developers.facebook.com/tools/debug/):
|
||||||
|
1. Enter your URL
|
||||||
|
2. Click "Debug"
|
||||||
|
3. Verify title, description, and image are correct
|
||||||
|
4. Click "Scrape Again" to force Facebook to re-fetch after making changes
|
||||||
|
|
||||||
|
### Twitter
|
||||||
|
|
||||||
|
Use the [Twitter Card Validator](https://cards-dev.twitter.com/validator):
|
||||||
|
1. Enter your URL
|
||||||
|
2. Click "Preview card"
|
||||||
|
3. Verify the card renders correctly
|
||||||
|
|
||||||
|
### LinkedIn
|
||||||
|
|
||||||
|
LinkedIn caches aggressively. Use their [Post Inspector](https://www.linkedin.com/post-inspector/):
|
||||||
|
1. Enter your URL
|
||||||
|
2. Review the preview
|
||||||
|
3. Click "Refresh" to clear cache
|
||||||
|
|
||||||
|
## Common Issues
|
||||||
|
|
||||||
|
| Issue | Fix |
|
||||||
|
|-------|-----|
|
||||||
|
| Old image showing on Facebook | Use Facebook Debugger > "Scrape Again" |
|
||||||
|
| OG tags present but not rendering | Check for duplicate OG tags from other plugins/theme |
|
||||||
|
| No image in share preview | Set a default OG image in SmartCrawl global settings |
|
||||||
|
| WooCommerce products missing price in share | Enable the "WooCommerce Product Open Graph" toggle |
|
||||||
|
| OG tags still active after disabling | Known issue — may persist on homepage after wizard deactivation. Clear manually. |
|
||||||
@@ -0,0 +1,190 @@
|
|||||||
|
# Titles & Meta Descriptions
|
||||||
|
|
||||||
|
SmartCrawl's Titles & Meta module controls how every page on your site appears in search results and browser tabs. It uses a macro/variable system for global templates with per-post overrides.
|
||||||
|
|
||||||
|
## Template Macros
|
||||||
|
|
||||||
|
SmartCrawl uses `%%variable%%` syntax. The full list is accessible via the **"Browse Macros"** button in the Titles & Meta admin screen.
|
||||||
|
|
||||||
|
### Core Macros
|
||||||
|
|
||||||
|
| Macro | Output |
|
||||||
|
|-------|--------|
|
||||||
|
| `%%title%%` | Post/page title |
|
||||||
|
| `%%sitename%%` | Site name (from Settings > General) |
|
||||||
|
| `%%sep%%` | Separator character (configurable) |
|
||||||
|
| `%%excerpt%%` | Post excerpt (auto-generated if not set) |
|
||||||
|
| `%%excerpt_only%%` | Excerpt only — no auto-generation fallback |
|
||||||
|
| `%%category%%` | Post primary category |
|
||||||
|
| `%%tag%%` | Post tags |
|
||||||
|
| `%%term_title%%` | Term/taxonomy title |
|
||||||
|
| `%%term_description%%` | Term description |
|
||||||
|
|
||||||
|
### Date & Time Macros
|
||||||
|
|
||||||
|
| Macro | Output |
|
||||||
|
|-------|--------|
|
||||||
|
| `%%date%%` | Post published date |
|
||||||
|
| `%%modified%%` | Post last modified date |
|
||||||
|
| `%%currenttime%%` | Current time |
|
||||||
|
| `%%currentdate%%` | Current date |
|
||||||
|
| `%%currentday%%` | Current day |
|
||||||
|
| `%%currentmonth%%` | Current month |
|
||||||
|
| `%%currentyear%%` | Current year |
|
||||||
|
|
||||||
|
### Pagination Macros
|
||||||
|
|
||||||
|
| Macro | Output |
|
||||||
|
|-------|--------|
|
||||||
|
| `%%page%%` | Page number |
|
||||||
|
| `%%pagenumber%%` | Current page number |
|
||||||
|
| `%%pagetotal%%` | Total pages |
|
||||||
|
| `%%spell_pagenumber%%` | Page number in words ("Page Two of Five") |
|
||||||
|
| `%%spell_pagetotal%%` | Total pages in words |
|
||||||
|
|
||||||
|
### Author & Post Macros
|
||||||
|
|
||||||
|
| Macro | Output |
|
||||||
|
|-------|--------|
|
||||||
|
| `%%name%%` | Author display name |
|
||||||
|
| `%%userid%%` | Author user ID |
|
||||||
|
| `%%id%%` | Post ID |
|
||||||
|
| `%%pt_single%%` | Post type singular name |
|
||||||
|
| `%%pt_plural%%` | Post type plural name |
|
||||||
|
|
||||||
|
### Special Macros
|
||||||
|
|
||||||
|
| Macro | Output |
|
||||||
|
|-------|--------|
|
||||||
|
| `%%searchphrase%%` | Search query (for search results page) |
|
||||||
|
| Custom field macros | Supported with uppercase (v3.11.0+) |
|
||||||
|
|
||||||
|
> Additional "dynamic macros" exist for edge cases that do not appear in the Browse Macros list. These are documented in the WPMU DEV support forums.
|
||||||
|
|
||||||
|
## Global vs Per-Post Settings
|
||||||
|
|
||||||
|
| Level | Scope | How It Works |
|
||||||
|
|-------|-------|-------------|
|
||||||
|
| **Global template** | Per post type, per taxonomy, archives, special pages | Set once, applies everywhere via macros |
|
||||||
|
| **Per-post override** | Individual post/page | Entered in the SmartCrawl meta box in the editor — overrides the global template |
|
||||||
|
|
||||||
|
### When to Use Each
|
||||||
|
|
||||||
|
- **Global template:** Set it and forget it. Works well for blogs, archives, and consistent content types.
|
||||||
|
- **Per-post override:** Use for every important page. Homepage, service pages, key landing pages, and high-value blog posts should all have hand-crafted titles and descriptions.
|
||||||
|
|
||||||
|
## Recommended Title Templates
|
||||||
|
|
||||||
|
### Homepage
|
||||||
|
```
|
||||||
|
%%sitename%% %%sep%% [Your primary value proposition]
|
||||||
|
```
|
||||||
|
Example output: `Alaska Safe Riders | Motorcycle Safety Courses in Anchorage, AK`
|
||||||
|
|
||||||
|
### Posts (Blog)
|
||||||
|
```
|
||||||
|
%%title%% %%sep%% %%sitename%%
|
||||||
|
```
|
||||||
|
Example output: `What to Wear to a Motorcycle Safety Course | Alaska Safe Riders`
|
||||||
|
|
||||||
|
### Pages
|
||||||
|
```
|
||||||
|
%%title%% %%sep%% %%sitename%%
|
||||||
|
```
|
||||||
|
Override per-page for service pages with keyword-optimized titles.
|
||||||
|
|
||||||
|
### Categories
|
||||||
|
```
|
||||||
|
%%term_title%% %%sep%% %%sitename%%
|
||||||
|
```
|
||||||
|
|
||||||
|
### Author Archives
|
||||||
|
```
|
||||||
|
Posts by %%name%% %%sep%% %%sitename%%
|
||||||
|
```
|
||||||
|
(Consider noindexing author archives on single-author sites)
|
||||||
|
|
||||||
|
### Search Results
|
||||||
|
```
|
||||||
|
Search Results for "%%searchphrase%%" %%sep%% %%sitename%%
|
||||||
|
```
|
||||||
|
(Always noindex search results pages)
|
||||||
|
|
||||||
|
### 404 Page
|
||||||
|
```
|
||||||
|
Page Not Found %%sep%% %%sitename%%
|
||||||
|
```
|
||||||
|
|
||||||
|
## Title Tag Best Practices
|
||||||
|
|
||||||
|
- **Length:** 50-60 characters (Google truncates at ~580px pixel width)
|
||||||
|
- **Primary keyword placement:** As close to the beginning as possible
|
||||||
|
- **Every page must have a unique title** — duplicates confuse Google
|
||||||
|
- **Include brand name** at the end (builds brand recognition in SERPs)
|
||||||
|
- **Do not keyword-stuff** — one primary keyword is enough
|
||||||
|
- **Use power words for CTR:** "Best", "Guide", "Free", numbers, parentheses
|
||||||
|
|
||||||
|
### Good vs Bad Examples
|
||||||
|
|
||||||
|
| Bad | Good |
|
||||||
|
|-----|------|
|
||||||
|
| `Home - My Website` | `Motorcycle Safety Courses Anchorage, AK \| Alaska Safe Riders` |
|
||||||
|
| `Services` | `Event Management & Roster Tracking \| ASR Events Manager` |
|
||||||
|
| `Blog Post Title Here \| Category \| Website Name` | `What to Expect at a Basic Rider Course \| Alaska Safe Riders` |
|
||||||
|
|
||||||
|
## Meta Description Best Practices
|
||||||
|
|
||||||
|
- **Length:** 150-160 characters (Google truncates unpredictably above this)
|
||||||
|
- **Include primary keyword** naturally (Google bolds matching terms)
|
||||||
|
- **Include a call to action:** "Register today", "Learn more", "Contact us"
|
||||||
|
- **Include differentiators:** Pricing, location, certifications, experience
|
||||||
|
- **Hand-craft descriptions** for important pages — auto-generated ones rarely perform well
|
||||||
|
- **Google rewrites ~60% of meta descriptions** but good ones are kept and improve CTR
|
||||||
|
|
||||||
|
### Quality Indicators in SmartCrawl
|
||||||
|
|
||||||
|
SmartCrawl's SEO status column on post/page lists uses color-coded indicators:
|
||||||
|
|
||||||
|
| Color | Meaning |
|
||||||
|
|-------|---------|
|
||||||
|
| Green | Description is 120-160 characters, hand-crafted |
|
||||||
|
| Yellow | Description exists but is outside optimal range or auto-generated |
|
||||||
|
| Red | No description set |
|
||||||
|
|
||||||
|
## Separator Character
|
||||||
|
|
||||||
|
Set in Titles & Meta > General. Common choices:
|
||||||
|
|
||||||
|
| Separator | Look |
|
||||||
|
|-----------|------|
|
||||||
|
| `\|` (pipe) | `Page Title \| Site Name` |
|
||||||
|
| `—` (em dash) | `Page Title — Site Name` |
|
||||||
|
| `-` (hyphen) | `Page Title - Site Name` |
|
||||||
|
| `»` | `Page Title » Site Name` |
|
||||||
|
|
||||||
|
**Recommendation:** Use `|` or `—` for a clean, modern appearance.
|
||||||
|
|
||||||
|
## Noindex Recommendations
|
||||||
|
|
||||||
|
Set these in the Titles & Meta module per post type/taxonomy:
|
||||||
|
|
||||||
|
| Content Type | Recommendation | Reason |
|
||||||
|
|--------------|---------------|--------|
|
||||||
|
| Tag archives | Noindex | Usually thin content, duplicate of category archives |
|
||||||
|
| Author archives | Noindex (single-author sites) | Duplicate of main blog page |
|
||||||
|
| Date archives | Noindex | Thin content, duplicate |
|
||||||
|
| Search results | Noindex | Dynamic, no SEO value |
|
||||||
|
| Paginated archives | Noindex | Thin duplicate content |
|
||||||
|
| Media attachment pages | Noindex | Single image on a page, no value |
|
||||||
|
| Thank you pages | Noindex | No search value |
|
||||||
|
|
||||||
|
## Post Type Configuration
|
||||||
|
|
||||||
|
Check **Settings > Advanced > Post Types** to ensure all relevant content types are enabled:
|
||||||
|
|
||||||
|
- Posts and Pages (default)
|
||||||
|
- WooCommerce Products (if applicable)
|
||||||
|
- Portfolio items
|
||||||
|
- Any custom post types
|
||||||
|
|
||||||
|
**If a post type is not enabled, its pages will not appear in sitemaps and will not get SmartCrawl meta box in the editor.**
|
||||||
@@ -0,0 +1,184 @@
|
|||||||
|
# Keyword Research Worksheet
|
||||||
|
|
||||||
|
Use this template to research and organize keywords for a specific site. Copy this file per site.
|
||||||
|
|
||||||
|
## Site Information
|
||||||
|
|
||||||
|
- **Site:**
|
||||||
|
- **URL:**
|
||||||
|
- **Business type:**
|
||||||
|
- **Primary location(s):**
|
||||||
|
- **Target audience:**
|
||||||
|
- **Date:**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. Seed Keywords
|
||||||
|
|
||||||
|
List everything the target audience might search for:
|
||||||
|
|
||||||
|
### Services / Products
|
||||||
|
|
||||||
|
| Service/Product | Seed Keywords |
|
||||||
|
|----------------|---------------|
|
||||||
|
| | |
|
||||||
|
| | |
|
||||||
|
| | |
|
||||||
|
|
||||||
|
### Problems / Questions
|
||||||
|
|
||||||
|
| Problem/Question | Seed Keywords |
|
||||||
|
|-----------------|---------------|
|
||||||
|
| | |
|
||||||
|
| | |
|
||||||
|
|
||||||
|
### Location Variations
|
||||||
|
|
||||||
|
| Location | Format |
|
||||||
|
|----------|--------|
|
||||||
|
| City | `[service] [city]` |
|
||||||
|
| State | `[service] [state]` |
|
||||||
|
| Neighborhood | `[service] [neighborhood]` |
|
||||||
|
| Region | `[service] [region]` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Keyword Matrix (Local)
|
||||||
|
|
||||||
|
Fill in with Target / Assess / Skip for each intersection:
|
||||||
|
|
||||||
|
| Service ↓ \ Location → | [City 1] | [City 2] | [City 3] | [State] |
|
||||||
|
|------------------------|----------|----------|----------|---------|
|
||||||
|
| [Service 1] | | | | |
|
||||||
|
| [Service 2] | | | | |
|
||||||
|
| [Service 3] | | | | |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. Expanded Keywords
|
||||||
|
|
||||||
|
After running seed keywords through tools (Google Autocomplete, PAA, Keyword Planner, Ubersuggest):
|
||||||
|
|
||||||
|
### Informational Keywords (Blog Content)
|
||||||
|
|
||||||
|
| Keyword | Est. Volume | Difficulty | Intent | Notes |
|
||||||
|
|---------|------------|------------|--------|-------|
|
||||||
|
| | | | Informational | |
|
||||||
|
| | | | Informational | |
|
||||||
|
| | | | Informational | |
|
||||||
|
| | | | Informational | |
|
||||||
|
| | | | Informational | |
|
||||||
|
|
||||||
|
### Commercial Keywords (Service/Comparison Pages)
|
||||||
|
|
||||||
|
| Keyword | Est. Volume | Difficulty | Intent | Notes |
|
||||||
|
|---------|------------|------------|--------|-------|
|
||||||
|
| | | | Commercial | |
|
||||||
|
| | | | Commercial | |
|
||||||
|
| | | | Commercial | |
|
||||||
|
|
||||||
|
### Transactional Keywords (Registration/Contact/Buy)
|
||||||
|
|
||||||
|
| Keyword | Est. Volume | Difficulty | Intent | Notes |
|
||||||
|
|---------|------------|------------|--------|-------|
|
||||||
|
| | | | Transactional | |
|
||||||
|
| | | | Transactional | |
|
||||||
|
| | | | Transactional | |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. People Also Ask (PAA) Questions
|
||||||
|
|
||||||
|
From Google PAA results for your primary keywords:
|
||||||
|
|
||||||
|
| Question | Target Page | Priority |
|
||||||
|
|----------|-------------|----------|
|
||||||
|
| | | |
|
||||||
|
| | | |
|
||||||
|
| | | |
|
||||||
|
| | | |
|
||||||
|
| | | |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. Competitor Keywords
|
||||||
|
|
||||||
|
From reviewing competitor sites and sitemaps:
|
||||||
|
|
||||||
|
| Competitor | URL | Keywords They Target | Gap (We Don't Cover) |
|
||||||
|
|-----------|-----|---------------------|---------------------|
|
||||||
|
| | | | |
|
||||||
|
| | | | |
|
||||||
|
| | | | |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. Search Console Data (Existing Sites Only)
|
||||||
|
|
||||||
|
### High-Impression Keywords (What Google Shows Us For)
|
||||||
|
|
||||||
|
| Query | Impressions | Clicks | CTR | Position | Page |
|
||||||
|
|-------|------------|--------|-----|----------|------|
|
||||||
|
| | | | | | |
|
||||||
|
| | | | | | |
|
||||||
|
| | | | | | |
|
||||||
|
|
||||||
|
### Striking Distance (Position 8-20)
|
||||||
|
|
||||||
|
| Query | Position | Page | Action |
|
||||||
|
|-------|----------|------|--------|
|
||||||
|
| | | | |
|
||||||
|
| | | | |
|
||||||
|
| | | | |
|
||||||
|
|
||||||
|
### High Impressions / Low CTR (Title/Description Fix)
|
||||||
|
|
||||||
|
| Query | Impressions | CTR | Page | Fix Needed |
|
||||||
|
|-------|------------|-----|------|-----------|
|
||||||
|
| | | | | |
|
||||||
|
| | | | | |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. Keyword-to-Page Mapping
|
||||||
|
|
||||||
|
Assign one primary keyword per page:
|
||||||
|
|
||||||
|
| Page | Primary Keyword | Secondary Keywords (2-3) | Intent | Status |
|
||||||
|
|------|----------------|-------------------------|--------|--------|
|
||||||
|
| Homepage | | | Nav/Commercial | |
|
||||||
|
| About | | | Navigational | |
|
||||||
|
| Contact | | | Nav/Transactional | |
|
||||||
|
| [Service 1] | | | Commercial | |
|
||||||
|
| [Service 2] | | | Commercial | |
|
||||||
|
| [Blog Post 1] | | | Informational | |
|
||||||
|
| [Blog Post 2] | | | Informational | |
|
||||||
|
|
||||||
|
Status: Not Started / In Progress / Optimized / Monitoring
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. Content Gap — New Pages Needed
|
||||||
|
|
||||||
|
Keywords that don't have a natural home on existing pages:
|
||||||
|
|
||||||
|
| Keyword | Intent | Proposed Page | Priority |
|
||||||
|
|---------|--------|--------------|----------|
|
||||||
|
| | | | |
|
||||||
|
| | | | |
|
||||||
|
| | | | |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. Seasonal Opportunities
|
||||||
|
|
||||||
|
| Season/Event | Keywords | Content Needed | Publish By |
|
||||||
|
|-------------|----------|---------------|-----------|
|
||||||
|
| | | | |
|
||||||
|
| | | | |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
_Research observations, tool screenshots, or additional context:_
|
||||||
@@ -0,0 +1,206 @@
|
|||||||
|
# Page Optimization Checklist
|
||||||
|
|
||||||
|
Use this template when optimizing an individual page. Copy per page.
|
||||||
|
|
||||||
|
## Page Information
|
||||||
|
|
||||||
|
- **Site:**
|
||||||
|
- **Page URL:**
|
||||||
|
- **Page type:** Homepage / Service / Blog / Portfolio / Contact / About / Landing
|
||||||
|
- **Primary keyword:**
|
||||||
|
- **Secondary keywords (2-3):**
|
||||||
|
- **Search intent:** Informational / Navigational / Commercial / Transactional
|
||||||
|
- **Date optimized:**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## SmartCrawl Setup
|
||||||
|
|
||||||
|
- [ ] Focus keyword set in SmartCrawl (primary)
|
||||||
|
- [ ] Secondary keywords added (up to 3 total)
|
||||||
|
- [ ] SEO analysis tab reviewed
|
||||||
|
- [ ] Readability analysis tab reviewed
|
||||||
|
- [ ] No keyword cannibalization (checked against other posts)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Title Tag
|
||||||
|
|
||||||
|
- [ ] Contains primary keyword
|
||||||
|
- [ ] Keyword near the beginning
|
||||||
|
- [ ] Length: 50-60 characters
|
||||||
|
- [ ] Unique (not used on any other page)
|
||||||
|
- [ ] Includes brand name
|
||||||
|
- [ ] Compelling for CTR (value prop, numbers, power words)
|
||||||
|
|
||||||
|
**Title tag:** `________________________________________`
|
||||||
|
**Character count:** ____
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Meta Description
|
||||||
|
|
||||||
|
- [ ] Hand-crafted (not auto-generated)
|
||||||
|
- [ ] Contains primary keyword
|
||||||
|
- [ ] Length: 150-160 characters
|
||||||
|
- [ ] Includes call to action
|
||||||
|
- [ ] Includes differentiator (price, location, certification, etc.)
|
||||||
|
- [ ] Compelling for CTR
|
||||||
|
|
||||||
|
**Meta description:** `________________________________________`
|
||||||
|
**Character count:** ____
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Headings
|
||||||
|
|
||||||
|
- [ ] Exactly one H1 on the page
|
||||||
|
- [ ] H1 contains primary keyword
|
||||||
|
- [ ] H2s cover major sections (3-8 total)
|
||||||
|
- [ ] At least one H2 contains a secondary keyword
|
||||||
|
- [ ] H3s used for subsections where needed
|
||||||
|
- [ ] No skipped levels (H1 → H2 → H3, not H1 → H3)
|
||||||
|
|
||||||
|
**H1:** `________________________________________`
|
||||||
|
|
||||||
|
**H2s:**
|
||||||
|
1.
|
||||||
|
2.
|
||||||
|
3.
|
||||||
|
4.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Content
|
||||||
|
|
||||||
|
- [ ] Primary keyword in first 100-200 words
|
||||||
|
- [ ] Topic covered comprehensively (no obvious gaps vs top competitors)
|
||||||
|
- [ ] Written for humans first, search engines second
|
||||||
|
- [ ] Short paragraphs (2-4 sentences)
|
||||||
|
- [ ] Uses lists, tables, or structured formatting where appropriate
|
||||||
|
- [ ] Readability score: ____ (target 60-70 Flesch-Kincaid)
|
||||||
|
- [ ] No keyword stuffing
|
||||||
|
- [ ] Answers the searcher's question/need clearly
|
||||||
|
|
||||||
|
**Word count:** ____
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Images
|
||||||
|
|
||||||
|
- [ ] At least one image on the page
|
||||||
|
- [ ] Primary image has alt text with keyword (where natural)
|
||||||
|
- [ ] All images have descriptive alt text
|
||||||
|
- [ ] Image file names are descriptive (not `IMG_4532.jpg`)
|
||||||
|
- [ ] Images are optimized (WebP/compressed, explicit dimensions)
|
||||||
|
- [ ] Below-fold images use lazy loading
|
||||||
|
|
||||||
|
**Images on page:** ____
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Internal Links
|
||||||
|
|
||||||
|
- [ ] Page links to 2-3+ other relevant pages on the site
|
||||||
|
- [ ] 2-3+ other pages link to this page
|
||||||
|
- [ ] Anchor text is descriptive (not "click here")
|
||||||
|
- [ ] Links are contextually relevant
|
||||||
|
|
||||||
|
**Outgoing internal links:**
|
||||||
|
1. `[anchor text]` → `[destination URL]`
|
||||||
|
2. `[anchor text]` → `[destination URL]`
|
||||||
|
3. `[anchor text]` → `[destination URL]`
|
||||||
|
|
||||||
|
**Incoming internal links from:**
|
||||||
|
1.
|
||||||
|
2.
|
||||||
|
3.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## URL
|
||||||
|
|
||||||
|
- [ ] Short and descriptive
|
||||||
|
- [ ] Contains primary keyword
|
||||||
|
- [ ] Uses hyphens (not underscores)
|
||||||
|
- [ ] Lowercase
|
||||||
|
- [ ] No dates (unless truly time-bound)
|
||||||
|
- [ ] No unnecessary parameters or IDs
|
||||||
|
|
||||||
|
**URL slug:** `/________________________________/`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Open Graph / Social
|
||||||
|
|
||||||
|
- [ ] OG title set (or using SEO title as default)
|
||||||
|
- [ ] OG description set
|
||||||
|
- [ ] OG image set (1200x630px)
|
||||||
|
- [ ] Twitter Card configured
|
||||||
|
- [ ] Tested with Facebook Sharing Debugger
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Schema Markup
|
||||||
|
|
||||||
|
- [ ] Appropriate schema type applied
|
||||||
|
- [ ] Schema validated at Google Rich Results Test
|
||||||
|
- [ ] No errors or warnings
|
||||||
|
|
||||||
|
**Schema type:** ____
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Technical
|
||||||
|
|
||||||
|
- [ ] Page loads over HTTPS
|
||||||
|
- [ ] Canonical tag present and correct
|
||||||
|
- [ ] Not accidentally noindexed
|
||||||
|
- [ ] Included in XML sitemap
|
||||||
|
- [ ] Mobile-friendly
|
||||||
|
- [ ] Page load time acceptable
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## SmartCrawl Analysis Results
|
||||||
|
|
||||||
|
### SEO Checks
|
||||||
|
|
||||||
|
| Check | Status |
|
||||||
|
|-------|--------|
|
||||||
|
| Keyphrase in title | |
|
||||||
|
| Keyphrase in URL | |
|
||||||
|
| Keyphrase in meta description | |
|
||||||
|
| Keyphrase in H1 | |
|
||||||
|
| Keyphrase in subheadings | |
|
||||||
|
| Keyphrase in content | |
|
||||||
|
| Keyphrase in image alt | |
|
||||||
|
| External links present | |
|
||||||
|
| Internal links present | |
|
||||||
|
| Meta description quality | |
|
||||||
|
|
||||||
|
### Readability
|
||||||
|
|
||||||
|
| Check | Status |
|
||||||
|
|-------|--------|
|
||||||
|
| Flesch-Kincaid score | |
|
||||||
|
| Sentence length | |
|
||||||
|
| Passive voice | |
|
||||||
|
| Paragraph length | |
|
||||||
|
| Subheading distribution | |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Post-Optimization
|
||||||
|
|
||||||
|
- [ ] Cleared Nginx cache: `rm -rf /var/cache/ea-nginx/proxy/<account>/*`
|
||||||
|
- [ ] Verified changes render correctly on frontend
|
||||||
|
- [ ] Facebook Sharing Debugger: scraped updated OG tags
|
||||||
|
- [ ] Google Rich Results Test: validated schema
|
||||||
|
- [ ] Search Console: requested re-indexing (optional, for urgent changes)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
_Observations, decisions made, things to revisit:_
|
||||||
@@ -0,0 +1,175 @@
|
|||||||
|
# Site SEO Audit Checklist
|
||||||
|
|
||||||
|
Use this template before starting SEO work on any site. Copy this file and fill it in for the specific site.
|
||||||
|
|
||||||
|
## Site Information
|
||||||
|
|
||||||
|
- **Site URL:**
|
||||||
|
- **cPanel Account:**
|
||||||
|
- **Cache path:** `/var/cache/ea-nginx/proxy/<account>/`
|
||||||
|
- **CMS:** WordPress / Static HTML / Other
|
||||||
|
- **SEO Plugin:** SmartCrawl Free / SmartCrawl Pro / Other / None
|
||||||
|
- **Date of Audit:**
|
||||||
|
- **Auditor:**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. Current State Assessment
|
||||||
|
|
||||||
|
### Indexing
|
||||||
|
|
||||||
|
- [ ] Site is indexed in Google (`site:example.com` returns results)
|
||||||
|
- [ ] Approximate number of indexed pages: ____
|
||||||
|
- [ ] Google Search Console connected and verified
|
||||||
|
- [ ] Any manual actions or security issues in Search Console? ____
|
||||||
|
|
||||||
|
### Existing SEO Setup
|
||||||
|
|
||||||
|
- [ ] SEO plugin installed? Which one? ____
|
||||||
|
- [ ] Title tags customized or default? ____
|
||||||
|
- [ ] Meta descriptions set? How many pages? ____
|
||||||
|
- [ ] Schema markup present? Type(s)? ____
|
||||||
|
- [ ] XML sitemap exists? URL: ____
|
||||||
|
- [ ] Sitemap submitted to Search Console?
|
||||||
|
- [ ] Robots.txt exists and is correct?
|
||||||
|
- [ ] Open Graph tags present?
|
||||||
|
- [ ] Any existing redirects?
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Technical SEO
|
||||||
|
|
||||||
|
### Performance
|
||||||
|
|
||||||
|
- [ ] Page load time (GTmetrix or PageSpeed Insights): ____ seconds
|
||||||
|
- [ ] LCP (Largest Contentful Paint): ____
|
||||||
|
- [ ] INP (Interaction to Next Paint): ____
|
||||||
|
- [ ] CLS (Cumulative Layout Shift): ____
|
||||||
|
- [ ] Mobile-friendly test: Pass / Fail
|
||||||
|
|
||||||
|
### Security & Protocol
|
||||||
|
|
||||||
|
- [ ] HTTPS enabled (no mixed content)
|
||||||
|
- [ ] HTTP → HTTPS redirect working
|
||||||
|
- [ ] www / non-www preference set with redirect
|
||||||
|
- [ ] Trailing slash consistency
|
||||||
|
|
||||||
|
### Crawlability
|
||||||
|
|
||||||
|
- [ ] Robots.txt reviewed (not blocking CSS/JS/important content)
|
||||||
|
- [ ] No accidental `noindex` on important pages
|
||||||
|
- [ ] No orphan pages (pages with zero internal links)
|
||||||
|
- [ ] No broken internal links (404s)
|
||||||
|
- [ ] Canonical tags present and correct
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. On-Page SEO
|
||||||
|
|
||||||
|
### Title Tags
|
||||||
|
|
||||||
|
- [ ] Homepage has custom title tag
|
||||||
|
- [ ] Service pages have custom title tags
|
||||||
|
- [ ] Blog posts have title tags (template or custom)
|
||||||
|
- [ ] Any duplicate title tags? List: ____
|
||||||
|
- [ ] Title tag length (50-60 chars)? ____
|
||||||
|
|
||||||
|
### Meta Descriptions
|
||||||
|
|
||||||
|
- [ ] Homepage has hand-crafted meta description
|
||||||
|
- [ ] Service pages have meta descriptions
|
||||||
|
- [ ] Any pages missing descriptions? Count: ____
|
||||||
|
- [ ] Description length (150-160 chars)? ____
|
||||||
|
|
||||||
|
### Content
|
||||||
|
|
||||||
|
- [ ] Every page has exactly one H1
|
||||||
|
- [ ] Header hierarchy is correct (no skipped levels)
|
||||||
|
- [ ] Images have alt text
|
||||||
|
- [ ] Internal linking structure exists
|
||||||
|
- [ ] Content quality assessment (thin pages? duplicate content?)
|
||||||
|
|
||||||
|
### URLs
|
||||||
|
|
||||||
|
- [ ] URLs are clean (no ?p=123 or parameter junk)
|
||||||
|
- [ ] URLs include keywords where appropriate
|
||||||
|
- [ ] Hyphens used (not underscores)
|
||||||
|
- [ ] Reasonable length
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. Local SEO (If Applicable)
|
||||||
|
|
||||||
|
- [ ] Google Business Profile exists and is verified
|
||||||
|
- [ ] GBP information is complete and accurate
|
||||||
|
- [ ] NAP is consistent across website, GBP, and directories
|
||||||
|
- [ ] LocalBusiness schema on website
|
||||||
|
- [ ] Google Map embedded on contact page
|
||||||
|
- [ ] Reviews: count ____, average rating ____
|
||||||
|
- [ ] Listed in relevant local directories
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. Content Inventory
|
||||||
|
|
||||||
|
List the key pages and their current SEO status:
|
||||||
|
|
||||||
|
| Page | URL | Title Tag | Meta Desc | H1 | Focus KW | Status |
|
||||||
|
|------|-----|-----------|-----------|-----|----------|--------|
|
||||||
|
| Homepage | / | | | | | |
|
||||||
|
| About | /about/ | | | | | |
|
||||||
|
| Contact | /contact/ | | | | | |
|
||||||
|
| Service 1 | | | | | | |
|
||||||
|
| Service 2 | | | | | | |
|
||||||
|
| Blog (if any) | /blog/ | | | | | |
|
||||||
|
|
||||||
|
Status options: Good / Needs Work / Missing / N/A
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. Search Console Quick Wins
|
||||||
|
|
||||||
|
After connecting Search Console, check:
|
||||||
|
|
||||||
|
- [ ] Top queries by impressions (what Google shows the site for)
|
||||||
|
- [ ] Striking distance keywords (positions 8-20)
|
||||||
|
- [ ] Pages with high impressions but low CTR (title/description issue)
|
||||||
|
- [ ] Any crawl errors or indexing issues
|
||||||
|
|
||||||
|
### Striking Distance Keywords Found
|
||||||
|
|
||||||
|
| Keyword | Current Position | Page | Action Needed |
|
||||||
|
|---------|-----------------|------|---------------|
|
||||||
|
| | | | |
|
||||||
|
| | | | |
|
||||||
|
| | | | |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. Priority Actions
|
||||||
|
|
||||||
|
Based on the audit, list the top actions in priority order:
|
||||||
|
|
||||||
|
### Immediate (Do First)
|
||||||
|
|
||||||
|
1.
|
||||||
|
2.
|
||||||
|
3.
|
||||||
|
|
||||||
|
### Soon (This Week)
|
||||||
|
|
||||||
|
1.
|
||||||
|
2.
|
||||||
|
3.
|
||||||
|
|
||||||
|
### Ongoing (Monthly)
|
||||||
|
|
||||||
|
1.
|
||||||
|
2.
|
||||||
|
3.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
_Additional observations, competitor insights, or client-specific considerations:_
|
||||||
Reference in New Issue
Block a user