Le blog.

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, chose que je fais sur ce site avec mon thème Prisma.

WP-Form_contact_wp_insert_post
Un simple formulaire permet d’enregistrer des témoignages dans mon site

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

39 commentaires ont été rédigés, ajoutez le votre.

  1. Gilles Vauvarin Répondre

    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 ?

    • Pierre Répondre

      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.

      • Clément rigo Répondre

        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 ??

        • Pierre Répondre

          Il suffit d’utiliser wp_insert_post dans une variable, style…
          $post_id = wp_insert_post(……);

          Si le post a bien été inséré, cette fonction retourne l’ID du dit post !

          cf http://img.saika.li/Sqk7

          • Clément rigo

            Top ! Ça fonctionne
            Merci :)

  2. ismael13 Répondre

    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);

    • Pierre Répondre

      Bonjour Ismael ! En effet ‘tax_input’ permet d’assigner des « taxonomy terms » à votre post.

      • ismael13 Répondre

        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.

        • Pierre Répondre

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

  3. ismael13 Répondre

    idem pour ‘tax_input’ => array(‘thematique’ => array($theme)),
    ça ne fonctionne pas.

    • Pierre Répondre

      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 ;)

  4. ismael13 Répondre

    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.

  5. be Répondre

    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 ?

  6. be Répondre

    En fait, j’ai trouvé petite erreur de nommage de variable.

    Encore merci pour le tut

  7. issam Répondre

    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

    • Pierre Saïkali Répondre

      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 !

      • Frederic Répondre

        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.

  8. ismael13 Répondre

    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.
    }

  9. mimiminou Répondre

    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 !

  10. denoual Répondre

    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.

    • Pierre Saïkali Répondre

      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 !

  11. Jean-Christophe Répondre

    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.

    • Pierre Saïkali Répondre

      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.

  12. Jean-Christophe Répondre

    Merci Pierre, je vous tiens au courant.

  13. Dabo Répondre

    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

    • Pierre Saïkali Répondre

      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.

  14. Rétrolien: WordPress et la création dynamique de co...

  15. yole Répondre

    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

    • Pierre Saïkali Répondre

      Bonjour,
      Travail complexe ! Soit avec Toolset (wp-types.com), soit par un développement sur-mesure :)
      Cordialement.

  16. Lythande Répondre

    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 !! :D

    • Pierre Répondre

      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 !

  17. Sehrz Répondre

    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.

    • Pierre Répondre

      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 !

  18. Frederic Répondre

    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

  19. banana Répondre

    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.

    • Pierre Répondre

      Bonjour Hugo,

      Oui c’est tout à fait possible.
      Il faudrait créer une metabox « maison » et au lieu d’y afficher des champs de formulaire à l’intérieur, simplement afficher les valeurs des metas du post.
      Plus d’infos sur la création de metabox @ https://wabeo.fr/jouons-avec-les-meta-boxes/

Laisser un commentaire