JAVASCRIPTseointermediate

JobPosting Schema for Recruitment Sites

Add JobPosting structured data to appear in Google for Jobs search results with salary and company details

Faisal Yaqoob
#job-posting#schema#seo#structured-data#json-ld#google-jobs#recruitment#hiring#rich-snippets
Share this snippet:

Code

javascript
1const jobPosting = {
2 "@context": "https://schema.org",
3 "@type": "JobPosting",
4 "title": "Senior WordPress Developer",
5 "description": "<p>We are looking for an experienced WordPress developer to join our team. You will be responsible for developing custom themes, plugins, and maintaining client websites.</p><h3>Responsibilities</h3><ul><li>Develop custom WordPress themes and plugins</li><li>Optimize site performance and Core Web Vitals</li><li>Implement headless WordPress with Next.js</li><li>Code review and mentor junior developers</li></ul><h3>Requirements</h3><ul><li>5+ years WordPress development experience</li><li>Strong PHP, JavaScript, and React skills</li><li>Experience with REST API and GraphQL</li><li>Knowledge of SEO best practices</li></ul>",
6 "datePosted": "2025-12-27",
7 "validThrough": "2026-03-27T23:59:59-05:00",
8 "employmentType": "FULL_TIME",
9 "hiringOrganization": {
10 "@type": "Organization",
11 "name": "Your Company Name",
12 "sameAs": "https://yourcompany.com",
13 "logo": "https://yourcompany.com/logo.png",
14 "description": "A leading web development agency specializing in WordPress and Shopify solutions."
15 },
16 "jobLocation": {
17 "@type": "Place",
18 "address": {
19 "@type": "PostalAddress",
20 "streetAddress": "123 Tech Street",
21 "addressLocality": "Austin",
22 "addressRegion": "TX",
23 "postalCode": "78701",
24 "addressCountry": "US"
25 }
26 },
27 "baseSalary": {
28 "@type": "MonetaryAmount",
29 "currency": "USD",
30 "value": {
31 "@type": "QuantitativeValue",
32 "minValue": 90000,
33 "maxValue": 130000,
34 "unitText": "YEAR"
35 }
36 },
37 "jobBenefits": "Health insurance, 401k matching, unlimited PTO, remote work flexibility",
38 "skills": "WordPress, PHP, JavaScript, React, REST API, MySQL, Git",
39 "qualifications": "Bachelor's degree in Computer Science or equivalent experience",
40 "experienceRequirements": {
41 "@type": "OccupationalExperienceRequirements",
42 "monthsOfExperience": 60
43 },
44 "industry": "Software Development",
45 "occupationalCategory": "15-1254.00"
46};

JobPosting Schema for Recruitment Sites

Add JobPosting structured data to make your job listings appear in Google for Jobs — a dedicated job search experience that appears at the top of search results. This can dramatically increase visibility for your open positions.

Full-Time Job Posting Schema

const jobPosting = {
  "@context": "https://schema.org",
  "@type": "JobPosting",
  "title": "Senior WordPress Developer",
  "description": "<p>We are looking for an experienced WordPress developer to join our team. You will be responsible for developing custom themes, plugins, and maintaining client websites.</p><h3>Responsibilities</h3><ul><li>Develop custom WordPress themes and plugins</li><li>Optimize site performance and Core Web Vitals</li><li>Implement headless WordPress with Next.js</li><li>Code review and mentor junior developers</li></ul><h3>Requirements</h3><ul><li>5+ years WordPress development experience</li><li>Strong PHP, JavaScript, and React skills</li><li>Experience with REST API and GraphQL</li><li>Knowledge of SEO best practices</li></ul>",
  "datePosted": "2025-12-27",
  "validThrough": "2026-03-27T23:59:59-05:00",
  "employmentType": "FULL_TIME",
  "hiringOrganization": {
    "@type": "Organization",
    "name": "Your Company Name",
    "sameAs": "https://yourcompany.com",
    "logo": "https://yourcompany.com/logo.png",
    "description": "A leading web development agency specializing in WordPress and Shopify solutions."
  },
  "jobLocation": {
    "@type": "Place",
    "address": {
      "@type": "PostalAddress",
      "streetAddress": "123 Tech Street",
      "addressLocality": "Austin",
      "addressRegion": "TX",
      "postalCode": "78701",
      "addressCountry": "US"
    }
  },
  "baseSalary": {
    "@type": "MonetaryAmount",
    "currency": "USD",
    "value": {
      "@type": "QuantitativeValue",
      "minValue": 90000,
      "maxValue": 130000,
      "unitText": "YEAR"
    }
  },
  "jobBenefits": "Health insurance, 401k matching, unlimited PTO, remote work flexibility",
  "skills": "WordPress, PHP, JavaScript, React, REST API, MySQL, Git",
  "qualifications": "Bachelor's degree in Computer Science or equivalent experience",
  "experienceRequirements": {
    "@type": "OccupationalExperienceRequirements",
    "monthsOfExperience": 60
  },
  "industry": "Software Development",
  "occupationalCategory": "15-1254.00"
};

Remote Job Posting

