Skip to content
Menu

Structured data that invents facts about your users

A community site told search engines that 3,939 member profiles shared the same profession, because the code filled in a job title whenever one was missing. Structured data is read as fact, so a guess becomes a false statement.

Person markup on 3,939 profiles

"@type": "Person""name": "member_4821""jobTitle": "the same title for everyone"← inventedafter the fix"jobTitle": left out when unknown

What we found

A community site added Person structured data to its member profiles, to make authorship clearer to Google. It is a good idea. The implementation had one line that was not.

When a member had not filled in a job title, the code filled one in: the same professional title for everyone. Across 3,939 profiles, the site was telling search engines, as a fact, that every member without a title had that profession.

Why it is worse than having no markup

  • Google asks that structured data describe the content truthfully. Markup that does not match reality can cost rich results and, in serious cases, lead to a manual action.
  • AI assistants read structured data as a declaration made by the site. A false value can be repeated as an answer about a real person.
  • The data is about people. Attributing a profession to someone who never declared it is a problem before it is an SEO problem.

The rule: a value you do not know is left out

A fallback value is fine in a page layout, where "Member" under a name is just a label. In structured data, the same fallback becomes a statement. This is the difference, in PHP:

// before: an unknown value becomes a "fact"
$person['jobTitle'] = $title ?: 'Professional';
// after: an unknown value is left out
if ( '' !== $title ) {
	$person['jobTitle'] = $title;
}

Two more things we fixed

  • The SEO plugin was already adding its own Person to the same page, without an @id. Search engines saw two unrelated people. Giving both the same @id (the profile address followed by #author) lets them merge into one.
  • To know who really has a professional role, we used a signal that already existed in the site's data, plus a manual flag for the cases the signal misses. Nothing is inferred from a missing field.

The silent trap

The first corrected version produced no markup at all, and no error. The code looked for a taxonomy by the word used in its web address, which was singular. The internal name was plural. The check returned false and the function quietly stopped.

The internal names are listed at /wp-json/wp/v2/taxonomies. Checking there, instead of trusting the address, found it in minutes.

How to check yours

  • Run three different profiles or author pages through Google's Rich Results Test or the Schema Markup Validator.
  • Compare the values. Identical job titles, descriptions or images for different people are a warning sign.
  • For every property, ask whether the value comes from something the person or the business actually declared. If not, remove it.

Want us to check this on your site?

Get in touch