31

The WordPress function is used for submitting data programatically. Standard fields to submit to incude the content, excerpt, title, date and many more.

What there is no documentation for is how to submit to a custom field. I know it is possible with the add_post_meta($post_id, $meta_key, $meta_value, $unique); function.

But, how to include that into the standard wp_insert_post function?

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

5 Answers 5

35

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' );
10
  • Thanks very much. Could you possibly give me an idea on the implantation. IE. which but of code goes where. Many Thanks Feb 4, 2011 at 21:13
  • 2
    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.
    – aendra
    Feb 4, 2011 at 21:37
  • 1
    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
    – Zack
    Feb 5, 2011 at 3:13
  • Hello 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. wordpress.stackexchange.com/questions/8622/… Feb 5, 2011 at 17:22
  • 1
    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) Oct 15, 2016 at 9:59
17

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

You can add 'meta_input' element on the post parameters as an array of post meta values keyed by their post meta key

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

    'meta_input' => array(
      'your_custom_meta_field_name' => $_SESSION['your_custom_meta_field_value']
    )
  );
  wp_insert_post( $my_post );
  ?>
1

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

4
  • In that case the only way out I can see is to use a session, would that be correct. Feb 4, 2011 at 20:42
  • 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.
    – aendra
    Feb 4, 2011 at 20:48
  • 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) Feb 4, 2011 at 20:52
  • It's a theme, then? Only real difference is you'd put that in functions.php, in that case.
    – aendra
    Feb 4, 2011 at 21:00
1

Use save_post filter, then call add_post_meta in your filter function.

4
  • Unhelpful. $post->ID is not available to wp_insert_post_data, which is necessary for creating custom fields.
    – aendra
    Feb 4, 2011 at 20:40
  • @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.
    – Rarst
    Feb 5, 2011 at 0:16
  • 1
    I'm pretty sure this was edited, Rarst. Regardless, it makes sense now.
    – aendra
    Feb 5, 2011 at 2:04
  • @aendrew ah, sorry - didn't notice that
    – Rarst
    Feb 5, 2011 at 9:46

Not the answer you're looking for? Browse other questions tagged or ask your own question.