const remoteJob = {
  "@context": "https://schema.org",
  "@type": "JobPosting",
  "title": "Shopify Developer (Remote)",
  "description": "<p>Join our fully remote team as a Shopify developer. Build custom themes, apps, and integrations for e-commerce clients worldwide.</p><h3>What You'll Do</h3><ul><li>Build custom Shopify themes using Liquid, HTML, CSS, JavaScript</li><li>Develop Shopify apps using Node.js and React</li><li>Integrate third-party APIs and payment gateways</li><li>Optimize store performance and conversion rates</li></ul>",
  "datePosted": "2025-12-27",
  "validThrough": "2026-02-28",
  "employmentType": "FULL_TIME",
  "jobLocationType": "TELECOMMUTE",
  "applicantLocationRequirements": [
    {
      "@type": "Country",
      "name": "United States"
    },
    {
      "@type": "Country",
      "name": "Canada"
    },
    {
      "@type": "Country",
      "name": "United Kingdom"
    }
  ],
  "hiringOrganization": {
    "@type": "Organization",
    "name": "Your Company",
    "sameAs": "https://yourcompany.com",
    "logo": "https://yourcompany.com/logo.png"
  },
  "baseSalary": {
    "@type": "MonetaryAmount",
    "currency": "USD",
    "value": {
      "@type": "QuantitativeValue",
      "minValue": 80000,
      "maxValue": 120000,
      "unitText": "YEAR"
    }
  }
};

Freelance / Contract Position

const contractJob = {
  "@context": "https://schema.org",
  "@type": "JobPosting",
  "title": "Freelance Web Developer - WooCommerce Projects",
  "description": "<p>We need a skilled freelance developer for ongoing WooCommerce projects. Flexible hours with project-based compensation.</p>",
  "datePosted": "2025-12-27",
  "validThrough": "2026-06-30",
  "employmentType": ["CONTRACTOR", "PART_TIME"],
  "hiringOrganization": {
    "@type": "Organization",
    "name": "Your Agency",
    "sameAs": "https://youragency.com",
    "logo": "https://youragency.com/logo.png"
  },
  "jobLocation": {
    "@type": "Place",
    "address": {
      "@type": "PostalAddress",
      "addressLocality": "Remote",
      "addressCountry": "US"
    }
  },
  "baseSalary": {
    "@type": "MonetaryAmount",
    "currency": "USD",
    "value": {
      "@type": "QuantitativeValue",
      "minValue": 50,
      "maxValue": 100,
      "unitText": "HOUR"
    }
  }
};

WordPress Implementation

/**
 * Output JobPosting schema for WordPress job listings
 * Works with a custom post type 'job'
 */
function wp_job_posting_schema() {
    if ( ! is_singular( 'job' ) ) {
        return;
    }

    global $post;

    $salary_min  = get_post_meta( $post->ID, 'job_salary_min', true );
    $salary_max  = get_post_meta( $post->ID, 'job_salary_max', true );
    $job_type    = get_post_meta( $post->ID, 'job_type', true ) ?: 'FULL_TIME';
    $is_remote   = get_post_meta( $post->ID, 'job_remote', true );
    $valid_until = get_post_meta( $post->ID, 'job_valid_through', true );
    $city        = get_post_meta( $post->ID, 'job_city', true );
    $state       = get_post_meta( $post->ID, 'job_state', true );

    $schema = [
        '@context'           => 'https://schema.org',
        '@type'              => 'JobPosting',
        'title'              => get_the_title(),
        'description'        => apply_filters( 'the_content', $post->post_content ),
        'datePosted'         => get_the_date( 'Y-m-d' ),
        'validThrough'       => $valid_until,
        'employmentType'     => $job_type,
        'hiringOrganization' => [
            '@type'  => 'Organization',
            'name'   => get_bloginfo( 'name' ),
            'sameAs' => home_url( '/' ),
            'logo'   => get_site_icon_url( 512 ),
        ],
    ];

    if ( $is_remote ) {
        $schema['jobLocationType'] = 'TELECOMMUTE';
    } elseif ( $city && $state ) {
        $schema['jobLocation'] = [
            '@type'   => 'Place',
            'address' => [
                '@type'           => 'PostalAddress',
                'addressLocality' => $city,
                'addressRegion'   => $state,
                'addressCountry'  => 'US',
            ],
        ];
    }

    if ( $salary_min && $salary_max ) {
        $schema['baseSalary'] = [
            '@type'    => 'MonetaryAmount',
            'currency' => 'USD',
            'value'    => [
                '@type'    => 'QuantitativeValue',
                'minValue' => (int) $salary_min,
                'maxValue' => (int) $salary_max,
                'unitText' => 'YEAR',
            ],
        ];
    }

    echo '<script type="application/ld+json">'
        . wp_json_encode( $schema, JSON_UNESCAPED_SLASHES )
        . '</script>' . "\n";
}
add_action( 'wp_head', 'wp_job_posting_schema' );

Employment Type Reference

// Valid employmentType values:
// "FULL_TIME"      - Full-time employment
// "PART_TIME"      - Part-time employment
// "CONTRACTOR"     - Independent contractor
// "TEMPORARY"      - Temporary position
// "INTERN"         - Internship
// "VOLUNTEER"      - Volunteer position
// "PER_DIEM"       - Per diem basis
// "OTHER"          - Other arrangement

// Multiple types allowed as array:
"employmentType": ["FULL_TIME", "CONTRACTOR"]

// Salary unit options:
// "HOUR"   - Hourly rate
// "DAY"    - Daily rate
// "WEEK"   - Weekly salary
// "MONTH"  - Monthly salary
// "YEAR"   - Annual salary

Best Practices

  • Include salary range — jobs with salary info get significantly more visibility
  • Use HTML in description — Google renders formatted job descriptions
  • Set validThrough — expired listings are automatically removed
  • Specify employmentType — required for Google for Jobs eligibility
  • Add hiringOrganization with logo — builds trust in search results
  • Include applicantLocationRequirements for remote jobs — Google filters by location
  • Update listings promptly when positions are filled

Features

  • Google for Jobs: Appear in Google's dedicated job search experience
  • Salary Display: Show salary range directly in search results
  • Remote Support: Full support for remote and hybrid positions
  • Multiple Types: Handle full-time, contract, freelance, and internships
  • Location Filtering: Users can filter by location in Google Jobs
  • WordPress Ready: PHP implementation for WordPress job boards

Related Snippets