Accessibility Audit · Fix List
AAAC Wildlife Removal — Dallas
0 / 16
Accessibility Crawl · Fix List

Dallas accessibility issues & fixes

Every axe-core violation surfaced by the accessibility crawl, mapped to the exact theme file that causes it and paired with an implementation-ready fix. For Gordon — owns aaaclocaltheme.

Site: dallas.aaacwildliferemoval.com Theme: aaaclocaltheme (shared across the AAAC franchise network) Crawl: axe-core 4.10, 2026-07-16 Colours & markup re-verified live: 2026-07-21
83,751
Violation instances
933
Pages crawled
10
Fixes clear ~98% of instances

Every indexable page carries an identical set of violations. Identical counts across 933 pages is the fingerprint of a shared-theme problem, not a content problem — the theme is aaaclocaltheme, and 83,751 instances collapse to about ten edits in header.php, footer.php, the sidebar partial, and style-a.css / override-a.css.

37% of the raw count is the WCAG AAA contrast rule and should not be fixed — see the Ignore section below. The number that matters is not 83,751.

Start here — four things before you open a file

  1. One theme fix covers the whole network. aaaclocaltheme is shared, and Fort Worth, Collin County and TX Gulf Coast carry the identical violations. Every fix below propagates to all of them — this is a network job, not a Dallas job.
  2. Read the Ignore section first. 34,396 of the 83,751 instances (41%) are not work. WCAG AAA contrast is not the target for a commercial site — AA is.
  3. ⚠️ Do not global-replace #FBA52C. The same class fails at 1.93:1 on the light page background and passes at 8.14:1 on the dark header. A find-and-replace fixes the links and breaks the header phone number. Scoped CSS is in FIX-5.
  4. Suggested order. FIX-1 → FIX-4 are four markup edits in header.php and the partials; they clear every Critical / WCAG-A violation on the site. Then FIX-5 → FIX-7 are five hex values in style-a.css and clear 56% of the AA contrast failures. Then FIX-8, then P2/P3.

This is not the ranking recovery. Accessibility did not cause the Dallas traffic drop — these are correctness and ADA-exposure fixes with a modest usability upside. Worth doing, and worth doing once for the whole network, but don't expect rankings to move.

IGNORE

Read this before you start

3 items

34,396 of the 83,751 instances (41%) are not work. These are flagged correctly by the crawler and left visible on purpose, so nobody rediscovers them next quarter and "fixes" something that isn't broken.

WCAG 2.0 AAA · Serious · Do not fix
IGN-1 — WCAG AAA colour contrast
Rule
Text Requires Higher Color Contrast Ratio (color-contrast-enhanced) · WCAG 2.0 AAA · Serious · 30,659 instances · 933 pages
Why leave it
AAA is not the compliance target for a commercial site — AA is. This rule is flagged on ordinary body copy (.wp-block-paragraph at every nth-child, h4, breadcrumb span[property="name"]). Meeting AAA would mean redesigning every paragraph on the site for a standard almost nobody adopts. The AA version of the same rule is in scope and is handled in P1.
Instances30,659 Pages933 content
Best Practice · Moderate
IGN-2 — All Page Content Must Be Contained By Landmarks
Rule
region · Best Practice (not WCAG) · Moderate · 2,885 instances · 933 pages
Why leave it
Wrapping every stray div in <main>/<section> is real polish but it is not a conformance failure and touches a lot of template. Park it.
Instances2,885 Pages933 content
Best Practice · Moderate
IGN-3 — Heading Levels Should Only Increase By One
Rule
heading-order · Best Practice · Moderate · 852 instances · 846 pages
Why leave it (mostly)
836 of the 852 are the single footer <h4> "AAAC Wildlife Removal of Dallas", which follows the page h1/h2 with no h3 between. If you're already in footer.php for FIX-7, change that <h4> to <h2> and the whole thing clears — otherwise ignore.
Instances852 Pages846 footer.php
Leave these visible and labelled IGNORE on purpose, so nobody rediscovers them next quarter and "fixes" them.
P0

Critical — WCAG 2.0 A, breaks screen-reader navigation

4 items

Four markup edits in header.php and the sidebar partial clear every Critical and WCAG-A violation on the site.

