Articles in this section
Category / Section

How to Get Your Job Listings on Google for Jobs

Published:

What is Google for Jobs?

Google for Jobs is a powerful feature that displays job listings directly in Google search results.

When job seekers search for positions, Google shows a special jobs box with rich information including company names, locations, and salary details. Getting your jobs listed here can significantly increase your visibility and applications.


Prerequisites

Before your jobs can appear on Google for Jobs, ensure you have:

✅ A WordPress website with the Recruitly plugin installed

✅ Active job listings published on your site

✅ Access to edit your theme's functions.php file

✅ Google Search Console account (recommended for monitoring)


Step-by-Step Implementation Guide


Step 1: Add the Structured Data Code

Add the following code to your WordPress theme's functions.php file. You can access this through:

  • WordPress Admin → Appearance → Theme Editor → functions.php, or
  • Via FTP/cPanel in /wp-content/themes/your-theme/functions.php
/**
 * Add Google Jobs structured data to Recruitly job posts
 * Customize the values below according to your needs
 */
function custom_recruitly_google_jobs_structured_data() {
    if (is_singular('current-vacancies')) { // Recruitly post type
        global $post;
        
        // CUSTOMIZE THESE VALUES
        $agency_name = 'Your Agency Name'; // Replace with your agency name
        $currency = 'USD'; // Change to your currency: GBP, EUR, AUD, etc.
        $default_country = 'US'; // Default country if none specified
        
        // Map your job types to Google's employment types
        $employment_type_map = array(
            'Full Time' => 'FULL_TIME',
            'Part Time' => 'PART_TIME',
            'Contract' => 'CONTRACTOR',
            'Temporary' => 'TEMPORARY',
            'Intern' => 'INTERN',
            'Freelance' => 'CONTRACTOR',
            'Permanent' => 'FULL_TIME',
            // Add more mappings as needed
        );
        
        // Get job meta data
        $job_type = get_post_meta($post->ID, 'jobType', true);
        $posted_on = get_post_meta($post->ID, 'postedOn', true);
        $company_name = get_post_meta($post->ID, 'companyName', true);
        $min_salary = get_post_meta($post->ID, 'minSalaryRange', true);
        $max_salary = get_post_meta($post->ID, 'maxSalaryRange', true);
        
        // Location data
        $country = get_post_meta($post->ID, 'country', true) ?: $default_country;
        $city = get_post_meta($post->ID, 'town', true);
        $region = get_post_meta($post->ID, 'county', true);
        $postal_code = get_post_meta($post->ID, 'postCode', true);
        $remote_working = get_post_meta($post->ID, 'remoteWorking', true);
        
        $employment_type = isset($employment_type_map[$job_type]) ? $employment_type_map[$job_type] : 'FULL_TIME';
        
        // Build structured data
        $structured_data = array(
            '@context' => 'https://schema.org/',
            '@type' => 'JobPosting',
            'title' => get_the_title(),
            'description' => strip_tags(get_the_content()),
            'datePosted' => date('Y-m-d', strtotime($posted_on)),
            'employmentType' => $employment_type,
            'validThrough' => date('Y-m-d', strtotime($posted_on . ' + 60 days')) . 'T23:59:59'
        );
        
        // Organization - use agency name or company name
        $structured_data['hiringOrganization'] = array(
            '@type' => 'Organization',
            'name' => $company_name ?: $agency_name // Uses company name if available, otherwise agency
        );
        
        // Location
        if ($remote_working == 'true' || $remote_working == 1) {
            $structured_data['jobLocationType'] = 'TELECOMMUTE';
        }
        
        $location_data = array(
            '@type' => 'Place',
            'address' => array(
                '@type' => 'PostalAddress',
                'addressCountry' => $country
            )
        );
        
        if ($city) $location_data['address']['addressLocality'] = $city;
        if ($region) $location_data['address']['addressRegion'] = $region;
        if ($postal_code) $location_data['address']['postalCode'] = $postal_code;
        
        $structured_data['jobLocation'] = $location_data;
        
        // Salary (optional but recommended)
        if ($min_salary || $max_salary) {
            $salary_data = array(
                '@type' => 'MonetaryAmount',
                'currency' => $currency
            );
            
            if ($min_salary && $max_salary) {
                $salary_data['value'] = array(
                    '@type' => 'QuantitativeValue',
                    'minValue' => floatval($min_salary),
                    'maxValue' => floatval($max_salary),
                    'unitText' => 'YEAR'
                );
            } elseif ($min_salary || $max_salary) {
                $salary_data['value'] = array(
                    '@type' => 'QuantitativeValue',
                    'value' => floatval($min_salary ?: $max_salary),
                    'unitText' => 'YEAR'
                );
            }
            
            $structured_data['baseSalary'] = $salary_data;
        }
        
        // Output the structured data
        ?>
        <script type="application/ld+json">
        <?php echo wp_json_encode($structured_data, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT); ?>
        </script>
        <?php
    }
}
add_action('wp_head', 'custom_recruitly_google_jobs_structured_data');

