Utiliser wp_insert_post pour créer du contenu dynamiquement dans WordPress

Dans WordPress, la création d’un contenu (article, page, commentaire, utilisateur, ou tout autre type de contenu custom) n’est pas uniquement faisable à la main, humainement. Il est également possible de créer des contenus programmatiquement et dynamiquement : étudions comment utiliser wp_insert_post pour automatiser l’enregistrement des données d’un formulaire de contact dans notre site WordPress.


De nombreux plugins WordPress existent pour vous permettre d’insérer des formulaires de contact sur votre site. En fonction de vos nécessités, il est bien probable que ces plugins possèdent un trop grand nombre d’options à disposition, résultant en une interface lourde et compliquée à maîtriser pour la création d’un simple formulaire de contact.

Je préfère donc souvent mettre la main à la pâte et créer mon propre template WordPress de formulaire de contact, me permettant ainsi d’économiser du temps de chargement — les plugins incorporant souvent des fichiers JS et CSS — et avoir un parfait contrôle sur les données nécessaires, la validation, l’affichage des erreurs et le stockage des messages.

La vidéo ci-dessus met en place assez rapidement un formulaire basique, sans aucune validation, mais qui vous évite l’utilisation d’un plugin. Mais nous allons y inclure une petite originalité : ce tutoriel n’enverra aucun email ! D’autres tutoriels vous permettent d’aborder l’utilisation de wp_mail pour envoyer vos données par mail, nous allons donc enregistrer les messages reçus dans un type de contenu Contact dans WordPress. A chaque fois qu’une personne utilisera notre formulaire de contact, un nouveau post (entité) de type Contact (post type) sera créé en utilisant wp_insert_post.

Utilisation de wp_insert_post

$contact_post = array(
  'post_title' => $name . ' | ' . $email,
  'post_content' => $message,
  'post_type' => 'contact',
  'post_status' => 'publish'
);
wp_insert_post($contact_post);

Rien d’extrêmement insurmontable : on définit une array dans laquelle on stocke les informations relatives au contenu qui va être créé. Tout peut y être défini, du titre de l’entité créée (post_title)  aux catégories du post (post_category) en passant par l’entité parente (post_parent) ou bien l’auteur du contenu (post_author). Référez-vous au codex WordPress de cette fonction pour y connaître toutes les informations qui peuvent être définies.

Ne définissez une valeur ID uniquement si vous souhaitez mettre à jour les informations d’un post existant. Il n’est pas possible de choisir l’ID du post qui sera créé, WordPress s’en chargera pour vous.

Ensuite, cette array est utilisée comme paramètre de wp_insert_post pour créer notre nouvelle entité.

Enfin, il est important de noter que cette fonction renvoie true si le contenu a bel et bien été créé dans notre base de données. Il devient donc très facile d’afficher un message de réussite ou d’erreur…

if (wp_insert_post($contact_post)) {
  echo 'Succès !';
} else {
echo 'Erreur =(';
}

Il nous est donc désormais possible de créer des contenus WordPress dynamiquement ! Les utilisations possibles sont nombreuses et fort pratiques : enregistrer des avis sur un produit/film/livre…, intégrer le back-end de votre site au front-end, ou bien stocker les témoignages de vos clients dans un type de contenu Témoignage.

Et vous, quelle utilisation allez-vous faire de cette fonction wp_insert_post ?


Vous avez aimé cet article ?

Partagez-le sur vos réseaux sociaux en guise de remerciement :)


39 commentaires

Pratique cette fonction que je découvre avec ton tutoriel. Merci de nous l’avoir fait découvrir.

Je ne vois pas dans le codex la possibilité d’insérer via « wp_insert_post » des données de formulaire dans des metabox du custom post type ?

J’imagine que la solution est de créer le CPT avec wp_insert_post, de récupérer l’id du post qui vient d’être créée puis d’insérer dansun second temps les données destinées aux metabox via add post meta ?

Tu vois une autre solution ?

Content d’avoir été utile !
Exact, wp_insert_post ne s’occupant que de la création de l’entité (post) il faut bel et bien gérer les données de tes custom fields séparément, avec add_post_meta par exemple.

Bonjour, je répond à cette question car je me trouve exactement dans cette situation.

Je dois ajouter du contenu depuis un formulaire, donc je laisse l’utilisateur entrer ses informations via le formulaire (titre, message et certains custom field).
Mais comment retrouver l’ID du post qui vient d’être créé, pour pouvoir faire add_post_meta par la suite ??

Bonjour,

Merci pour ce tutoriel qui m’a permis de comprendre la fonction wp_insert_post,
Mais j’avais une question pour un post type disposant de taxonomy,
si je voulais renseigner la taxonomy de mon post type, est-ce correct de faire comme ceci?

