Vous utilisez WordPress pour votre site carrière ? JobAffinity peut y publier automatiquement vos offres d'emploi, via l'API REST native de WordPress. Voici comment procéder, étape par étape.
Ce qu'il vous faut
WordPress 5.6 ou supérieur (l'API REST et les mots de passe d'application sont natifs à partir de cette version)
un accès administrateur à votre site WordPress
un accès à Admin > Publications dans JobAffinity
Comptez une quinzaine de minutes.
1. Créer un utilisateur dédié et son mot de passe d'application
Un compte séparé permet de repérer d'un coup d'œil ce qui a été publié par JobAffinity, et de couper la connexion sans toucher à vos autres comptes.
Dans l'administration de votre site WordPress :
Allez dans Utilisateurs > Ajouter.
Créez un utilisateur, par exemple
jobaffinityavec une adresse e-mail que vous contrôlez.Attribuez-lui le rôle Auteur (ou supérieur).
Puis générez son mot de passe d'application :
Ouvrez la fiche de l'utilisateur (Utilisateurs > Tous les utilisateurs >
jobaffinity).Descendez jusqu'à la section Mots de passe d'application.
Saisissez un nom, par exemple
JobAffinity, et cliquez sur Ajouter un nouveau mot de passe d'application.Copiez immédiatement le mot de passe affiché (au format
xxxx xxxx xxxx xxxx xxxx xxxx) : WordPress ne le réaffichera jamais. C'est lui que vous saisirez à l'étape 4, pas le mot de passe du compte.
Pourquoi un mot de passe d'application ? Il est propre à cette seule intégration et se révoque en un clic depuis la même page, sans changer le mot de passe du compte ni déconnecter qui que ce soit.
2. Vérifier que l'API REST est accessible
L'API REST est activée par défaut sur WordPress. Il suffit de vous assurer qu'aucune extension ne la bloque.
Ouvrez cette adresse dans votre navigateur, en remplaçant le domaine par le vôtre :
https://votre-site.fr/wp-json/wp/v2/types
Vous devez obtenir une réponse au format JSON (un gros bloc de texte entre accolades). Si vous obtenez une page d'erreur, un 401 ou un 404, l'API est bloquée.
Important API REST WordPress
Plusieurs extensions de sécurité restreignent /wp-json/ : Wordfence, iThemes Security (désormais SolidWP), Disable REST API, ou un filtre rest_authentication_errors ajouté dans le thème.
Vérifiez aussi que votre hébergeur ne filtre pas l'en-tête HTTP Authorization, sans lequel le mot de passe d'application n'arrive jamais jusqu'à WordPress. En cas de doute, désactivez temporairement les extensions concernées pour tester, puis ajoutez une exception plutôt que de laisser l'API ouverte à tout.
3. Installer le plugin JobAffinity CPT Manager et choisir la clé du type de contenu
Par défaut, une offre publiée arrive comme un article WordPress, dans la même liste que votre blog. Notre extension JobAffinity CPT Manager leur donne un type de contenu qui leur est propre : un menu Offres séparé dans l'administration, une adresse d'API propre ( /wp-json/wp/v2/offer ), et l'intégralité des champs envoyés par JobAffinity conservée.
Installation
Dans l'admin WordPress, allez dans Extensions > Ajouter une extension.
Recherchez JobAffinity CPT Manager (bientôt disponible dans Wordpress.org), ou téléversez l'archive si vous l'avez téléchargée.
Cliquez sur Installer maintenant, puis Activer.
Un bandeau vous invite alors à configurer la clé du type de contenu.
Configuration
Allez dans Réglages > JobAffinity CPT Manager et renseignez :
Champ | Valeur recommandée | À quoi il sert |
Clé du type de contenu (Post type key) |
| Identifiant interne, slug d'URL et base de l'adresse d'API |
Libellé singulier | | Affiché dans l'admin (« Ajouter une nouvelle Offre ») |
Libellé pluriel |
| Nom du menu dans la colonne de gauche |
Icône du menu |
|
La clé accepte les minuscules, chiffres, tirets et tirets bas, 20 caractères maximum. Cliquez sur Enregistrer : un menu Offres apparaît.
Définissez la clé avant la première publication. La changer une fois des offres publiées laisse les anciennes attachées à l'ancien type de contenu et modifie les URL publiques.
Notez la clé choisie : vous la saisirez telle quelle dans le champ Type de contenu du connecteur JobAffinity, à l'étape 4. C'est cette correspondance qui fait arriver les offres dans le menu Offres au lieu des Articles, aucune démarche auprès de notre support n'est nécessaire.
Astuce le réglage Base de route de l'API REST (REST API route base) permet de découpler l'adresse d'API de la clé : un type de contenu nommé offer-intern peut rester servi sur /wp-json/wp/v2/offer . Laissez le champ vide si vous n'en avez pas besoin.
Pourquoi une extension dédiée et pas ACF ?
Des extensions comme ACF ne récupèrent pas dynamiquement les champs personnalisés : chaque champ doit être pré-déclaré dans leur interface pour être exploitable. Or JobAffinity transmet des clés custom_* qui varient selon les offres et selon les clients. Notre extension capte automatiquement tout ce qui arrive par l'API, sans configuration préalable. Les deux cohabitent sans problème si vous utilisez déjà ACF pour le reste du site.
Si les offres arrivent quand même dans « Articles »
Cela signifie que le flux vise encore le type post, en général parce que le champ Type de contenu du connecteur n'a pas été renseigné (étape 4). Corrigez-le en priorité.
L'extension propose deux filets de sécurité, à cocher dans les mêmes réglages, qui rattrapent les offres visant post en détectant le champ : job_id
Interception API REST (REST API interception) pour un flux qui arrive sur . Ne s'applique qu'à la création d'une offre, jamais à la mise à jour d'un contenu existant.
Interception XML-RPC (XML-RPC interception) pour une connexion encore en XML-RPC (voir l'annexe).
Vos articles de blog ne sont jamais affectés : sans champ job_id , rien n'est redirigé.
4. Paramétrer la publication dans JobAffinity
Pour finaliser la connexion :
Accédez au menu Admin > Publications dans JobAffinity.
Cliquez sur le bouton « + » pour ajouter une nouvelle source.
Choisissez WordPress.
Renseignez les champs suivants :
Nom : le nom de votre site ou un nom interne (ex. « Site carrière »)
URL : l'adresse de votre site WordPress (ex.
http://votre-site.fr)Mode de publication : API REST
Identifiant : l'utilisateur créé à l'étape 1 (ex.
jobaffinity)Mot de passe : le mot de passe d'application copié à l'étape 1, pas le mot de passe du compte
Type de contenu : la clé choisie à l'étape 3 (ex.
offer). Laissé àpost, les offres partiraient dans vos articles de blog.
Cliquez sur Enregistrer.
5. Champs transmis lors de la publication
Chaque offre est publiée avec son titre et son descriptif dans les champs standards de WordPress, et tout le reste en champs personnalisés, réutilisables pour filtrer ou organiser l'affichage.
Les 22 champs toujours disponibles
Clé | Contenu | Exemple |
| Identifiant unique JobAffinity |
|
| Référence de l'offre |
|
| Nom de votre structure |
|
| Identifiant client dans JobAffinity |
|
| Nom du client (utile aux cabinets) |
|
| Entité qui recrute |
|
| Localisation du poste |
|
| Adresse du poste |
|
| Code postal |
|
| Ville |
|
| Code pays ISO |
|
| Latitude GPS |
|
| Longitude GPS |
|
| Lien vers le formulaire de candidature | |
| Type de contrat |
|
| Durée du contrat |
|
| Unité de durée |
|
| URL de candidature | |
| Salaire minimum |
|
| Salaire maximum |
|
| Devise |
|
| Périodicité |
|
Ces 22 clés forment un socle : l'extension les déclare toujours et elles ne peuvent pas être retirées. Le champ Champs supplémentaires (Additional fields) des réglages sert à en ajouter d'autres par-dessus, jamais à remplacer ce socle.
Toutes les valeurs sont transmises sous forme de texte, y compris les salaires et les coordonnées GPS. Pensez-y si vous les triez : un tri numérique demande une conversion côté thème.
Vos champs personnalisés (custom_*)
Les champs que vous avez créés dans JobAffinity arrivent préfixés custom_, par exemple custom_filiere_metier , custom_regions , custom_temps_de_travail. Ils varient d'un client à l'autre et n'ont rien à déclarer : l'extension les enregistre automatiquement, quel que soit leur nom.
Vous les lisez dans un thème exactement comme les autres :
$region = get_post_meta( get_the_ID(), 'custom_regions', true );
Pour les développeurs
Les offres sont lisibles et modifiables sur l'adresse standard du type de contenu :
GET | /wp-json/wp/v2/offer | Liste des offres |
GET | /wp-json/wp/v2/offer/{id} | Détail d'une offre |
POST | /wp-json/wp/v2/offer | Création (authentification requise) |
POST | /wp-json/wp/v2/offer/{id} | Mise à jour (authentification requise) |
Les 22 clés ci-dessus passent par l'objet standard meta. Les clés libres, les valeurs multiples et les suppressions passent par l'objet custom_fields , propre à l'extension, il n'existe que sur le type de contenu dédié, pas sur /wp/v2/posts. Si la même clé arrive par les deux canaux, c'est la valeur de custom_fields qui est conservée.
curl -X POST https://votre-site.fr/wp-json/wp/v2/offer \
-u "jobaffinity:xxxx xxxx xxxx xxxx xxxx xxxx" \
-H "Content-Type: application/json" \
-d '{
"title": "Vendeur H/F - Versailles",
"content": "<p>Description du poste...</p>",
"status": "publish",
"meta": {
"job_id": "1023736",
"job_contract_type": "CDI",
"job_location": "Versailles",
"job_salary_min": "28000",
"job_link": "https://example.com/apply/abc123"
},
"custom_fields": {
"custom_filiere_metier": "Magasins",
"custom_regions": "YVELINES SUD"
}
}'
Pour connaître la liste exacte des clés déclarées sur votre installation :
curl -X OPTIONS https://votre-site.fr/wp-json/wp/v2/offer
6. Afficher vos offres sur votre site
Cas 1 : Vous utilisez le type de contenu dédié (recommandé)
Vos offres sont immédiatement accessibles à l'adresse https://votre-site.fr/offer/. WordPress y applique le template archive-offer.php de votre thème s'il existe, sinon archive.php, sinon index.php.
Pour une page sur mesure, créez archive-offer.php dans votre thème :
<?php
get_header();
$offres = new WP_Query( array(
'post_type' => 'offer',
'posts_per_page' => 20,
) );
while ( $offres->have_posts() ) : $offres->the_post();
$contrat = get_post_meta( get_the_ID(), 'job_contract_type', true );
$ville = get_post_meta( get_the_ID(), 'job_location', true );
$lien = get_post_meta( get_the_ID(), 'job_link', true );
?>
<article class="offre">
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<p><?php echo esc_html( $contrat ); ?> — <?php echo esc_html( $ville ); ?></p>
<?php if ( $lien ) : ?>
<a href="<?php echo esc_url( $lien ); ?>" rel="noopener">Postuler</a>
<?php endif; ?>
</article>
<?php
endwhile;
wp_reset_postdata();
get_footer();
Pour filtrer sur un champ : ici les CDI d'une région :
$offres = new WP_Query( array(
'post_type' => 'offer',
'meta_query' => array(
array( 'key' => 'job_contract_type', 'value' => 'CDI' ),
array( 'key' => 'custom_regions', 'value' => 'YVELINES', 'compare' => 'LIKE' ),
),
) );
Cas 2 : Vous publiez les offres comme des articles
Elles s'affichent alors sur votre page Articles, mêlées à votre blog. Si cette page sert déjà à d'autres contenus, créez une page dédiée avec un template qui ne retient que les articles de l'utilisateur JobAffinity :
<?php
$offres = new WP_Query( array( 'author' => 2, 'posts_per_page' => 20 ) );
// Remplacez 2 par l'ID de l'utilisateur jobaffinity
C'est faisable, mais l'étape 3 reste la solution la plus propre.
7. Tester la publication
Dans JobAffinity, publiez une offre en sélectionnant votre source WordPress.
Dans l'admin WordPress, ouvrez Offres > Toutes les offres : l'offre doit y apparaître.
Ouvrez-la et vérifiez la présence des champs
job_*etcustom_*dans la métaboîte Champs personnalisés.Visitez
https://votre-site.fr/offer/pour la voir côté public.
8. Exemple d'intégration
Voici un exemple de site WordPress connecté à JobAffinity : https://recrutement.intersport.fr/
9. Dépannage
« Erreur d'authentification » ou code 401 Vérifiez que vous avez saisi le mot de passe d'application et non le mot de passe du compte, espaces inclus. Vérifiez aussi que votre hébergeur transmet bien l'en-tête HTTP Authorization : sans lui, WordPress ne voit aucune authentification. En dernier recours, révoquez le mot de passe d'application et régénérez-en un.
« Vous n'avez pas l'autorisation » ou code 403 Le compte doit être au minimum Auteur. Vérifiez également qu'aucune extension de sécurité ne restreint /wp-json/.
Code 404 sur /wp-json/ L'API REST est désactivée, ou les permaliens sont en mode « simple ». Passez sur Réglages > Permaliens et enregistrez à nouveau.
Les offres arrivent dans « Articles » et non dans « Offres » Le champ Type de contenu du connecteur (étape 4) est resté sur post. Corrigez-le. Les offres déjà publiées restent dans les articles : déplacez-les à la main, ou demandez-nous un accompagnement.
L'offre est créée mais certains champs sont vides Un champ personnalisé absent alors que l'offre est bien publiée vient presque toujours d'une clé non déclarée envoyée dans meta : WordPress l'ignore sans signaler d'erreur. Envoyez-la dans custom_fields, ou ajoutez-la dans Champs supplémentaires (Additional fields) des réglages de l'extension.
Toujours bloqué ? Consultez J'ai une erreur de publication sur mon site WordPress ou contactez-nous en indiquant l'URL de votre site et l'heure de la tentative.
Annexe : Ancien mode de publication : XML-RPC
Mode d'héritage. XML-RPC reste pris en charge pour les connexions existantes, mais l'API REST est le mode recommandé pour toute nouvelle configuration. Si votre source JobAffinity date d'avant l'arrivée de REST, elle fonctionne toujours : rien ne presse, mais prévoyez la migration.
Historiquement, JobAffinity publiait via le protocole XML-RPC, activé par défaut sur WordPress, en visant le type de contenu post.
Les limites de ce mode :
xmlrpc.phpest une cible classique d'attaques par force brute ; Wordfence, iThemes Security et la plupart des extensions de sécurité le bloquent par défaut, et de nombreux hébergeurs le coupent au niveau du serveur ;il exige le vrai mot de passe du compte WordPress, qu'aucun mot de passe d'application ne peut remplacer ;
il ne sait publier que sur le type
post: pour router les offres vers un type dédié, il faut cocher Interception XML-RPC (XML-RPC interception) dans les réglages de JobAffinity CPT Manager, qui détecte les offres par la présence du champjob_idet les redirige avant enregistrement ;les messages d'erreur y sont beaucoup moins explicites qu'en REST, ce qui rend le diagnostic plus long.
Migrer une connexion XML-RPC vers l'API REST
Générez un mot de passe d'application pour l'utilisateur
jobaffinity(étape 1).Dans Admin > Publications, éditez la source : passez le Mode de publication sur API REST, remplacez le mot de passe par le mot de passe d'application, et renseignez le Type de contenu (étape 4).
Publiez une offre de test (étape 7).
Une fois la publication confirmée, vous pouvez décocher Interception XML-RPC dans les réglages de l'extension et laisser votre extension de sécurité bloquer
xmlrpc.php.
Les offres déjà publiées ne bougent pas : la migration ne concerne que les publications à venir.


