commit 6eff12e8acff41e6bbf5cded96968a71cad5c923 Author: craig Date: Fri Apr 17 13:32:17 2026 -0500 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) diff --git a/README.md b/README.md new file mode 100644 index 0000000..c1aa077 --- /dev/null +++ b/README.md @@ -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 diff --git a/seo-strategy/content-strategy.md b/seo-strategy/content-strategy.md new file mode 100644 index 0000000..2801079 --- /dev/null +++ b/seo-strategy/content-strategy.md @@ -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. diff --git a/seo-strategy/keyword-research.md b/seo-strategy/keyword-research.md new file mode 100644 index 0000000..7aa19d8 --- /dev/null +++ b/seo-strategy/keyword-research.md @@ -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. diff --git a/seo-strategy/keyword-selection-by-page.md b/seo-strategy/keyword-selection-by-page.md new file mode 100644 index 0000000..9567334 --- /dev/null +++ b/seo-strategy/keyword-selection-by-page.md @@ -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. | diff --git a/seo-strategy/local-seo.md b/seo-strategy/local-seo.md new file mode 100644 index 0000000..ca5f794 --- /dev/null +++ b/seo-strategy/local-seo.md @@ -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 diff --git a/seo-strategy/on-page-optimization.md b/seo-strategy/on-page-optimization.md new file mode 100644 index 0000000..1f37cbb --- /dev/null +++ b/seo-strategy/on-page-optimization.md @@ -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 `` or large font size is NOT the same as a proper `

`. 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 diff --git a/seo-strategy/technical-seo.md b/seo-strategy/technical-seo.md new file mode 100644 index 0000000..f5a0cca --- /dev/null +++ b/seo-strategy/technical-seo.md @@ -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//*` + +## 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: `` +- [ ] 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: `` + +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 diff --git a/smartcrawl/breadcrumbs.md b/smartcrawl/breadcrumbs.md new file mode 100644 index 0000000..0fc86bf --- /dev/null +++ b/smartcrawl/breadcrumbs.md @@ -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=""] +``` + +The `before` and `after` parameters wrap the breadcrumb trail with custom HTML. + +### Method 3: PHP (Theme Template) + +```php + +``` + +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 diff --git a/smartcrawl/configuration.md b/smartcrawl/configuration.md new file mode 100644 index 0000000..c912d1b --- /dev/null +++ b/smartcrawl/configuration.md @@ -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 diff --git a/smartcrawl/content-analysis.md b/smartcrawl/content-analysis.md new file mode 100644 index 0000000..eecca6d --- /dev/null +++ b/smartcrawl/content-analysis.md @@ -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 diff --git a/smartcrawl/hooks-and-filters.md b/smartcrawl/hooks-and-filters.md new file mode 100644 index 0000000..018d86b --- /dev/null +++ b/smartcrawl/hooks-and-filters.md @@ -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 diff --git a/smartcrawl/known-issues.md b/smartcrawl/known-issues.md new file mode 100644 index 0000000..7cc58fb --- /dev/null +++ b/smartcrawl/known-issues.md @@ -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//* +``` + +### 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) diff --git a/smartcrawl/overview.md b/smartcrawl/overview.md new file mode 100644 index 0000000..4659877 --- /dev/null +++ b/smartcrawl/overview.md @@ -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. diff --git a/smartcrawl/redirects.md b/smartcrawl/redirects.md new file mode 100644 index 0000000..348567b --- /dev/null +++ b/smartcrawl/redirects.md @@ -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 diff --git a/smartcrawl/schema-markup.md b/smartcrawl/schema-markup.md new file mode 100644 index 0000000..732e7c3 --- /dev/null +++ b/smartcrawl/schema-markup.md @@ -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 | diff --git a/smartcrawl/sitemaps.md b/smartcrawl/sitemaps.md new file mode 100644 index 0000000..79d3a72 --- /dev/null +++ b/smartcrawl/sitemaps.md @@ -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 | diff --git a/smartcrawl/social-og-twitter.md b/smartcrawl/social-og-twitter.md new file mode 100644 index 0000000..103b14e --- /dev/null +++ b/smartcrawl/social-og-twitter.md @@ -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 + + + + + + +``` + +## 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 + +``` + +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. | diff --git a/smartcrawl/titles-and-meta.md b/smartcrawl/titles-and-meta.md new file mode 100644 index 0000000..223f90a --- /dev/null +++ b/smartcrawl/titles-and-meta.md @@ -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.** diff --git a/templates/keyword-research-template.md b/templates/keyword-research-template.md new file mode 100644 index 0000000..9251bba --- /dev/null +++ b/templates/keyword-research-template.md @@ -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:_ diff --git a/templates/page-optimization-template.md b/templates/page-optimization-template.md new file mode 100644 index 0000000..5330cc4 --- /dev/null +++ b/templates/page-optimization-template.md @@ -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//*` +- [ ] 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:_ diff --git a/templates/site-audit-checklist.md b/templates/site-audit-checklist.md new file mode 100644 index 0000000..dc186cb --- /dev/null +++ b/templates/site-audit-checklist.md @@ -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//` +- **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:_