Job posting schema is a block of JSON-LD in a job page’s HTML that tells Google the job’s title, employer, location, pay and deadline in a form it can read directly. On WordPress, you either write it by hand, use an SEO plugin that supports it, or run a job board plugin that outputs it for you. WP Career Board does the last one: every open job gets a JobPosting block, built from the same data the REST API returns.
One caution up front. Markup is a requirement for being considered, not a promise. Nobody can guarantee a job appears in Google for Jobs, and we don’t claim to. We also don’t claim the output is validated, so run your own pages through Google’s tools, covered below.
What Google for Jobs reads
Google’s rules live in its job posting structured data documentation. Read it once. The essentials: each job needs its own page, the markup has to match what’s visible on that page, and the required properties have to be present.
The big ones are title, description, datePosted, hiringOrganization and jobLocation. Recommended ones include validThrough, employmentType, baseSalary and directApply. The schema vocabulary itself is defined at schema.org/JobPosting.
The fields WP Career Board outputs
For each open job, the plugin writes:
- title and description from the job itself.
- datePosted from the publish date.
- validThrough from the job’s closing date, as a full date-time at the end of that day in your site’s timezone. No closing date, no
validThrough. - employmentType, mapped from your job types: full-time, part-time, contract and freelance (both as contractor), internship, temporary, volunteer and per-diem.
- hiringOrganization, from the linked company page (name, URL, logo), or the company name, or your site name if neither exists.
- identifier, using the job’s ID.
- directApply, set to true when candidates apply on your site, and false when the job points to an external apply URL.
- url and jobLocation.
- baseSalary, when a salary is entered: a currency, a single value or a min and max range, and a unit of hour, month or year.
Company pages get their own Organization markup too.
Remote jobs and salary
Remote is handled with jobLocationType set to TELECOMMUTE. If you’ve set a default country (Settings > Jobs, or derived from your site’s locale), the plugin adds it as an applicantLocationRequirements value so Google knows who can apply.
Salary needs a real number. If a job has no salary, the plugin leaves baseSalary out rather than printing an empty one. If you want to add pay transparency, fill it in on the job; it’s one of the few fields job seekers actually filter on.
Why a job gets left out
This is where owners lose time. WP Career Board deliberately outputs no JobPosting for two situations:
- The job has ended. A closed or expired job keeps its page, but the plugin stops marking it up as an open job, since Google asks you to remove expired postings.
- There’s no place to work. Google rejects a posting with no location unless it’s remote, so a job with no location and no Remote option is left out. The Jobs list flags these so you can fix them.
The Require a location setting under Settings > Jobs stops anyone posting a non-remote job without one, which prevents the second problem at the source. The Google for Jobs toggle in the same place turns the whole output on or off. It stays on alongside Yoast SEO and Rank Math, which don’t add job markup for this post type, so turn it off only if another plugin already adds it. Developers can also adjust or drop a job’s markup with the wcb_job_posting_schema filter.
What to put in the job so the markup is good
The plugin can only output what you enter, so the quality of the markup follows the quality of the job. A few habits make the difference.
Set a closing date on every job. Without one there’s no validThrough, and a posting that never expires is the kind Google tells you to avoid. Pick the job type honestly, since it feeds employmentType directly. Enter pay as a number with the right period (hourly, monthly or yearly), because “competitive” can’t be turned into a salary range.
For remote roles, tick Remote rather than typing “Remote” into the location box. The plugin treats the reserved Remote term as the remote flag, not as a place called Remote, and that’s what produces the TELECOMMUTE value. If a job is open to one country only, set your default country so that requirement is stated.
On the employer side, a company page with a logo and website gives the hiringOrganization block more to work with than a bare name.
Check your own markup
Open a published job, then test it two ways. Paste the URL into Google’s Rich Results Test, and read the structured data report in Search Console once Google has crawled the page. Fix warnings against the fields above, not against a guess.
Remember the markup is only half of it. Google also needs to crawl and index the page, and the visible job has to read like a real posting. A well-written description helps there, see our guide to writing a job description.
Common mistakes on a WordPress job board
Most schema trouble isn’t the markup, it’s the job behind it. Three patterns come up again and again.
The first is stale jobs. If filled roles stay live with no deadline, Google ends up crawling pages that describe jobs that no longer exist. Closing the job in the board, rather than leaving it open, is the fix, and the plugin stops marking it up once it ends.
The second is mismatched content. Google wants the structured data to agree with what a visitor sees. Because the markup is built from the same job data as the page and the REST API, the two stay in step as long as you don’t hide the salary or location on the page while entering it in the data.
The third is duplicate markup. If you run another plugin that also prints JobPosting, you’ll have two blocks for one job. Pick one source, and switch the Google for Jobs toggle off if it isn’t this plugin.
Where this fits
The structured data is part of the free plugin, not a paid extra. For the wider picture, see the WordPress job board plugin overview, the public job board feature, and pricing for what Free and Pro each cover. Moving from another plugin? The guide to migrating from WP Job Manager covers that.