Image SEO Optimizer

SEO Scoring System

How each image's 0–100 SEO score is calculated, the seven weighted components, the length tolerance band, and how to tune both.

schedule 3 min read update Updated 3 days ago local_offer Version 1.0.7

Every image in your library carries an SEO score from 0 to 100. The number in the Score column is the weighted sum of seven components, each scored on its own. The defaults follow general image-SEO practice; the weights, the length ranges and the tolerance around them all live on the plugin’s Settings page.

The seven components

Two of the fields, alt text and title, are split into presence (is there a value at all?) and quality (is that value the right length?). The split gives credit for filling a field before anyone gets around to polishing it. Filename has quality only, since an empty filename cannot exist.

Default weights — sum to 100%

Setting Default Description
Alt-text presence 20% Does the image have any non-empty alt attribute? Largest single weight — accessibility and image-SEO both depend on it.
Values: 0–100%
Alt-text quality 15% Length only: the character count and the word count both have to sit inside their range or its tolerance band. Full weight if they do, half if either misses. Keywords are scored separately, under keyword density.
Values: 0–100%
Title presence 15% Is there a meaningful WordPress attachment title? WP's filename-derived default doesn't count.
Values: 0–100%
Title quality 10% Same length-only rule as alt text, against the title's own range and tolerance band. Full weight inside, half outside.
Values: 0–100%
Filename quality 15% One check: is the filename a camera default such as <code>IMG_2034</code>, <code>DSC1234</code> or <code>DCIM_0001</code>? Anything else earns the full weight. Length and format drive the badge and the editor's live circle, not this component.
Values: 0–100%
Keyword density 15% How many of the three fields — alt, title, filename — contain at least one saved keyword. All three earn the full weight, two earn 85%, one earns 50%. No saved keywords means no points here.
Values: 0–100%
Uniqueness 10% Reserved for duplicate-metadata detection. In the free plugin it awards its full weight to every image and reports <em>All metadata is unique</em>, so it acts as a flat 10 points. Set it to 0 and redistribute the weight if you want the score to ignore it.
Values: 0–100%
info

Why split into presence + quality?

Set the alt text of 1,000 images to Product photo and every one of them takes the full 20 points for presence — and half of the 15 for quality, because 13 characters sit well below the 50-character floor. The split rewards filling the field without pretending the result is good.

Tuning the weights

All seven weights are configurable from Image SEO → Settings, in the SEO Configuration & Parameters card. Alt text and title get one card each with a Presence and a Quality input; filename, keyword placement and uniqueness get a single input. Shift the emphasis toward whatever matters on your site — an accessibility-first site can push alt presence up, a product catalog of near-identical shots can do the opposite.

warning

Weights must total exactly 100%

A Total Weight dial sits in the same grid, labelled Must equal 100%, and it tracks every edit live — green at 100, yellow otherwise, with a note telling you how much to add or remove. Save is refused on both sides: the form blocks it, and the AJAX handler returns Total weight must equal 100% if the numbers reach the server anyway.

Length and word-count thresholds

Each weight card carries an Optimal Parameters panel — collapsed by default — with the character and word range for that field, plus the tolerance row described in the next section. The three sets are stored under infyp_scoring_parameters, keyed alt_text, filename and title.

Default thresholds and what the tolerance still accepts

Feature Characters Words Accepted at the default tolerance Recommended
Alt text Room for a full descriptive sentence. 50–125 10–16 42–144 chars, 9–17 words
Title Tighter than alt text; titles are read at a glance. 40–60 6–10 34–69 chars, 5–11 words
Filename Long enough to carry context, short enough to keep URLs readable. 40–60 3–6 34–69 chars, 2–7 words
info

The defaults are reasonable

Tuning the thresholds is usually unnecessary for most sites. They exist for projects with strict house-style rules — a publication with a 35-character title cap, or an accessibility audit that mandates alt text of 60 characters or more.

Above the two range rows sits a checkbox, Auto-link characters and words, on by default since 1.0.3 and stored as auto_link. While it is checked, editing one bound rewrites its counterpart in the form: a character value is divided by an assumed average word length of 6, a word value is multiplied by it. Uncheck it to move all four numbers independently.

info

Auto-link only touches the form

The tooltip reads: When linked, editing one input updates the other proportionally so the verdict stays consistent. It rewrites the visible input before you save and nothing else — it never adjusts stored values on its own, and it leaves the two tolerance inputs alone.

Length tolerance, the play room

A field that lands just outside its range still counts as optimized. Since 1.0.6 every field carries a tolerance band on both sides of the range: inside it, the field keeps the full length credit and the green Optimized badge; outside it, the quality component drops to half its weight and the badge turns into a yellow warning.

The Tolerance row, per field

Setting Default Description
± words 1 Absolute words on each side of the word range. A 3–6 word target at ±1 accepts 2–7. Stored as <code>tolerance_words</code>; the input and the save handler both clamp it to 0–5.
Values: 0–5
± % chars 15 Percent of each character limit, rounded to whole characters and applied per side. A 40–60 character target at 15% accepts 34–69. Stored as <code>tolerance_chars_pct</code>; clamped to 0–50.
Values: 0–50

Both inputs sit in the same Optimal Parameters panel as the ranges, so each field gets its own play room. Set either one to 0 to score that dimension strictly against the range, with no band at all.

info

What the tooltip says

The question mark on the Tolerance row reads: Play room outside the optimal range before a length warning appears. Within it, fields keep the full score. 0 = strict. A value inside the band, but outside the range, also gets its own badge tooltip: Slightly outside the target range — still fine.

The band moves alt-text quality and title quality, the two components scored on length. Filename quality is not length-scored, so the filename tolerance only moves the filename badge and the live circle in the Filename editor — those 15 points stay all-or-nothing on the camera-name check.

warning

Tolerance changes nothing until scores are recalculated

Saving a new tolerance does not rewrite the scores already cached in post meta. The settings page says so in one line — Changes apply as scores are recalculated — so expect the table to keep showing the old numbers until each image is optimized, edited or rescored. The badges in the editors update immediately, because they are computed in the browser.

How the score is calculated

For each image the plugin computes seven sub-scores, each from 0 to its configured weight. Presence is all or nothing. The two quality components pay full weight inside the tolerance band and half outside it. Keyword placement pays 100, 85 or 50 percent for three, two or one field carrying a keyword. The sum is divided by the total weight and rounded — that is the number in the Score column.

That number is cached in the _infyp_seo_score post meta so the table does not recalculate on every refresh, and recomputed when an optimization or a manual edit touches one of the scored fields. The label next to it comes from three thresholds — Optimized at 80, Good at 60, Fair at 40, Poor below that — which developers can move with the infyp_seo_score_thresholds filter.

scoreboard

Modal: SEO Breakdown

Click any image's score to see the full per-component breakdown — and what would have to change to reach 100.

arrow_forward

Was this article helpful?

favorite

Thanks for your feedback!