Need to insert custom post type objects from code. Haven't been able to add using the default method

$id = wp_insert_post(array('post_title'=>'random', 'post_type'=>'custom_post'));

creates a regular post instead.

  • Have you registered a custom post type named as custom_post before using this call? Commented Jul 18, 2013 at 11:32
  • yes its registered
    – rashid
    Commented Jul 18, 2013 at 11:56
  • never mind, its working, there was a minor bug in the file, this exact snippet is correct. just replace 'custom_post' with post type of your choosing!
    – rashid
    Commented Jul 18, 2013 at 12:02

5 Answers 5


From the Codex:

wp_insert_post() will fill out a default list of these but the user is required to provide the title and content otherwise the database write will fail.

$id = wp_insert_post(array(
  'post_content'=>'demo text'

It can be done using the following code :-

To enter a new post for a custom type

$post_id = wp_insert_post(array (
   'post_type' => 'your_post_type',
   'post_title' => $your_title,
   'post_content' => $your_content,
   'post_status' => 'publish',
   'comment_status' => 'closed',   // if you prefer
   'ping_status' => 'closed',      // if you prefer

After inserting the post, a post id will be returned by the above function. Now if you want to enter any post meta information w.r.t this post then following code snippet can be used.

if ($post_id) {
   // insert post meta
   add_post_meta($post_id, '_your_custom_1', $custom1);
   add_post_meta($post_id, '_your_custom_2', $custom2);
   add_post_meta($post_id, '_your_custom_3', $custom3);
  • 3
    The 'meta_input' parameter can be used in the 'wp_insert_post' array, to add meta fields, instead of using 'add_post_meta' afterward.
    – AncientRo
    Commented Mar 10, 2019 at 14:14
  • Thanks for the post. @AncientRow, can you provide an example including meta_input?
    – Pegues
    Commented Apr 22, 2020 at 17:39

This example worked for me using meta_input

$post_id = wp_insert_post(array (
   'post_type' => 'your_post_type',
   'post_title' => $your_title,
   'post_content' => $your_content,
   'post_status' => 'publish',
   'comment_status' => 'closed',
   'ping_status' => 'closed',
   'meta_input' => array(
      '_your_custom_1' => $custom_1,
      '_your_custom_2' => $custom_2,
      '_your_custom_3' => $custom_3,

I found using isset() allowed me to use wp_insert_post() on custom post types:

if ( !isset( $id ) ) { 
    $id = wp_insert_post( $new, true ); 
  • To properly format code in your answer (or question), highlight it and click {} above the edit box.
    – Gabriel
    Commented Mar 10, 2015 at 20:38

I had the same problem. I tried every solution provided in most of the forums. But the actual solution that worked for me was the post type was the length of post_type. The post_type length is limited to 20 characters. So anyone who has a similar issue try this if anything else didn't work.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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