WP insert post fonction PHP et champs personnalisés
4 réponses
- votes
-
- 2011-02-04
Si vous lisez la documentation de
wp_insert_post
,elle renvoie le ID depublication dumessage que vous venez de créer.Si vous combinez cela avec lafonction suivante
__update_post_meta
(unefonctionpersonnalisée quej'ai acquise sur ce siteet adaptée unpeu)/** * Updates post meta for a post. It also automatically deletes or adds the value to field_name if specified * * @access protected * @param integer The post ID for the post we're updating * @param string The field we're updating/adding/deleting * @param string [Optional] The value to update/add for field_name. If left blank, data will be deleted. * @return void */ public function __update_post_meta( $post_id, $field_name, $value = '' ) { if ( empty( $value ) OR ! $value ) { delete_post_meta( $post_id, $field_name ); } elseif ( ! get_post_meta( $post_id, $field_name ) ) { add_post_meta( $post_id, $field_name, $value ); } else { update_post_meta( $post_id, $field_name, $value ); } }
Vous obtiendrez ce qui suit:
$my_post = array( 'post_title' => $_SESSION['booking-form-title'], 'post_date' => $_SESSION['cal_startdate'], 'post_content' => 'This is my post.', 'post_status' => 'publish', 'post_type' => 'booking', ); $the_post_id = wp_insert_post( $my_post ); __update_post_meta( $the_post_id, 'my-custom-field', 'my_custom_field_value' );
If you read the documentation for
wp_insert_post
, it returns the post ID of the post you just created.If you combine that with the following function
__update_post_meta
(a custom function I acquired from this site and adapted a bit)/** * Updates post meta for a post. It also automatically deletes or adds the value to field_name if specified * * @access protected * @param integer The post ID for the post we're updating * @param string The field we're updating/adding/deleting * @param string [Optional] The value to update/add for field_name. If left blank, data will be deleted. * @return void */ public function __update_post_meta( $post_id, $field_name, $value = '' ) { if ( empty( $value ) OR ! $value ) { delete_post_meta( $post_id, $field_name ); } elseif ( ! get_post_meta( $post_id, $field_name ) ) { add_post_meta( $post_id, $field_name, $value ); } else { update_post_meta( $post_id, $field_name, $value ); } }
You'll get the following:
$my_post = array( 'post_title' => $_SESSION['booking-form-title'], 'post_date' => $_SESSION['cal_startdate'], 'post_content' => 'This is my post.', 'post_status' => 'publish', 'post_type' => 'booking', ); $the_post_id = wp_insert_post( $my_post ); __update_post_meta( $the_post_id, 'my-custom-field', 'my_custom_field_value' );
-
Mercibeaucoup.Pourriez-vous éventuellementme donner uneidée sur l'implantation.C'EST À DIRE.quimais de code va où.MercibeaucoupThanks very much. Could you possibly give me an idea on the implantation. IE. which but of code goes where. Many Thanks
- 0
- 2011-02-04
- Robin I Knight
-
Bienfait.Le deuxièmebloc de code remplace le vôtre,les valeurs de lafonction sont lapaire clé/valeur de champpersonnalisé.Placez lafonction soiten haut du script,soit dans unfichier .php séparéinclusen haut du script.Nicely done. The second code block replaces yours, the function values is the custom field key/value pair. Put the function either at the top of the script, or in a separate .php file included at the top of the script.
- 2
- 2011-02-04
- aendrew
-
Enguise denote,j'utilise la POO,c'est donc la raison dumodificateur `public` devant"function ".Si vousincluez lafonctionelle-même sans lamettre dans une classe,vousn'avezpasbesoin d'ajouter `public`As a note, I do use OOP so that's the reason for the `public` modifier in front of "function". If you're including the function itself without putting it into a class, you don't need to add `public`
- 1
- 2011-02-05
- Zack
-
Bonjour Zack,Aendrewet Philip.Toutfonctionne àmerveille,maisj'ai égalementessayé de l'appliquer à une requêteen vain.Jene voispas vraimentpourquoi.Voici le lienpuisque vous saveztous comment lenouveaumessage du champpersonnaliséinitialfonctionnait,je pensais que vouspourriez voirmonerreur.http://wordpress.stackexchange.com/questions/8622/wp-insert-post-php-function-dynamically-generated-custom-fieldsHello Zack, Aendrew and Philip. Everything is working beautifully however I tried to apply it to a query as well to no avail. I don't quite see why. Here is the link since you all know how the initial custom field new post worked I thought you might see my error. http://wordpress.stackexchange.com/questions/8622/wp-insert-post-php-function-dynamically-generated-custom-fields
- 0
- 2011-02-05
- Robin I Knight
-
@Zack - Bonne réponse.Maisj'auraistendance à éviter d'utiliser destraits de soulignement dans lesnoms defonctions,ne serait-ce queparce que lesnoms avec destraits de soulignementen tête onttendance à être utiliséspar les développeurs deplates-formes lorsqu'ils veulent créer desfonctions _ "réservées" _ ou _ (pseudo) "cachées" _pour que lesgensvoir ceux-cipourraientpenser qu'il s'agit defonctions deplate-forme,oupire,ilspourraiententreren conflit avec unefuturefonction debase de WordPress.Juste unepensée.@Zack - Nice answer. But I would tend to shy away from using leading underscores in function names if only because names with leading underscores tend to be used by platform developers when they want to create _"reserved"_ or _(pseudo) "hidden"_ functions so people seeing those might think they are platform functions, or worse they might conflict with a future WordPress core function. Just a thought.
- 0
- 2011-02-05
- MikeSchinkel
-
@MikeSchinkel: Au début,j'ai commencé à utiliser "__"pour lesfonctionsprotégées au sein d'une classe,puisj'ai changé la structure demonpluginpour que lafonction soitpublique.Je l'aurais également appelé simplement "update_post_meta"mais cela aurait certainement étéen conflit avec lesfonctions debase de WordPress.Doncje ne savaispas comment l'appeler :(@MikeSchinkel: At first, I originally started using "__" for protected functions within a class, but then changed the structure of my plugin to where the function needed to be public. I also would've named it simply "update_post_meta" but that would've definitely conflicted with WordPress' core functions. So I didn't know what to name it :(
- 0
- 2011-02-05
- Zack
-
@Zack - Peut-être `zacks_update_post_meta ()`?:) L'autreproblème queje n'aipasmentionné avec lesprincipauxtraits de soulignementest que quelqu'un d'autretout aussi créatifpeut utiliser lamême convention dans unpluginet doncentreren conflit avec le vôtre.BTW,saviez-vous que `update_post_meta ()` ajoute s'iln'existepas?`add_post_meta ()`n'estnécessaire que lorsque vous souhaitez ajouter des clésen double.@Zack - Maybe `zacks_update_post_meta()`? :) The other issue I didn't mention with leading underscores is that someone else equally creative may use the same convention in a plugin and thus conflict with yours. BTW, did you know that `update_post_meta()` adds if it doesn't exist? `add_post_meta()` is only needed when you want to add duplicate keys.
- 0
- 2011-02-05
- MikeSchinkel
-
@MikeSchinkel: J'aiinitialementtrouvé lafonction ailleurs sur ce site,je l'ai aiméet je l'ai refactoriséejusteparce queje suis comme ça.J'ai aussipensé que `update_post_meta ()`faisait déjà ça,maisje nepouvaispasen être sûr.Quandj'aitrouvé lafonction,j'ai sauté aux conclusions.@MikeSchinkel: I originally found the function elsewhere on this site, liked it, and refactored it just because I'm like that. I also figured `update_post_meta()` did that already, but couldn't be sure. When I found the function, I jumped to conclusions.
- 0
- 2011-02-05
- Zack
-
@Zack - Hey apprendre WordPressest un voyage.Jepense qu'ilme reste aumoins 50% deplus de ce voyage,sinonbeaucoupplus!@Zack - Hey learning WordPress is a journey. I figure I still have at least 50% more of that journey left, if not a lot more!
- 0
- 2011-02-05
- MikeSchinkel
-
Jene peuxpas ajouter de réponse,carje n'aipas de réputation sur wordpress.stackexchange.Àpartir d'aujourd'hui,ilexiste unenouvelleméthode,vouspouvez simplementplacer untableau dans wp_insert_post comme:meta_input=> array (key=> value)I can't add an answer, as I don't have reputation on wordpress.stackexchange. As of today there is a new method, you can simply put in an array into wp_insert_post as: meta_input => array(key=>value)
- 1
- 2016-10-15
- Frederik Witte
-
- 2011-02-05
Vouspouvez simplement ajouter le "add_post_meta" après le "wp_insert_post"
<?php $my_post = array( 'post_title' => $_SESSION['booking-form-title'], 'post_date' => $_SESSION['cal_startdate'], 'post_content' => 'This is my post.', 'post_status' => 'publish', 'post_type' => 'booking', ); $post_id = wp_insert_post($my_post); add_post_meta($post_id, 'META-KEY-1', 'META_VALUE-1', true); add_post_meta($post_id, 'META-KEY-2', 'META_VALUE-2', true); ?>
You can simple add the 'add_post_meta' after the 'wp_insert_post'
<?php $my_post = array( 'post_title' => $_SESSION['booking-form-title'], 'post_date' => $_SESSION['cal_startdate'], 'post_content' => 'This is my post.', 'post_status' => 'publish', 'post_type' => 'booking', ); $post_id = wp_insert_post($my_post); add_post_meta($post_id, 'META-KEY-1', 'META_VALUE-1', true); add_post_meta($post_id, 'META-KEY-2', 'META_VALUE-2', true); ?>
-
- 2011-02-04
Utilisez lefiltre
save_post
,puis appelezadd_post_meta
dans votrefonction defiltre.Use
save_post
filter, then calladd_post_meta
in your filter function.-
Peu serviable.$post-> IDn'estpas disponiblepour wp_insert_post_data,ce quiestnécessairepour créer des champspersonnalisés.Unhelpful. $post->ID is not available to wp_insert_post_data, which is necessary for creating custom fields.
- 0
- 2011-02-04
- aendrew
-
L'action @aendrew `save_post`est à latoutefin de lafonction,elle a l'ID de lapublicationet l'objet qui luiestpassé,la réponseest saine.@aendrew `save_post` action is at the very end of the function, it has post's ID and object passed to it, answer is sound.
- 0
- 2011-02-05
- Rarst
-
Je suispresque sûr que cela a étémodifié,Rarst.Quoi qu'ilen soit,cela a du sensmaintenant.I'm pretty sure this was edited, Rarst. Regardless, it makes sense now.
- 1
- 2011-02-05
- aendrew
-
@aendrew ah,désolé -je n'aipas remarqué ça@aendrew ah, sorry - didn't notice that
- 0
- 2011-02-05
- Rarst
-
- 2011-02-04
Jene pensepas que vouspuissiez l'utiliser avec wp_insert_post () ;.
La raisonest lafaçon dont WP stocke les deuxtypes de données. Lesmessages sont stockés dans unegrandetablemonolithique avec une douzaine de colonnes différentes (wp_posts); les champspersonnalisés sont stockés dans unetableplus simple à 4 colonnes (wp_postmeta) composéeprincipalement d'une clémétaet d'une valeur,associée à un article.
Par conséquent,vousne pouvezpas vraiment stocker de champspersonnaliséstant que vousn'avezpas l'ID depublication.
Essayez ceci:
function myplugin_insert_customs($pid){ $customs = array( 'post_id' => $pid, 'meta_key' => 'Your meta key', 'meta_value' => 'Your meta value', ); add_post_meta($customs); } add_action('save_post', 'myplugin_insert_customs', 99);
Cepost de codex a aidé - c'est unpeu le contraire de ce que vousfaites (c'est-à-dire,supprimer une ligne debase de données lors de la suppression de lapublication): http://codex.wordpress.org/Plugin_API/Action_Reference/delete_post
I don't think you can use it with wp_insert_post();.
The reason is because of how WP stores the two data types. Posts are stored in one big monolithic table with a dozen different columns (wp_posts); custom fields are stored in a simpler, 4-column table (wp_postmeta) comprised mainly of a meta key and value, associated with a post.
Consequently, you can't really store custom fields until you have the post ID.
Try this:
function myplugin_insert_customs($pid){ $customs = array( 'post_id' => $pid, 'meta_key' => 'Your meta key', 'meta_value' => 'Your meta value', ); add_post_meta($customs); } add_action('save_post', 'myplugin_insert_customs', 99);
This codex post helped -- it's kinda the opposite of what you're doing (i.e., deleting a DB row upon post deletion): http://codex.wordpress.org/Plugin_API/Action_Reference/delete_post
-
Dans ce cas,la seuleissue queje peux voirest d'utiliser une session,serait-ce correct.In that case the only way out I can see is to use a session, would that be correct.
- 0
- 2011-02-04
- Robin I Knight
-
Nah;J'imagine que votrepluginessaie d'insérer des champspersonnalisésen mêmetemps qu'un articleestenregistré,non?Jepense que ce que vous devezfaireest de vous connecter à WP unefois lemessageenregistré,de saisir lenouveaunuméro d'identification dumessage,puis de lefournir à add_post_meta ();pour créer les CF.Jemettrai àjourma réponse dans une seconde avec du code.Nah; I'm guessing your plugin is trying to insert custom fields at the same time a post is saved, right? I think what you need to do is hook into WP after the post is saved, grab the post's new ID number, then supply that to add_post_meta(); to create the CFs. I'll update my answer in a second with some code.
- 0
- 2011-02-04
- aendrew
-
Mercipour l'aide.Aufait,cen'estpas unplugin.Je l'ai écritpour quenouspuissions lepersonnaliser autant quenécessaire.(maisne prenezpas celapour dire queje suistout àfaitbon avecphp,juste desessaiset deserreurs)Thanks for the help. By the way its not a plugin. I wrote it so we can customise it as much as needed. (but don't take that to mean I'm any good with php, just trial and error)
- 0
- 2011-02-04
- Robin I Knight
-
C'est unthème,alors?La seule différence réelleest que vousmettriez cela dansfunctions.php,dans ce cas.It's a theme, then? Only real difference is you'd put that in functions.php, in that case.
- 0
- 2011-02-04
- aendrew
Lafonction WordPressest utiliséepour soumettre des donnéesparprogramme.Champs standard à soumettrepourinclure le contenu,l'extrait,letitre,la dateet bien d'autres.
Iln'y apas de documentationpour savoir comment soumettre à un champpersonnalisé.Je sais que c'estpossible avec lafonction
add_post_meta($post_id, $meta_key, $meta_value, $unique);
.Mais,comment l'inclure dans lafonction standard
wp_insert_post
?