La confusion la plus fréquente sur le function calling, chez les développeurs qui le découvrent, tient en une phrase mal comprise : non, le modèle de langage n’exécute jamais votre code. Il se contente de répondre qu’il souhaiterait appeler une fonction précise, avec des arguments précis, sous forme d’un objet JSON. C’est votre PHP qui décide, ensuite, s’il exécute réellement cet appel.
Cette distinction change tout dans la manière de concevoir une intégration. Voici comment relier un modèle à un petit ensemble de fonctions WordPress, en gardant le contrôle à chaque étape.
Décrire une fonction WordPress en JSON Schema
Le function calling repose sur un principe simple : vous décrivez au modèle, dans la requête, la liste des fonctions disponibles, leur nom, leur description en langage naturel, et le schéma JSON de leurs arguments. Le modèle utilise cette description pour décider s’il doit appeler une fonction et avec quels paramètres.
{
"name": "rechercher_articles",
"description": "Recherche des articles publiés sur le site par mot-clé et catégorie.",
"parameters": {
"type": "object",
"properties": {
"mot_cle": {
"type": "string",
"description": "Le terme à rechercher dans le titre et le contenu."
},
"categorie": {
"type": "string",
"description": "Le slug de la catégorie à filtrer, optionnel."
},
"nombre_resultats": {
"type": "integer",
"description": "Nombre maximum de résultats, entre 1 et 10."
}
},
"required": ["mot_cle"]
}
}
Envoyer cette description dans la requête à l’API
Cette description accompagne le message de l’utilisateur dans l’appel à l’API du modèle. Selon le fournisseur, elle se place dans un tableau tools ou functions de la requête. Le modèle répond alors soit par du texte classique, soit par une demande d’appel de fonction contenant le nom choisi et les arguments au format JSON.
$reponse = wp_remote_post( 'https://api.openai.com/v1/chat/completions', array(
'timeout' => 20,
'headers' => array(
'Authorization' => 'Bearer ' . WPM_LLM_API_KEY,
'Content-Type' => 'application/json',
),
'body' => wp_json_encode( array(
'model' => 'gpt-4o-mini',
'messages' => array(
array( 'role' => 'user', 'content' => $question_utilisateur ),
),
'tools' => array(
array( 'type' => 'function', 'function' => $schema_rechercher_articles ),
),
) ),
) );

Exécuter l’appel demandé, jamais à l’aveugle
Une fois la réponse reçue, on vérifie d’abord que le modèle a bien demandé un appel de fonction, puis on décode les arguments avec json_decode() et on les valide avant toute exécution. Le nom de la fonction demandée est comparé à une liste blanche fixe, jamais exécuté dynamiquement avec call_user_func() à partir d’une chaîne fournie par le modèle sans contrôle.
function wpm_executer_appel_fonction( $nom_fonction, $arguments_bruts ) {
$arguments = json_decode( $arguments_bruts, true );
if ( 'rechercher_articles' !== $nom_fonction ) {
return new WP_Error( 'wpm_fonction_inconnue', 'Fonction non autorisée.' );
}
if ( empty( $arguments['mot_cle'] ) ) {
return new WP_Error( 'wpm_argument_manquant', 'Le mot-clé est requis.' );
}
$query = new WP_Query( array(
's' => sanitize_text_field( $arguments['mot_cle'] ),
'category_name' => isset( $arguments['categorie'] ) ? sanitize_title( $arguments['categorie'] ) : '',
'posts_per_page' => min( 10, absint( $arguments['nombre_resultats'] ?? 5 ) ),
) );
return wp_list_pluck( $query->posts, 'post_title', 'ID' );
}
Renvoyer le résultat au modèle pour la réponse finale
Le résultat de la fonction est ensuite renvoyé au modèle dans un second appel, avec le rôle tool ou function selon le fournisseur, pour que le modèle formule une réponse finale en langage naturel à partir des données réelles renvoyées par WordPress, plutôt que d’inventer une réponse plausible.
Pourquoi ce va-et-vient est une garantie de fiabilité
Ce mécanisme en deux appels évite un défaut classique des LLM seuls : répondre avec assurance à une question qui nécessite des données à jour, en inventant un résultat vraisemblable. Avec le function calling, la réponse finale s’appuie sur les données réellement présentes dans la base WordPress au moment de la requête.
Les permissions restent votre responsabilité, pas celle du modèle
Le modèle ne connaît rien des capacités WordPress. Chaque fonction exposée doit vérifier elle-même les droits de l’utilisateur courant avec current_user_can() avant d’exécuter la moindre action, et particulièrement avant toute fonction qui modifie des données plutôt que de simplement les lire.
Le function calling déplace la décision « quoi faire » vers le modèle, mais la décision « est-ce autorisé » doit toujours rester en PHP, sans exception.
Notre verdict
Bien conçu, le function calling permet de construire des assistants qui interrogent réellement le contenu d’un site WordPress plutôt que de deviner. La discipline à tenir est constante : liste blanche de fonctions, validation stricte des arguments, vérification des permissions à chaque appel. Cette approche prépare d’ailleurs le terrain à des standards plus récents pour exposer des fonctions à des agents, que nous aborderons séparément.