$contact_post = array(
‘post_title’ => $name . ‘ | ‘ . $email,
‘post_content’ => $message,
‘post_type’ => ‘contact’,
‘post_status’ => ‘publish’
‘tax_input’ => array( ‘taxonomy_name’ => array( ‘term’, ‘term2’, ‘term3’ ) ) ),
);
wp_insert_post($contact_post);

Mais cela veut pas fonctionner!

le nom de ma taxonomy est thematique,
$theme est champs que j’ai rajouté,
$theme = htmlspecialchars($_POST[‘theme’]);

mais est-ce que mon écriture est correct?

$contact_post = array(
‘post_title’ => $name . ‘ | ‘ . $email,
‘post_content’ => $message,
‘post_type’ => ‘book’,
‘tax_input’ => array(‘thematique’ => $theme),
‘post_status’ => ‘publish’,

Mais en utilisant ça fonctionne en utlisant
wp_set_object_terms($contact_post, $theme, ‘thematique’, true);

Cela ajoute un nouveau terme dans la taxonomy thematique, mais ne veut pas fairee le lien avec le post type.

Il me semble qu’il faille une array de termes, essaye avec :
‘tax_input’ => array(‘thematique’ => array($theme)),

Dans ce cas utilise wp_set_object_terms( $object_id, $terms, $taxonomy, $append ) comme tu l’as spécifié…

$object_id = l’ID du post,
$terms = array des terms,
$taxonomy = nom de la taxonomy
$append = TRUE si tu veux ajouter, FALSE si tu veux écraser les termes déjà assignés au post.

J’espère que cette fois c’est la bonne 😉

Merci,

Effectivement la fonction wp_set_object_terms( $object_id, $terms, $taxonomy, $append ) marche 😉
Et le faite que tu m’as detaillé chaque élément cela m’a bien aiguillé vers la solution.
Mon problème venait de $object_id = l’ID du post (j’avais pas compris que c’était l’ID du post qu’il demandait).

Cordialement.

Bonsoir,
et encore merci pour ce petit tut.
J’ai essayé d’aller plus loin en ajoutant des données dans des métabox à l’aide de update_post_meta.
Voici mon code :
$masterTitre=$_POST[‘masterTitre’];
$master_ID = wp_insert_post($master_post);
update_post_meta( $master_ID, ‘Titres’, $masterTitre );

Mais voilà, mon post se créé bien, mais mes métabox ne se remplissent pas. Par contre, la base de données est bien implémentée.

Aurais-tu une idée là-dessus ?

bonsoir,
tres bon tutos, mais par contre je me demande comment ca marche pour uploader un fichier depuis le front, et de le lié sur une meta ???
merci de votre retour

Bonjour Issam,

J’ai recopié un système que j’ai mis en place pour un site où un formulaire front-end créée une entité WP (donc avec wp_insert_post) et où on peut envoyer des images via ce formulaire (ajoutées au post_meta ‘_images_image’ dans le code ci-dessous).

Le code est dispo ici : http://pastebin.com/tiTMK014

En gros, une fonction helper permet de gérer le fichier et l’insérer dans WP comme média. Le reste est le traitement/process du formulaire.

J’espère que ça vous oriente !

Bonjour, je suis en mode apprentissage de pleins de choses sur wordpress et j’aime beaucoup vos explications, En ce qui concerne votre code pour l’ajout d’image en front end, j’ai une complication, l’upload ce fait bien, mais je n’arrive pas à relié l’image aux posts. Si possible pour vous de me guider cela serait grandement apprécié. F.

Merci pour le code pour uploader un fichier via le formulaire, mais dans le cadre de notre fonction wp_insert_post, il faut le mettre dans cette boucle :
if (wp_insert_post($contact_post)) {

//Notre code pour uploader.
}

Bonjour,

Merci beaucoup pour cet article, ça m’aide beaucoup dans ce que je fais.

En fait, grâce à ça, j’ai fais un formulaire d’envoi de message par les internautes pour les propositions, suggestions pour le site etc. et ces messages sont visibles directement sur l’interface d’administration.

Mais j’ai une question, comment peut-on faire un genre de système de notification lorsqu’un internaute envoie un message dans le formulaire ? genre un écriture de « (1) » près du menu « Contact » custom type. Techniquement, comment peut-on écrire un petit 1 près du menu « Contact » lorsqu’un nouveau instanciation du type « contact » est créé via le formulaire ? donc notification pour l’administrateur

Si tu as la solution, merci bien de me répondre !

Et encore merci pour l’article !

bonsoir, je viens de visionner votre vidéo, et elle m’intéresse beaucoup. En effet je voudrais orienter les inscrits de mon site wordpress vers un formulaire qu’ils devront remplir afin de me renseigner sur leur profil. Ce que je cherche depuis 2 mois, c’est diriger le submit de mon formulaire, non pas vers un email, mais vers une nouvelle page wordpress qui synthétiserait les données recueillies par la validation du formulaire. J’aimerais que les données enregistrées du formulaire soient ensuite accessibles, visibles à tous les inscrits de mon wordpress. Ou entrer le code PHP donc, pour orienter la validation de mon formulaire vers une nouvelle page ? function php ? Comment rentrer dans mon code php pour que le formulaire soit acheminé ailleurs ? De plus la nouvelle page qui aura recueilli les données du formulaire devra calculer des moyennes afin de classer des réponses. Comment programmer une feuille de calcul, en l’occurrence une moyenne.Merci d’avance pour votre réponse. Je vais poster également sur votre site en espérant que vous me lisiez.
Cordialement.

Bonjour denoual,

On peut faire ça de plein de manières… Si les données entrées par l’user sont propres à lui-même, on peut les stocker en les associant à l’user via add_user_meta ou update_user_meta.
Si jamais ce sont plutôt des infos qui ne le concernent pas, peut-être créer un type de contenu spécifique pour ça et ajouter une entité via wp_insert_post comme décrit dans ce tuto.

Pour que le formulaire dirige vers une nouvelle page, je te conseille de traiter les données $_POST sur l’action WP « ‘template_redirect », je devrais écrire un article là-dessus prochainement. Dans la fonction que tu passeras dans cette action, tu peux rediriger l’utilisateur avec wp_redirect().

Ce ne sont là que des indications, j’espère que ça t’aidera !

merci pour votre réponse rapide. J’ai déjà créé mes formulaires via gravity forms. Pour réorienter les réponses de mes formulaires vers une autre page, dois-je rentrer dans le code « php function » de mon wordpress ? Je comprends votre vidéo afin de créer une page contact pour recenser les inscrits par le formulaire.Mais vous créez votre formulaire et vous reprenez donc les données que vous avez créé dans la page d’accueil des données.En ce qui me concerne, le code php je ne l’ai pas créé puisque gravity forms a tout géré.Comment dans un premier temps puis-je avoir accès au code source du formulaire gravity forms ? Car en cliquant droit sur mon formulaire wordpress et en sélectionnant « afficher le code source de ma page » ou en sélectionnant « inspecter l’élément », je ne parviens pas à détecter mes données de renseignements concernant mon questionnaire-formulaire ( nom, prénom, adresse)et je n’arrive pas à les modifier.
Comment alors inspecter le code php de mon formulaire ?
Et comment m’en servir afin d’orienter le user après le submit vers une page récapitulative de ses renseignements.
J’espère avoir été clair. Ce soir je vais essayer de retravailler les premiers éléments de votre réponse.
merci infiniment.
Cordialement.

Bonjour Jean-Christophe,

Ha, vous avez utilisé Gravity Forms. Je vous conseille alors de vous orienter vers mon article https://mosaika.fr/astuces-developpement-gravity-forms-wordpress/ dans la section « Récupérer les données d’un formulaire après soumission d’un Gravity Forms ».

Il s’agit de créer du code dans functions.php afin d’intercepter les données de Gravity Forms et en faire ce que vous souhaitez.

C’est là que vous ferez en sorte que les données soient enregistrées quelque part (dans un type de contenu, dans une option, …). Ensuite, vous pourrez reprendre ces données dans une page publique pour les montrer à tous.

Ce n’est qu’un guide rapide, le code nécessitant un peu de travail, mais j’espère avoir pu vous aider.

Cordialement.

Bonjour Mr Pierre,

Je viens de tomber sur votre site , et je me demande si ce n’est pas enfin la bouée de sauvetage que je cherchais depuis des mois .

Je dispose d’un site ou j’ai inséré un formulaire . Le formulaire que j’utilise est celui de Form Maker de web dorado .

. Le site est le suivant : http://www.vehiculesvoles.com . Un site d’insertion d’annonces de voitures volées . Le formulaire est visible à la page  » Déposer Une Annonce  »

Je souhaiterai que les informations postées dans le formulaire puissent apparaître sur la page d’accueil du site .

.
Pensez vous qu’il me serait possible de le faire avec wp_insert_post ?

Merci de votre tutoriel .

Cordialement

Bonjour Dabo,

Votre besoin est tout à fait réalisable avec wp_insert_post.
Il faudrait créer un type de contenu « Annonce » et lors de l’envoi d’un formulaire, le système crée une « Annonce » grâce à wp_insert_post. Elle pourrait avoir un statut « Brouillon » le temps que vous la validiez en « Publié » par exemple.

C’est un travail sur-mesure qui demande de mettre les mains dans le code !
N’hésitez pas à me contacter si vous chercher quelqu’un pour réaliser cela.

Sinon, il existe un ensemble de plugins Toolset (http://wp-types.com/) qui vous éviterait d’avoir à programmer : via une interface visuelle, vous créez votre type de contenu Annonce, votre formulaire, les notifications e-mails et comportements à faire après la soumission du formulaire, etc… Je compte faire une série de tutoriels sur cet outil mais je ne sais pas quand !
Mais c’est une alternative qui pourrait vous intéresser.

Bon courage !

Cordialement.

Bonjour,
Je souhaiterais créer un site web privé ou l’objectif serait d’enregistrer un document pdf avec ses renseignements sous forme de formulaire. Exemple nom prenom date etc… + le téléchargement du pdf. Je voudrais qu’un id s’incrémente automatiquement et que toutes ces données soient visible que des utilisateurs et que l’on puisse faire une recherche par date. Avez-vous des suggestions à me faire?

Merci

Bonjour,

Merci pour cet article !

J’ai quelques questions :
– Comment est-ce que je peux déclarer une page template dans un plugin ?
– Est-ce que si je met l’identifiant de mon custom post type (déjà créé ailleurs) ça marche également ?
– Pour remplir les taxonomies et les metaboxes ? Si j’ai bien lu pour les taxonomies je dois écrire wp_set_object_terms($contact_post, $theme, ‘phone’, true); après le le tableau ? Et pour les metaboxes il y a une fonction similaire ? Est-ce que c’est update_post_meta ?

Thanks !! 😀

Bonjour Lythande,

– Apparemment on peut bidouiller le comportement de WordPress pour proposer un autre template via un plugin. Je te laisse découvrir ça sur http://wordpress.stackexchange.com/questions/3396/create-custom-page-templates-with-plugins

– Oui tout à fait, tu peux utiliser wp_insert_post() avec l’argument ‘post_type’ pour définir un type de contenu que tu as défini auparavant, comme je le fais dans cet article en fait (post type « contact »).

– Correct, wp_set_object_terms peut le faire mais tu peux aussi directement définir des taxonomies dans wp_insert_post lors de la création du post avec l’argument « tax_input » (https://codex.wordpress.org/Function_Reference/wp_insert_post) comme on en discute dans les commentaires un peu plus haut.

Bon courage !

Bonjour Pierre,

Qui aurait pu croire que 5 ans après, votre tuto aurait encore autant de succès ? Je viens à la recherche d’un peu d’aide pour me dépatouiller de cette situation glissante ! Voici ma situation :
Je suis stagiaire en service informatique, et en projet sur un multi-site WordPress comportant 12 blogs différents. Le principe, c’est que des utilisateurs (appelés « Candidates ») passent par une page d’enregistrement (sur laquelle ils trouveront un formulaire fait-maison, pas de plugin pour le coup) pour s’inscrire. La demande qui m’a été faite (et l’un des sujets de mon stage donc), c’est qu’au moment de valider le formulaire, une entitée au nom du candidat, et avec les différentes informations qu’il aura renseigné, soit créée dans la partie « Candidates » donc, qui est un CustomType/CustomField (j’avoue ne pas encore tout à fait maîtriser la nuance, mais je cherche, je cherche).

Je sens bien que l’article que vous avez rédigé peut m’aider, mais j’ai du mal à mettre les idées dans l’ordre pour trouver la solution. Est-ce qu’en l’état, wp_insert_post peut s’appliquer à des custom post créés par ACF ?

Merci d’avance pour l’aide que vous saurez m’apporter,
Bien à vous,
Sehrz.

Bonjour Sehrz,

En fait, si vous utilisez ACF, je déconseille d’utiliser manuellement wp_insert_post. Autant profiter de ce qu’ACF propose, à savoir des formulaires front-end (les mêmes metaboxes, champs et validations de ces derniers du back-office… mais en front) -> https://www.advancedcustomfields.com/resources/acf_form/

Avec cette fonction vous pourrez afficher un formulaire de création de post en front assez facilement.

Bon courage !

Bonjour Pierre,

J’aurais une question.
Pour l’ajout de la taxonomie par formulaire, tout fonctionne bien pour moi. Cependant, lorsque j’ai plusieurs taxonomies différentes, je me demandais comment je devrais écrire le tout.
merci

Merci Pierre, interessant. Je me demandais si on pouvait afficher le contenu du formulaire coté backend en « non-modifiable », c’est a dire sous forme de texte et nom de champs, car je n’aimerai pas que les données rentrés par l’utilisateur en frontend soit modifiée par l’administrateur en backend.

Laisser un commentaire