SEO
How search optimization is handled across WHA — Yoast for meta and sitemaps, Schema Pro for structured data, BrightEdge for recommendations, plus editor and developer practices.
SEO on WHA is a combination of plugins (meta, sitemaps, structured data, recommendations), theme-level semantic markup and editorial discipline. This page covers the stack and the day-to-day practices that keep the site healthy in search.
The SEO stack
| Tool | Plugin | Responsibility |
|---|---|---|
| Yoast SEO | wordpress-seo (Composer) | Meta titles/descriptions, XML sitemaps, canonical URLs, Open Graph / Twitter tags, breadcrumbs. Schema is disabled (see below) |
| Schema Pro | wp-schema-pro (manual) | Rich structured data (Organization, FAQ, service pages, etc.) mapped to post types and fields |
| BrightEdge | brightedge-autopilot plugin + IXF client in the theme | Recommendations and a live server-side content-injection layer — see note below |
| Redirection | redirection + simple-redirect | 301 redirects so URL changes never produce 404s, see Managing Redirects |
Yoast's schema is turned off so it doesn't compete with Schema Pro. When Schema Pro is active, the theme disables Yoast's JSON-LD graph via the wpseo_json_ld_output filter (in yax-plugin-modifications/wordpress-seo/), leaving Yoast to handle meta, Open Graph, sitemaps and breadcrumb markup only. This avoids two plugins emitting overlapping, sometimes conflicting structured data for the same entity.
Structured data comes from two places: the theme injects the high-value entity schema automatically (Physician on providers, MedicalClinic on locations — see Structured data below), and Schema Pro covers everything else you configure in wp-admin (Organization, FAQ, service pages, etc.). Keep Schema Pro mappings off providers and locations so they don't duplicate the theme's Physician/MedicalClinic.
Disabling Yoast's graph also drops its BreadcrumbList and WebSite search-action schema. If breadcrumb rich results or the sitelinks search box matter, confirm Schema Pro (or the theme) supplies them — or override with add_filter( 'yax_disable_yoast_schema', '__return_false' ) to hand schema back to Yoast. Validate either way with Google's Rich Results Test.
BrightEdge is more than a recommendations tool: its IXF client is live. The theme's header.php loads the BrightEdge Instant eXperience Framework client (prod account, remote capsule mode) and runs it in the page head, so BrightEdge can inject content server-side ("capsules") and influence canonicals at render time. Anyone auditing the rendered HTML should know some of it may originate from BrightEdge, not the CMS. Worth confirming what's actively configured there before assuming the markup is all theme-generated.
Per-page SEO (editors)
Every page and post has a Yoast SEO metabox. Fill it in rather than relying on auto-generation:
SEO title and meta description
Write a focused SEO title and meta description for important pages (services, providers, locations and landing pages). Blank fields fall back to auto-generated text, which is usually weaker. Keep titles ~60 characters and descriptions ~155.
One H1 per page
The page title is the H1. Don't add another H1 in the content, use H2/H3 for subheadings. The theme renders the title as the single H1; section components use H2+ (see the heading manager in Developer Reference).
Descriptive alt text
Write meaningful alt text for every content image: describe what's in it, not "photo" or "image." This serves both SEO and accessibility.
Internal linking
Link between related providers, services and life stages where it's natural. It helps users and helps search engines understand the site's structure and topical relationships.
URL and redirect hygiene
- Don't change a published URL without adding a redirect. The Redirection plugin manages 301s; if a slug changes, map the old URL to the new one. See Managing Redirects.
- Keep the URL hierarchy intact.
/providers/is the listing and/providers/{slug}/are detail pages (same for/locations/). This structure is good for SEO and UX; renaming it would break the relationship and force another redirect layer.
Structured data
Structured data (schema.org JSON-LD) powers rich results: the star ratings, addresses and hours that show up right in search. For a medical, multi-location site it's high-leverage, feeding both the rich snippets that lift click-through and the local pack on the map.
The theme injects the important schema automatically in wp_head, with no per-page setup:
| Page | Schema | Includes |
|---|---|---|
| Home | MedicalOrganization | name, URL, logo, sameAs (social profiles), and every location as a department |
| Provider | Physician | name, specialties, AggregateRating and patient reviews, phone, address |
| Location | MedicalClinic | name, PostalAddress, phone, openingHours, GeoCoordinates, parentOrganization |
The provider rating schema is what can surface star ratings in search results, a real click-through lever. The provider AggregateRating comes from Doctor.com patient reviews (synced into the site), not first-party reviews. The ratings aren't ours, and Google decides on its own whether to show review stars at all.
The site-level MedicalOrganization (front page) ties the locations together: each MedicalClinic references it via parentOrganization, and the organization lists every location as a department, so the multi-location group reads as one entity rather than a set of unrelated clinics. Identity comes from site config (name, URL, site icon), with no hardcoded values.
Provider, location and organization schema is already done: automatic, with no upkeep. For anything beyond that (FAQ blocks, service pages or one-off additions), Schema Pro is installed and ready to configure.
How schema sources are split
Three tools can output schema: the theme, Yoast and Schema Pro. Each schema type has a single source, so nothing duplicates:
- The theme is authoritative for the medical entities it emits:
MedicalOrganization,Physician,MedicalClinic. Its versions are the richest (ratings, geo, hours, and the@id+departmentlinks that tie the locations to the organization). - Yoast's schema graph is disabled when Schema Pro is active (see the callout near the top), so Yoast handles meta, Open Graph and sitemaps only.
- Schema Pro keeps everything except the global
Organization. It still emitsWebSite, breadcrumbs, the sitelinks search box, and anything you configure (FAQ, service pages). Only its global Organization is suppressed — viawp_schema_pro_global_schema_enabled— because it would duplicate the theme's richer, linked organization. The theme prints an HTML comment at its Organization so the swap is visible in page source.
Because the theme owns the organization, its logo comes from the Custom Logo (Appearance → Customize → Site Identity → Logo), falling back to the Site Icon. The theme's sameAs covers the social profiles; add Google Business Profile / Healthgrades there when available.
Validate output with Google's Rich Results Test.
Schema opportunities
The entity schema (organization, providers, locations) is in place. A couple of higher-effort additions are still open:
sameAscoverage. The organization links its social profiles (Facebook, Instagram, LinkedIn). Adding Google Business Profile and Healthgrades URLs — on the organization, and per provider where they exist — would strengthen entity disambiguation; those need to be supplied. Doctor.com is a special case: each provider already stores adoctorcom_id, so a profile link is derivable from data we hold — pending confirmation that the platform exposes a public profile URL worth linking.- Author / medical-reviewer schema on health articles. Not implemented — articles carry no
Articleschema withauthor,reviewedByordatePublished/dateModified. For YMYL health content this is one of the higher-value E-E-A-T additions (see content credibility).
Sitemaps and crawlability
- XML sitemaps are generated by Yoast at
/sitemap_index.xml, covering the public post types (providers, locations, services, life stages, news, articles). Submit it in Google Search Console and Bing Webmaster Tools, and confirm in Yoast which types are set indexable. - Robots / noindex: control per-page indexing from the Yoast "Advanced" panel. Utility and protected content should be
noindex.robots.txtis served dynamically by WordPress (there's no static file); Yoast appends the sitemap reference to it. - Health-check and admin paths are excluded from caching and shouldn't be indexed (see Caching and Security).
Indexation and rendering
- Non-production is auto-noindexed. Staging and dev force "discourage search engines" by environment (
SearchVisibilityinyax-common), so only production is crawlable; there's no duplicate staging site to worry about. - Key listings are server-rendered. Provider, location and service listings render server-side in PHP, so they're in the initial HTML and fully crawlable. The Mapbox maps are progressive enhancement layered on top; the content doesn't depend on JavaScript to be indexed.
- Filtering is AJAX, not parameter URLs. The provider listing's filters (location, specialty, language, role) run through the REST API (
wha/v1/providers) and update in place. They don't generate separate?specialty=…URLs, so there's no faceted index-bloat to manage. Canonicals are self-referencing via Yoast. - Multilingual / hreflang. Translation is built in but the language switcher is currently disabled in the nav, so no translated URLs are live today. When enabled, DeepL mode renders server-side, cached translations at distinct
/{lang}/paths with properhreflangandx-defaultalternates; Google Translate mode is client-side and not separately indexed. If multilingual SEO becomes a goal, the DeepL path is the indexable one.
Performance and SEO
Core Web Vitals are a ranking factor. The theme already helps here:
- Static assets are cache-busted and served by Nginx with long cache lifetimes (Caching).
- Images are offloaded to S3 and automatically converted to WebP; upload at ~2× display size, not full resolution.
- Mapbox/Supercluster load only on pages with maps.
Reference
- Event Tracking: measuring what organic traffic does on-site (behavior and conversions). SEO drives traffic; event tracking measures the outcome. They're complementary, not the same layer.
- Editing Basics: content editing guidelines
- Managing Redirects: 301 workflow
- Accessibility: alt text, semantics and a11y that also benefits SEO