WP insérer une fonction post PHP et des champs personnalisés

26

La fonction WordPress est utilisée pour soumettre des données par programme. Champs standard à soumettre pour inclure le contenu, l'extrait, le titre, la date et bien d'autres.

Il n'y a aucune documentation pour savoir comment soumettre à un champ personnalisé. Je sais que c'est possible avec la add_post_meta($post_id, $meta_key, $meta_value, $unique);fonction.

Mais comment l'inclure dans la wp_insert_postfonction standard ?

<?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',
  );
  wp_insert_post( $my_post );
  ?>
Robin I Knight
la source

Réponses:

35

Si vous lisez la documentation de wp_insert_post, elle renvoie l'ID de publication de la publication que vous venez de créer.

Si vous combinez cela avec la fonction suivante __update_post_meta(une fonction personnalisée que j'ai acquise sur ce site et adaptée un peu)

/**
  * 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 les éléments suivants:

$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' );
Zack
la source
Merci beaucoup. Pourriez-vous me donner une idée de l'implantation. C'EST À DIRE. qui mais du code va où. Merci beaucoup
Robin I Knight
2
Bien fait. Le deuxième bloc de code remplace le vôtre, les valeurs de fonction sont la paire clé / valeur de champ personnalisé. Placez la fonction soit en haut du script, soit dans un fichier .php distinct inclus en haut du script.
aendrew
1
Comme note, j'utilise OOP donc c'est la raison du publicmodificateur devant "fonction". Si vous incluez la fonction elle-même sans la mettre dans une classe, vous n'avez pas besoin d'ajouterpublic
Zack
Bonjour Zack, Aendrew et Philip. Tout fonctionne à merveille, mais j'ai essayé de l'appliquer à une requête en vain. Je ne vois pas vraiment pourquoi. Voici le lien puisque vous savez tous comment le nouveau message du champ personnalisé initial a fonctionné. Je pensais que vous pourriez voir mon erreur. wordpress.stackexchange.com/questions/8622/…
Robin I Knight
1
Je ne peux pas ajouter de réponse, car je n'ai pas de réputation sur wordpress.stackexchange. À partir d'aujourd'hui, il existe une nouvelle méthode, vous pouvez simplement mettre un tableau dans wp_insert_post comme: meta_input => array (key => value)
Frederik Witte
13

Vous pouvez 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);
?>
Philippe
la source
1

Je ne pense pas que vous puissiez l'utiliser avec wp_insert_post () ;.

La raison en est la façon dont WP stocke les deux types de données. Les messages sont stockés dans une grande table monolithique avec une douzaine de colonnes différentes (wp_posts); les champs personnalisés sont stockés dans une table à 4 colonnes plus simple (wp_postmeta) composée principalement d'une méta clé et d'une valeur, associée à une publication.

Par conséquent, vous ne pouvez pas vraiment stocker de champs personnalisés avant d'avoir l'ID de publication.

Essaye ça:

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

Ce message codex a aidé - c'est un peu le contraire de ce que vous faites (c'est-à-dire, supprimer une ligne de base de données après la suppression du message): http://codex.wordpress.org/Plugin_API/Action_Reference/delete_post

aendrew
la source
Dans ce cas, la seule issue que je peux voir est d'utiliser une session, serait-ce correct.
Robin I Knight
Nah; Je suppose que votre plugin essaie d'insérer des champs personnalisés en même temps qu'un message est enregistré, non? Je pense que ce que vous devez faire est de vous connecter à WP après avoir enregistré le message, de saisir le nouveau numéro d'identification du message, puis de le fournir à add_post_meta (); pour créer les FC. Je mettrai à jour ma réponse dans une seconde avec du code.
aendrew
Merci pour l'aide. Au fait, ce n'est pas un plugin. Je l'ai écrit pour que nous puissions le personnaliser autant que nécessaire. (mais ne prenez pas cela pour dire que je suis bon en php, juste des essais et des erreurs)
Robin I Knight
C'est un thème, alors? La seule vraie différence est que vous mettriez cela dans functions.php, dans ce cas.
aendrew
1

Utilisez le save_postfiltre, puis appelez add_post_metavotre fonction de filtre.

Micah Ernst
la source
Peu serviable. $ post-> ID n'est pas disponible pour wp_insert_post_data, ce qui est nécessaire pour créer des champs personnalisés.
aendrew
L' save_postaction @aendrew est à la toute fin de la fonction, elle a l'ID et l'objet du message transmis, la réponse est bonne.
Rarst
1
Je suis presque sûr que cela a été édité, Rarst. Quoi qu'il en soit, cela a du sens maintenant.
aendrew
@aendrew ah, désolé - je n'ai pas remarqué cela
Rarst