Step 2: Customize Your Settings

After adding the code, customize these important values:

1. Agency/Company Name

$agency_name = 'Your Agency Name'; // Replace with your actual name

This will appear as the hiring organization when no specific company is listed.

2. Currency

$currency = 'USD'; // Common options: GBP, EUR, AUD, CAD, INR

3. Default Country

$default_country = 'US'; // Use 2-letter country codes: GB, AU, CA, IN

4. Employment Type Mappings

Add any custom job types your agency uses:

$employment_type_map = array(
    'Full Time' => 'FULL_TIME',
    'Part Time' => 'PART_TIME',
    'Contract' => 'CONTRACTOR',
    'Temporary' => 'TEMPORARY',
    'Permanent' => 'FULL_TIME',
    'Casual' => 'PART_TIME',
    'Fixed Term' => 'TEMPORARY',
    // Add your custom types here
);

Step 3: Test Your Implementation


  1. View a Job Post
    • Navigate to any single job listing on your website
    • View the page source (right-click → "View Page Source")
    • Search for <script type="application/ld+json">
    • You should see your structured data
  2. Use Google's Rich Results Test
  3. Example of What You Should See

    {
      "@context": "https://schema.org/",
      "@type": "JobPosting",
      "title": "Senior Software Developer",
      "description": "We are looking for an experienced developer...",
      "datePosted": "2025-05-15",
      "employmentType": "FULL_TIME",
      "validThrough": "2025-07-14T23:59:59",
      "hiringOrganization": {
        "@type": "Organization",
        "name": "Tech Recruitment Agency"
      },
      "jobLocation": {
        "@type": "Place",
        "address": {
          "@type": "PostalAddress",
          "addressLocality": "London",
          "addressRegion": "England",
          "addressCountry": "GB"
        }
      }
    }


Step 4: Submit to Google Search Console


  1. Add Your Site to Google Search Console
  2. Submit Your Sitemap (usually yoursite.com/sitemap.xml)
  3. Monitor Performance in the "Performance" report
  4. Check for Issues in the "Enhancements" → "Job postings" section


Troubleshooting Common Issues


❌ "Missing field 'hiringOrganization'"

Solution: Ensure the $agency_name variable is set with your agency name.


❌ "Invalid employment type"

Solution: Check that your job types are correctly mapped to Google's accepted values:

  • FULL_TIME
  • PART_TIME
  • CONTRACTOR
  • TEMPORARY
  • INTERN
  • VOLUNTEER
  • PER_DIEM
  • OTHER


❌ "Missing location"

Solution: Ensure jobs have at least a country specified. Add a default country in the code.


❌ Jobs not appearing after implementation

Solution:

  • It can take 3-7 days for Google to discover and index your structured data
  • Ensure your jobs are publicly accessible (not behind login)
  • Check that job URLs are included in your sitemap
  • Verify no robots.txt blocking


Best Practices for Maximum Visibility


1. Keep Jobs Fresh
  • Remove expired positions promptly
  • Update the "validThrough" date for extended postings
  • Regularly add new jobs
2. Complete Information
  • Include salary ranges when possible (jobs with salary get 30% more clicks)
  • Add detailed job descriptions
  • Specify exact locations (city, region, postal code)
3. Mobile Optimization
  • Ensure job pages load quickly
  • Test mobile responsiveness
  • Use clear, readable fonts
4. Clear Job Titles
  • Use standard job titles (e.g., "Software Engineer" not "Code Ninja")
  • Include seniority levels (Senior, Junior, Lead)
  • Avoid excessive punctuation or ALL CAPS


Monitoring Success


Track Your Performance
  1. Google Search Console
    • Monitor impressions and clicks for job postings
    • Check for any structured data errors
  2. Google Analytics
    • Track traffic to job pages
    • Monitor application conversions
    • Analyze user behavior
  3. Key Metrics to Watch
    • Impressions in Google Jobs
    • Click-through rate (CTR)
    • Time on job pages
    • Application conversion rate


Frequently Asked Questions


Q: How long before my jobs appear on Google? 

A: Typically 3-7 days after implementation, but can take up to 2 weeks.

Q: Can I hide the client company name? 

A: You must provide a hiring organisation. You can use your agency name or "Confidential Employer."

Q: Do I need to update expired jobs? 

A: Yes, remove or update expired jobs to maintain good standing with Google.

Q: What if I don't have salary information? 

A: Salary is optional but highly recommended. Jobs with salary information receive significantly more clicks.

Q: Can I use this for multiple websites? 

A: Yes, add the code to each WordPress site's functions.php file with appropriate customizations.


Need Help?


If you encounter issues:

  1. Double-check your code implementation
  2. Verify using Google's Rich Results Test
  3. Ensure all required fields are populated
  4. Contact Recruitly support for plugin-specific questions


Access denied
Access denied