Critical + Serious · clears 2 rules at once
FIX-1 — Header logo has no alt, and it is the only content of the site's home link
Issue
933 pages. Rules cleared: Images Require Alternate Text (image-alt, WCAG 2.0 A, Critical) and Links Require Discernible Text (link-name, WCAG 2.0 A, Serious — selector .site-branding > a, 933 instances). This is the first link on every page, and a screen reader currently announces it as the image filename — "Logo-1.png." Fixing one attribute fixes both rules.
Current — header.php (.site-branding)
<div class="flex flex-row site-branding">
  <a href="https://dallas.aaacwildliferemoval.com"><img class="object-contain h-20" src="https://dallas.aaacwildliferemoval.com/wp-content/uploads/sites/61/2020/02/Logo-1.png" /></a>
</div>
Fix
<div class="flex flex-row site-branding">
  <a href="https://dallas.aaacwildliferemoval.com"><img class="object-contain h-20" src="https://dallas.aaacwildliferemoval.com/wp-content/uploads/sites/61/2020/02/Logo-1.png" alt="AAAC Wildlife Removal of Dallas — home" /></a>
</div>
Pages933 Rulesimage-alt, link-name header.php
Critical
FIX-2 — Mobile menu buttons are icon-only with no accessible name
Issue
933 pages · 933 instances. Rule: Buttons Require Discernible Text (button-name, WCAG 2.0 A). Selectors .pb-4 > button (930) plus .menu-toggle[aria-controls="primary-menu"] (3). A Font Awesome <i> has no text content, so the button is empty to assistive tech.
Current — header.php (open + close)
<button class="text-4xl menu-toggle lg:hidden" aria-controls="primary-menu" aria-expanded="false"><i class="fas fa-bars"></i></button>
<button class="absolute top-0 right-0 self-start p-5 pt-3 text-3xl menu-toggle lg:hidden"><i class="fas fa-times"></i></button>
Fix
<button class="text-4xl menu-toggle lg:hidden" aria-controls="primary-menu" aria-expanded="false" aria-label="Open menu"><i class="fas fa-bars" aria-hidden="true"></i></button>
<button class="absolute top-0 right-0 self-start p-5 pt-3 text-3xl menu-toggle lg:hidden" aria-label="Close menu"><i class="fas fa-times" aria-hidden="true"></i></button>
Note: aria-hidden="true" on the icon is belt-and-braces once the label is there.
Pages933 Instances933 Rulebutton-name header.php
Serious
FIX-3 — "Get a quote" envelope link has no text, and carries copy-pasted menu ARIA
Issue
926 pages (+185 sidebar). Rule: Links Require Discernible Text (link-name, WCAG 2.0 A). Selectors .lg\:hidden.text-4xl[aria-controls="primary-menu"]:nth-child(3) (926) and .px-3 (185).
Current — header.php, sidebar partial
<a href="https://dallas.aaacwildliferemoval.com/get-a-quote/" class="text-4xl lg:hidden" aria-controls="primary-menu" aria-expanded="false"><i class="far fa-envelope"></i></a>
Fix
<a href="https://dallas.aaacwildliferemoval.com/get-a-quote/" class="text-4xl lg:hidden" aria-label="Get a quote"><i class="far fa-envelope" aria-hidden="true"></i></a>
Two things here. The missing name is the violation. But also drop aria-controls="primary-menu" and aria-expanded="false" — this is a plain navigation link, not a disclosure widget. Those attributes were copied from the menu button and actively lie to assistive tech about what the element does.
Pages926 + 185 Rulelink-name header.php sidebar
Critical
FIX-4 — Remaining template images missing alt
Issue
933 pages · 4,092 instances across 24 selectors. Rule: Images Require Alternate Text (image-alt, WCAG 2.0 A). Files: header.php, sidebar partial, page templates.
ImageSelectorPagesalt to add
Logo-1.png — header logo.object-contain, .h-20933covered by FIX-1
swoosh.svg — decorative flourish.bottom-0, .absolute.bottom-0928alt=""
largeOval.svg — decorative shape.relative > .absolute.top-0928alt=""
Red-Head.png — decorative illustration.lg\:self-end928alt=""
marvin-sturgeon.jpg — owner photo.rounded-t.rounded-bl-xl~748alt="Marvin Sturgeon, AAAC Wildlife Removal of Dallas"
Ladder-Safety-Certified.png.h-24.mb-1.object-contain:nth-child(1)184alt="Ladder Safety Certified"
home-advisor.png:nth-child(2)184alt="HomeAdvisor screened and approved"
bird-b-gone-authorized-installer-web-graphic.jpg:nth-child(3)184alt="Bird-B-Gone authorized installer"
npma.jpg:nth-child(4)184alt="National Pest Management Association member"
pct-top-100-badge-web@2x.png:nth-child(5)184alt="PCT Top 100 pest control company"
310x310_white.jpg.px-3 > img185alt="" if decorative, otherwise describe it
The rule that matters: decorative images need alt="" — an empty alt, not a missing one. A missing alt makes a screen reader read the filename out loud; an empty alt makes it skip the image silently. That difference is the entire fix for six of these.
Pages933 Instances4,092 Ruleimage-alt header.php sidebar content
P1

