In this article
Overview
The JobRelay Connector can add Google for Jobs markup to every job JobRelay sends to your site, so your jobs can appear in Google’s job search results. It is off by default and you turn it on with one setting.
Google for Jobs reads a block of structured data (JobPosting markup in JSON-LD format) from each job page. When the setting is on, the plugin builds that block from the job data JobRelay sent and adds it to the <head> of each single job page. You can find it in your page source by searching for jobrelay-job-schema.
The plugin only adds markup to jobs that came through JobRelay and are live. It also checks each job has everything Google requires, and shows you the result for every job in the WordPress admin.
Turning it on
Go to Settings > JobRelay Settings, tick Output Google for Jobs markup and save.
Leave it unticked if your job board already outputs Google for Jobs markup, for example WP Job Manager. Two sets of markup on one page can confuse Google. If you would rather use JobRelay’s markup, turn off your job board’s markup first (see Turning off other plugins’ Google for Jobs output below).
Default Hiring Organisation
Google needs the name of the organisation hiring for each job. Many providers don’t send a company name, so three optional settings sit under the toggle:
| Setting | Used for | If left empty |
|---|---|---|
| Default Hiring Organisation Name | The organisation name | Your site name |
| Default Hiring Organisation Website | The organisation website | Your site URL |
| Default Hiring Organisation Logo URL | The organisation logo | Your site icon |
These are only used when a job arrives without a company name. When a job does send one, the plugin uses that name with the job’s own website and logo, never your defaults. That stops a client company being shown with your agency’s logo.
We recommend filling in the name at least, because a site name often includes a tagline or the word “Jobs”.
Where the data comes from
The markup is built from the full job data JobRelay sent, not from your field mappings, so it works whichever fields you have mapped.
| Google field | Required? | Where it comes from |
|---|---|---|
| Title | Required | The job’s post title |
| Description | Required | The job’s post content |
| Date posted | Required | The date the job was published |
| Hiring organisation | Required | The job’s company name, or your Default Hiring Organisation settings |
| Location | Required | The job’s geocoded town, region, postcode and country. Bullhorn jobs fall back to the city, state and country Bullhorn sends |
| Remote jobs | Instead of location | Jobs with a working arrangement of “Remote” (or Workable’s telecommuting flag) are marked as remote, with the country applicants must be in. Hybrid jobs are not marked as remote |
| Closing date | Required when the job has one | The job’s expiry date |
| Salary | Recommended | Salary from and to, currency and pay period. Only included when all three are known and the salary isn’t hidden |
| Employment type | Recommended | The job type, such as Permanent, Full Time, Contract or Temp |
| Identifier | Recommended | The job reference |
What each provider sends
| Provider | Company name | Location | Salary |
|---|---|---|---|
| Broadbean, idibu, LogicMelon | When the recruiter fills it in | Geocoded | Full |
| JobAdder | Not sent | Geocoded, unless Prevent Geo Locating is on | Full |
| Loxo | Sent | Geocoded | Full |
| Workable | Not sent | Geocoded | No pay period, so not included |
| Bullhorn | Not sent | Geocoded, or Bullhorn’s own city, state and country | One figure only, so not included |
| Spott and XML feeds | Not sent | Not geocoded, so jobs may show a warning | Depends on the feed |
Where a provider doesn’t send a company name, your Default Hiring Organisation settings are used.
When markup is not output
A job gets no markup in two kinds of case. Some are expected, because Google says those jobs shouldn’t carry markup. Others are problems, where a live job is missing something Google requires. Broken markup is flagged in Google Search Console, so the plugin leaves it out rather than output something invalid.
| Reason shown | Kind | What to do |
|---|---|---|
| The job was not sent by JobRelay. | Expected | Nothing. Only JobRelay jobs get markup |
| The job is not published. | Expected | Nothing. Drafts and private jobs never get markup |
| The job is password protected. | Expected | Nothing. Google can’t read protected pages |
| The job has been filled. | Expected | Nothing. Applies to WP Job Manager’s Filled setting |
| The job expired on [date]. | Expected | Nothing, or resend the job with a later expiry date if it is still open |
| The job schema has been removed by a filter. | Expected | A developer has turned markup off for this job in code |
| The job has no title. | Problem | Add a title, or resend the job with one |
| The job has no description. | Problem | Add a description, or resend the job with one |
| The job location has no country. Check the job was geocoded. | Problem | Make sure the job is sent with a location JobRelay can geocode |
| The job location has a country but no town, city or region. | Problem | Send a more specific location, such as a town |
| The job has no location. | Problem | Send a location, or mark the job as Remote |
Jobs sent before version 1.4.2 of the plugin (August 2024) don’t have the stored job data the markup is built from. They show as not sent by JobRelay until JobRelay sends them again.
Status icons
Once the setting is ticked, every job shows one of three icons, so you can see at a glance which jobs Google can read. The icons use the same checks as the job page itself, so they always match what is output.
| Icon | Meaning | What to do |
|---|---|---|
| Green tick | Google for Jobs markup will be output | Nothing |
| Amber warning triangle | The job should have markup but is missing something Google requires | Hover to see what is missing, then fix it (see the Problem rows above) |
| Red X | No markup by design, for example the job is expired, filled, unpublished or wasn’t sent by JobRelay | Usually nothing. Hover to see why |
In the job list
A Google for Jobs column appears on your jobs screen, after your job board’s own columns. Hover over an icon to see the reason in a tooltip.
On the job edit screen
The same status sits at the top of the JobRelay Data box, with every reason listed underneath. It only shows on jobs JobRelay sent.
If Hide External Jobs is ticked in your JobRelay settings, JobRelay jobs don’t appear in the job list or editor, so you won’t see their icons. The markup is still output on the job pages.
Turning off other plugins’ Google for Jobs output
If your job board plugin already outputs Google for Jobs markup and you want to use JobRelay’s instead, turn the job board’s markup off first, then tick Output Google for Jobs markup. Otherwise each job page will have two sets of markup.
Most plugins have no setting for this, so you add a short code snippet instead. Put it in your child theme’s functions.php file or a code snippets plugin, never in the job board plugin itself, where an update would remove it. After adding a snippet, check one job page with the Rich Results Test and make sure it shows only one Job posting.
| Plugin | How to turn its markup off |
|---|---|
| WP Job Manager (and themes built on it, such as Jobify, Cariera and WorkScout) | Code snippet |
| JobBoardWP | Setting |
| Matador Jobs | Setting in Pro, code snippet in Lite |
| WP Job Openings | Code snippet |
| WP Job Portal | Code snippet |
| Job Postings | Code snippet |
| WP Job Board Pro | Code snippet |
| Rank Math | Remove the Job Posting schema, or a code snippet |
| All in One SEO | Remove the Job Posting schema |
| Simple Job Board | Nothing to do in the free plugin |
| Yoast SEO | Nothing to do |
WP Job Manager
WP Job Manager has no setting for its markup. Add this snippet:
add_filter( 'wpjm_output_job_listing_structured_data', '__return_false' );
This also covers themes built on WP Job Manager, such as Jobify, Cariera and WorkScout. Source
JobBoardWP
Go to JobBoardWP > Settings > General, tick Disable Google structured data and save. Source
Matador Jobs
In Matador Jobs Pro, go to Matador > Settings > Job Listings and turn off Add Structured Data. In Matador Jobs Lite that setting is locked on, so add this snippet instead:
add_action( 'wp', function () {
remove_action( 'wp_head', array( 'matador\Job_Listing', 'jsonld' ), 5 );
} );
WP Job Openings
add_filter( 'awsm_job_structured_data', '__return_empty_string' );
WP Job Portal
add_action( 'wp', function () {
remove_action( 'wp_head', 'wpjobportal_job_posting_structured' );
} );
Job Postings
add_filter( 'job-postings/disable_json_ld', '__return_true' );
This does not work if the plugin’s schema option is set to use Yoast SEO, so set it back to the default first. Plugin page
WP Job Board Pro
Used by themes such as Superio.
add_action( 'init', function () {
remove_action( 'wp_footer', array( 'WP_Job_Board_Pro_Structured_Data', 'output_structured_data' ) );
}, 20 );
Rank Math
Rank Math only outputs Job Posting markup if a Job Posting schema has been added to your jobs, either on each job or as the default schema for the job post type. Remove it there. If you can’t, this snippet removes Job Posting markup from Rank Math’s output and leaves the rest:
add_filter( 'rank_math/json_ld', function ( $data ) {
foreach ( $data as $key => $entity ) {
if ( is_array( $entity ) && isset( $entity['@type'] ) && in_array( 'JobPosting', (array) $entity['@type'], true ) ) {
unset( $data[ $key ] );
}
}
return $data;
}, 999 );
All in One SEO
All in One SEO Pro only outputs Job Posting markup if you added a Job Posting schema to your jobs in its Schema Generator. Remove it there. Developers can also remove it with the aioseo_schema_output filter.
Simple Job Board and Yoast SEO
The free Simple Job Board plugin doesn’t output Google for Jobs markup. Its paid Google Job Search add-on does, so deactivate that add-on. Yoast SEO doesn’t output Job Posting markup, so there is nothing to turn off.
Testing your markup
- Open a job that shows a green tick in your job list.
- Copy its URL into Google’s Rich Results Test and run it. If the site isn’t public yet, paste the page source into the test’s Code tab instead.
- Check the result lists one Job posting with no errors. Warnings about optional fields such as salary are fine.
- Check the page has only one Job posting. If it shows two, your job board or SEO plugin is also outputting markup, so turn that off.
After launch, the Job postings report in Google Search Console shows which job pages Google has found and any problems with them. It can take a few days for new jobs to appear.