I made an API for my jobboard. It’s supposed to retrieve jobs from my ATS Vincere and put it in my plugin, WP Job Manager, that manages my jobs on my WordPress website. But every time I put in a Postman test run it puts in everything except the salary.
Here is the code for Postman:
{
"id": "1109", // Voeg hier een unieke job ID toe
"job_title": "Projectleider Stenen Huizen",
"public_description": "Als projectleider ben je verantwoordelijk voor het coördineren van infratechnische projecten van begin tot eind. Je werkt samen met diverse teams om ervoor te zorgen dat projecten op tijd, binnen budget en volgens de specificaties worden uitgevoerd. Je hebt de leiding over het projectteam en bent het eerste aanspreekpunt voor onze klanten.nn**Taken en verantwoordelijkheden:**n- Leidinggeven aan projecten in de infratechniek.n- Coördineren van werkzaamheden en het aansturen van projectteams.n- Communiceren met opdrachtgevers en andere stakeholders.n- Bewaken van budgetten en planningen.n- Rapporteren van voortgang en knelpunten aan het management.nn**Functie-eisen:**n- Afgeronde HBO- of WO-opleiding in de richting van civiele techniek of infratechniek.n- Minimaal 5 jaar ervaring in een vergelijkbare functie.n- Uitstekende communicatieve vaardigheden.n- Sterk in het plannen en organiseren.n- Kennis van relevante wet- en regelgeving.nn**Wat bieden wij:**n- Een uitdagende functie in een dynamische omgeving.n- Ruimte voor persoonlijke ontwikkeling en groei.n- Een marktconform salaris en goede secundaire arbeidsvoorwaarden.n- De mogelijkheid om aan interessante en duurzame projecten te werken.",
"company_location_id": {
"city": "Hempens, Nederland"
},
"compensation": {
"salary": 5000,
"salary_type": "MONTHLY"
},
"employment_type": "PartTime",
"industry_id": "Infratechniek",
"close_date": "2024-12-31"
}
And I tried so many times to include the salary, but it doesn’t work. Look here: http://nieuw.werkbron.nl/vacature/projectleider-stenen/
Here is the API-code:
`<?php
/*
Plugin Name: Vincere to WP Job Manager Integration
Description: Handles Vincere API callbacks and syncs jobs to WP Job Manager
Version: 1.31
Author:
*/
define('VINCERE_API_TOKEN', 'YOUR_VINCERE_API_TOKEN'); // Vervang dit door je echte API-token
define('VINCERE_TENANT_URL', ''); // Je Tenant URL
function vincere_callback_handler() {
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
wp_send_json_error('Invalid request method');
exit;
}
$json_data = file_get_contents('php://input');
$vincere_data = json_decode($json_data, true);
if (!$vincere_data || !isset($vincere_data['id'])) {
wp_send_json_error('Invalid data received');
exit;
}
$job_data = array(
'post_title' => sanitize_text_field($vincere_data['job_title']),
'post_content' => wp_kses_post($vincere_data['public_description']),
'post_status' => 'publish',
'post_type' => 'job_listing',
);
$existing_job = get_posts(array(
'post_type' => 'job_listing',
'meta_key' => 'vincere_job_id',
'meta_value' => $vincere_data['id'],
'posts_per_page' => 1,
));
if ($existing_job) {
$job_data['ID'] = $existing_job[0]->ID;
$job_id = wp_update_post($job_data);
} else {
$job_id = wp_insert_post($job_data);
}
if (is_wp_error($job_id)) {
wp_send_json_error('Failed to create/update job listing');
exit;
}
// Update job meta
update_post_meta($job_id, 'vincere_job_id', $vincere_data['id']);
update_post_meta($job_id, '_job_location', sanitize_text_field($vincere_data['company_location_id']['city']));
update_post_meta($job_id, '_application', '');
update_post_meta($job_id, '_job_expires', date('Y-m-d', strtotime($vincere_data['close_date'])));
// Salary information
if (isset($vincere_data['compensation'])) {
$compensation = $vincere_data['compensation'];
// Debugging: log de ontvangen salarisgegevens
error_log('Received Compensation Data: ' . print_r($compensation, true));
$salary_from = isset($compensation['salary_from']) ? floatval($compensation['salary_from']) : 0;
$salary_to = isset($compensation['salary_to']) ? floatval($compensation['salary_to']) : 0;
// Debugging: log de verwerkte salarisgegevens
error_log('Processed Salary From: ' . $salary_from);
error_log('Processed Salary To: ' . $salary_to);
update_post_meta($job_id, '_job_salary_minimum', $salary_from);
update_post_meta($job_id, '_job_salary_maximum', $salary_to);
update_post_meta($job_id, '_job_salary_unit', map_salary_unit($compensation['salary_type']));
// Debugging: log de opgeslagen metadata
error_log('Saved Salary Minimum: ' . get_post_meta($job_id, '_job_salary_min', true));
error_log('Saved Salary Maximum: ' . get_post_meta($job_id, '_job_salary_max', true));
error_log('Saved Salary Unit: ' . get_post_meta($job_id, '_job_salary_unit', true));
} else {
// Debugging: log als er geen compensatiegegevens zijn
error_log('No compensation data received');
}
function display_job_salary( $atts ) {
global $post;
$salary_min = get_post_meta( $post->ID, '_salary_min', true );
$salary_max = get_post_meta( $post->ID, '_salary_max', true );
$job_salary = get_post_meta( $post->ID, '_job_salary', true );
if ( !empty($salary_min) && !empty($salary_max) ) {
return 'Salaris: ' . $salary_min . ' - ' . $salary_max;
} elseif ( !empty($salary_min) ) {
return 'Salaris vanaf: ' . $salary_min;
} elseif ( !empty($salary_max) ) {
return 'Salaris tot: ' . $salary_max;
} else {
return 'Salaris: ' . $job_salary;
}
}
add_shortcode( 'job_salary', 'display_job_salary' );
// Region
$region = get_region($vincere_data['company_location_id']);
if ($region) {
wp_set_object_terms($job_id, $region, 'job_listing_region');
}
// Category (Sub industry in Vincere)
if (isset($vincere_data['industry_id'])) {
$category = map_category($vincere_data['industry_id']);
wp_set_object_terms($job_id, $category, 'job_listing_category');
}
// Job Type
$job_type = map_job_type($vincere_data['employment_type']);
wp_set_object_terms($job_id, $job_type, 'job_listing_type');
wp_send_json_success('Job listing created/updated successfully');
exit;
}
function map_salary_unit($vincere_salary_type) {
$map = [
'HOURLY' => 'uur',
'DAILY' => 'dag',
'WEEKLY' => 'week',
'MONTHLY' => 'maand',
'YEARLY' => 'jaar'
];
return isset($map[$vincere_salary_type]) ? $map[$vincere_salary_type] : 'maand';
}
function get_region($location_data) {
// Haal de plaatsnaam uit de location_data
$city = sanitize_text_field($location_data['city']);
// Definieer een array met plaatsen en hun bijbehorende provincie en regio's
$city_to_province = [
// Friesland (Noord)
'Hurdegaryp' => 'Friesland',
'Leeuwarden' => 'Friesland',
'Sneek' => 'Friesland',
// Groningen (Noord)
'Groningen' => 'Groningen',
'Assen' => 'Drenthe',
// Overijssel (Oost)
'Zwolle' => 'Overijssel',
// Noord-Holland (West)
'Amsterdam' => 'Noord-Holland',
// Zuid-Holland (West)
'Rotterdam' => 'Zuid-Holland',
// Noord-Brabant (Zuid)
'Eindhoven' => 'Noord-Brabant',
// Voeg hier meer steden toe zoals nodig
];
$province_to_region = [
'Friesland' => 'Noord',
'Groningen' => 'Noord',
'Drenthe' => 'Noord',
'Overijssel' => 'Oost',
'Gelderland' => 'Oost',
'Noord-Holland' => 'West',
'Zuid-Holland' => 'West',
'Utrecht' => 'West',
'Noord-Brabant' => 'Zuid',
'Limburg' => 'Zuid',
'Zeeland' => 'Zuid'
];
// Zoek de provincie van de stad
if (isset($city_to_province[$city])) {
$province = $city_to_province[$city];
// Geef de regio terug op basis van de provincie
return $province_to_region[$province];
}
// Als de stad niet in de lijst staat, return null of een standaardwaarde
return null;
}
function map_job_type($vincere_employment_type) {
$map = [
'FULL_TIME' => 'Fulltime',
'PART_TIME' => 'Parttime',
'CONTRACT' => 'Tijdelijk',
'FREELANCE' => 'Freelance',
'INTERIM' => 'Interim'
];
return isset($map[$vincere_employment_type]) ? $map[$vincere_employment_type] : 'Fulltime';
}
function map_category($vincere_sub_industry) {
$map = [
// 1. Bouw en Infrastructuur
'Bouwbedrijven' => 'Bouw en Infrastructuur',
'Projectontwikkeling' => 'Bouw en Infrastructuur',
'Infratechniek' => 'Bouw en Infrastructuur',
'Woningcorporaties' => 'Bouw en Infrastructuur',
'Architectuur en Ontwerp' => 'Bouw en Infrastructuur',
// 2. Techniek en Industrie
'Installatietechniek' => 'Techniek en Industrie',
'Elektrotechniek' => 'Techniek en Industrie',
'Werktuigbouwkunde (WTB)' => 'Techniek en Industrie',
'Mechatronica' => 'Techniek en Industrie',
'Lastechniek' => 'Techniek en Industrie',
'Metaalbewerking en Machinebouw' => 'Techniek en Industrie',
'Voedingsmiddelenindustrie (Food)' => 'Techniek en Industrie',
'Kunststofverwerking' => 'Techniek en Industrie',
'Chemie en Farmacie' => 'Techniek en Industrie',
'Hout- en Timmerindustrie' => 'Techniek en Industrie',
// 3. ICT en Digitalisering
'Softwareontwikkeling' => 'ICT en Digitalisering',
'Webontwikkeling' => 'ICT en Digitalisering',
'Online Marketing' => 'ICT en Digitalisering',
'Systeembeheer' => 'ICT en Digitalisering',
'Data Science' => 'ICT en Digitalisering',
'IT-consultancy' => 'ICT en Digitalisering',
// 4. Groen, Agrarisch en Milieu
'Landbouw en Veeteelt' => 'Groen, Agrarisch en Milieu',
'Tuin- en Landschapsinrichting' => 'Groen, Agrarisch en Milieu',
'Bosbouw en Natuurbeheer' => 'Groen, Agrarisch en Milieu',
'Afvalverwerking en Recycling' => 'Groen, Agrarisch en Milieu',
'Milieutechniek' => 'Groen, Agrarisch en Milieu',
// 5. Transport en Logistiek
'Wegtransport' => 'Transport en Logistiek',
'Distributie en Warehousing' => 'Transport en Logistiek',
'Zee- en Luchtvaart' => 'Transport en Logistiek',
'Supply Chain Management' => 'Transport en Logistiek',
// 6. Financiële Sector
'Accountancy' => 'Financiële Sector',
'Verzekeringen' => 'Financiële Sector',
'Banken en Financieringen' => 'Financiële Sector',
'Administratiekantoor' => 'Financiële Sector',
'Fintech' => 'Financiële Sector',
// 7. Onderwijs en Opleiding
'Basis- en Voortgezet Onderwijs' => 'Onderwijs en Opleiding',
'Hoger Onderwijs en Wetenschap' => 'Onderwijs en Opleiding',
'Bedrijfsopleidingen en Training' => 'Onderwijs en Opleiding',
'Coaching en Advies' => 'Onderwijs en Opleiding',
// 8. Zorg en Welzijn
'Gezondheidszorg (Ziekenhuizen, Klinieken)' => 'Zorg en Welzijn',
'Thuiszorg en Ouderenzorg' => 'Zorg en Welzijn',
'Jeugdzorg en Maatschappelijke Zorg' => 'Zorg en Welzijn',
'GGZ (Geestelijke Gezondheidszorg)' => 'Zorg en Welzijn',
'Farmacie' => 'Zorg en Welzijn',
// 9. Commercie en Retail
'Groothandel' => 'Commercie en Retail',
'Detailhandel (Retail)' => 'Commercie en Retail',
'Fast Moving Consumer Goods (FMCG)' => 'Commercie en Retail',
'E-commerce' => 'Commercie en Retail',
// 10. Overheid en Publieke Sector
'Gemeentelijke Overheden' => 'Overheid en Publieke Sector',
'Rijksdiensten' => 'Overheid en Publieke Sector',
'Non-profitorganisaties' => 'Overheid en Publieke Sector',
'Veiligheidssector (Politie, Brandweer)' => 'Overheid en Publieke Sector',
'Militaire en Defensiesector' => 'Overheid en Publieke Sector',
// 11. Horeca en Toerisme
'Hotels en Catering' => 'Horeca en Toerisme',
'Restaurants en Cafés' => 'Horeca en Toerisme',
'Recreatie en Toerisme' => 'Horeca en Toerisme',
'Eventmanagement' => 'Horeca en Toerisme',
// 12. Consultancy en Advies
'Bedrijfsadvies' => 'Consultancy en Advies',
'Technisch Advies' => 'Consultancy en Advies',
'Duurzaamheid en Innovatie' => 'Consultancy en Advies',
'Managementadvies' => 'Consultancy en Advies',
// 13. Energie en Duurzaamheid
'Energietransitie' => 'Energie en Duurzaamheid',
'Hernieuwbare Energie (Zonne- en Windenergie)' => 'Energie en Duurzaamheid',
'Waterstoftechnologie' => 'Energie en Duurzaamheid',
'Circulaire Economie' => 'Energie en Duurzaamheid',
];
return isset($map[$vincere_sub_industry]) ? $map[$vincere_sub_industry] : 'Overig';
}
add_action('rest_api_init', function () {
register_rest_route('vincere/v1', '/callback', array(
'methods' => 'POST',
'callback' => 'vincere_callback_handler',
));
});
`
I changed the code of the API, I tried to change functions.php, asked AI and more.