Serious — WCAG 2.0 AA colour contrast

4 items

The AA contrast rule looks like the biggest problem on the site at 41,235 instances. It is five hex values in style-a.css. FIX-5 alone is 47% of it.

WCAG 2.0 AA · Serious · 47% of all AA contrast failures
FIX-5 — .text-yellow fails contrast badly
Issue
19,445 instances (47% of all AA contrast failures) · 927 pages. File: style-a.css / override-a.css. Current: .text-yellow { color: rgba(251,165,44,var(--tw-text-opacity)) !important }. This is the worst ratio on the site — it fails by more than half.
Current #FBA52C on #FCFBFB 1.93:1 ✗ AA
New #A85F00 on #FCFBFB 4.73:1 ✓ AA
More headroom: #9C5700 = 5.38:1 #8A4F00 = 6.36:1
Do not global-replace the hex. .text-yellow is also the header phone number sitting on .bg-darkgray #241F20, where it scores 8.14:1 ✓ and passes comfortably. Darkening it globally would wreck the header — scope the override instead.
Where the volume is — Cities/Towns footer link grid (20 links × 925 pages)
<div class="mt-1 w-1/2"><a class="text-yellow" href="https://dallas.aaacwildliferemoval.com/service-area/sunnyvale/">Sunnyvale</a></div>
Fix — scoped, not global
/* Yellow stays the brand colour on dark backgrounds and for fills/borders. */
/* Only yellow TEXT on light backgrounds needs to change. */
.text-yellow { color: rgba(251,165,44,var(--tw-text-opacity)) !important; }   /* unchanged */

/* New: link colour for yellow text on the light page background */
.text-yellow-link,
.mt-1.w-1\/2 > .text-yellow,
.entry-content .text-yellow { color: #A85F00 !important; }                    /* 4.73:1 ✓ */
Hover #FFFFFF on #FBA52C 2.0:1 ✗ AA
Same family, same fix: .hover\:bg-yellow.hover\:text-white (11 selectors × 94 pages) puts white on #FBA52C on hover. Use #241F20 for the hover label instead of white.
Pages927 Instances19,445 style-a.css
WCAG 2.0 AA · Serious
FIX-6 — Phone CTA button: white on orange
Issue
2,231 instances · 931 pages. File: style-a.css. Current: .btn-yellow { background-color: rgba(225,143,0); color: rgba(255,255,255) }. Fails AA at normal and large text size. Selectors: .align-top.font-phone.text-2xl, .align-top.capitalize.text-2xl, .phone\:text-2xl.
Current #FFFFFF on #E18F00 2.58:1 ✗ AA
Two ways out — recommending B:
A #FFFFFF on #8A4F00 6.36:1 ✓ AA Darken the button — biggest visual change, CTA stops looking yellow
B #241F20 on #E18F00 6.40:1 ✓ AA Recommended
Fix — Option B (keeps the brand background)
.btn-yellow { background-color: #E18F00; color: #241F20; }
This is the site's primary CTA on 931 pages — option B preserves the brand and passes with room to spare.
Pages931 Instances2,231 style-a.css
WCAG 2.0 AA · Serious · two colour values
FIX-7 — Footer: two colour values
Issue
933 + 930 pages. Files: style-a.css, footer.php.
7a — footer address · selector .lg\:text-right.text-midgray
Current #707070 on #000000 4.24:1 ✗ AA misses 4.5:1 by a hair
.text-midgray { color: #8C8C8C !important; }   /* 6.25:1 on #000 ✓ */
7b — footer paragraph · selector .site-footer.bg-darkgray .text-lightgray
Current #6B6A68 on #241F20 3.01:1 ✗ AA
.text-lightgray is reused on light backgrounds (the h1 and body copy) where it scores 5.23:1 ✓ and passes. Scope the override to the footer — don't change the global value.
.site-footer .text-lightgray,
.site-footer p { color: #B8B6B2 !important; }   /* 8.03:1 on #241F20 ✓ */
While you're in footer.php: changing the footer <h4> to <h2> also clears IGN-3's 836 instances.
Pages933 + 930 style-a.css footer.php
WCAG 2.0 A · Serious
FIX-8 — iframes have no title
Issue
1,023 instances · 925 pages. Rule: Frames Require Title Attribute (frame-title, WCAG 2.0 A).
iframeSelectorPagestitle to add
Google Maps embediframe[width="600"], iframe[height="450"]697 + 225title="Google Map of the AAAC Wildlife Removal of Dallas service area"
RSS feed widget (convex.site/feeds/…)iframe[height="18"]45title="AAAC Wildlife Removal news feed"
SoundCloud playeriframe[height="300"]40title="AAAC Wildlife Removal audio player"
othersiframe[width="100%"], [frameborder="no"], [allowfullscreen]16describe the embedded content
Already correct — leave alone: the YouTube embed ships title="YouTube video player" and does not appear in this list.
Note for Gordon: the 18px convex.site feed is the network feed component, so that title fix belongs upstream in whatever generates the embed, not in the Dallas theme.
Pages925 Instances1,023 Ruleframe-title sidebar content
P2

Deprioritised — real, but on pages that don't earn

1 item

Genuine violations concentrated on pages that are already, correctly, noindex.

WCAG 2.0 AA · 28% of AA contrast
FIX-9 — Blog archive meta contrast
Issue
11,916 instances (28% of AA contrast) · 318 pages. Current: .text-gray-400 { color: rgba(156,163,175) }. Appears in .entry-meta: .posted-on, .byline, .cat-links, .tags-links, a[rel="tag"], .entry-date.
Current #9CA3AF on #FFFFFF 2.54:1 ✗ AA
New #6B7280 on #FFFFFF 4.83:1 ✓ AA
Why it's P2 despite being 28% of the count: the 318 affected pages are exactly the blog tag (223), category (53) and author (42) archives — the same 318 pages that are already, correctly, noindex. They earn no search traffic. The instance count is inflated by tag lists, not by importance. Still worth doing — it's one value, and the same class styles the meta line on real blog posts.
Fix
.text-gray-400 { color: #6B7280 !important; }   /* 4.83:1 on white ✓ */
Pages318 Instances11,916 style-a.css content
P3

One-off page fixes

7 items · 14 instances total

Isolated, page-specific issues — not template-level, so each needs its own edit.

Best Practice · Moderate
Page has no <h1>
Pages
/get-a-quote/, /get-a-quote (both URL forms), /location-search/
Fix
Add an <h1>. Cross-reference: /get-a-quote/ is the most-linked page on the site (3,554 inlinks) with 57 words and no H1 — it's already P1 on the crawl fix list.
content
Minor
Empty <h1>
Page
/deer/
Fix
The <h1> renders empty. /deer/ is also one of the three orphaned animal pages on the crawl list — fix both together.
content
Minor
Empty <h2> × 5
Page
/blog/raccoons/what-do-raccoons-look-like/
Fix
Five empty h2 elements, nth-child(55–59) — almost certainly stray markup from an editor paste. Delete them.
content
Minor
Empty <h2>
Page
/service-area/cedar-hill/squirrel-removal/
Fix
One empty h2:nth-child(33). Delete.
content
Best Practice · Moderate
No <main> landmark
Pages
/, /location-search/
Fix
Wrap the primary content region in <main>.
content
No items match these filters.

Implementation notes

1. Files touched: header.php (FIX-1, 2, 3), footer.php (FIX-7b, IGN-3), sidebar/page partials (FIX-3, FIX-4), style-a.css + override-a.css (FIX-5, 6, 7a, 9), individual pages (P3).

2. This is a network-wide theme. aaaclocaltheme is the shared AAAC theme — every one of these fixes propagates to every franchise site. Fort Worth, Collin County and TX Gulf Coast have the identical violations. Worth doing once, upstream.

3. Order of work: FIX-1 → FIX-2 → FIX-3 → FIX-4 (four markup edits, clears every Critical/WCAG-A violation on the site), then FIX-5 → FIX-6 → FIX-7 (three CSS blocks, clears 56% of the AA contrast failures), then FIX-8, then P2/P3.

4. After the fixes, re-crawl with Accessibility enabled to confirm. Note that a missing alt and an alt="" produce different results — don't let anyone "fix" the decorative images by deleting the img tags or writing descriptive alt text for a swoosh.

5. Not a ranking fix. Accessibility is not why the Dallas rankings dropped. These are correctness and legal-exposure fixes with a modest usability upside — worth doing, and worth doing on the whole network, but they are not the recovery.