Ted
Ted

Reputation: 4166

insert post ID with wp_insert_post

how can I choose post ID, when inserting new post, ex:

$post = array(
'ID'                =>  3333,
'comment_status'            =>  'open',
'post_content'      =>  'hi world!',
'post_name'         =>  'title_1',
'post_status'       =>  'publish',
'post_title'        =>  'sdfsfd fdsfds ds',
'post_type'         =>  'post',
);  

$post_id = wp_insert_post($post);

want to insert new post with id = 3333

Upvotes: 11

Views: 18766

Answers (5)

jake
jake

Reputation: 820

Here is my simple solution:

//check if post with id 3333 is already in database, if so, update post 3333
if (get_post_status(3333) ) {
    $post = array(
    'ID'                =>  3333,
    'comment_status'    =>  'open',
    'post_content'      =>  'hi world!',
    'post_name'         =>  'title_1',
    'post_status'       =>  'publish',
    'post_title'        =>  'your title',
    'post_type'         =>  'post',
    );  

    $post_id = wp_insert_post($post);
}
//if not in database, add post with id 3333
else {
    $post = array(
    'import_id'         =>  3333,
    'comment_status'    =>  'open',
    'post_content'      =>  'hi world!',
    'post_name'         =>  'title_1',
    'post_status'       =>  'publish',
    'post_title'        =>  'your title',
    'post_type'         =>  'post',
    );  

    $post_id = wp_insert_post($post);
}

'ID'=> post_id will update that post, while 'import_id'=> post_id will create a new post with that id.

You can also loop through and feed the IDs to run multiple insertions/updates without the risk of creating an infinite amount of new posts.

Upvotes: 10

daveaspinall
daveaspinall

Reputation: 1395

Thought you might like to know you can use 'import_id' instead of 'ID' and it will "try" and use that.

See the second example here: http://codex.wordpress.org/Function_Reference/wp_insert_post#Example

Upvotes: 27

yonilobo
yonilobo

Reputation: 163

As daveaspinall say. I do a function that do that.

require( 'wp-load.php' );
function simpleImportPost($title,$import_id,$content){
// Create post object
$my_post = array();
$my_post['post_title'] = $title;
$my_post['import_id']=$import_id;
$mypost['comment_status'] = 'closed';//I'll set all closed
$my_post['post_content'] = $content;
$my_post['post_status'] = 'publish';
$my_post['post_author'] = 1;
$my_post['post_category'] = array(0);
// Insert the post into the database
return wp_insert_post( $my_post );
}

example:

simpleImportPost('My Post 35',35,"35 Content");

Upvotes: 1

Ian Dunn
Ian Dunn

Reputation: 3680

It is possible to do this, just not with the API's insert function. You can write your own INSERT query instead. You always want to use the API when you can, but sometimes it's not possible. The query would look like this:

global $wpdb;
$wpdb->query( $wpdb->prepare("
    INSERT INTO {$wpdb->posts}
    VALUES( %d, %d, NOW(), %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, NOW(), %s, %s, %d, %s, %d, %s, %s, %d )",
    $ID,
    $post_author,
    $post_date_gmt,
    $post_content,
    $post_title,
    $post_excerpt,
    $post_status,
    $comment_status,
    $ping_status,
    $post_password,
    $post_name,
    $to_ping,
    $pinged,
    $post_modified_gmt,
    $post_content_filtered,
    $post_parent,
    $guid,
    $menu_order,
    $post_type,
    $post_mime_type,
    $comment_count
) );

You'll have to make sure that the ID doesn't already exist in the database first. If the post table schema changes in the future you may need to update the query to account for the changes.

Upvotes: 1

Banago
Banago

Reputation: 1420

Sorry buddy, not doable. Here is what the devs say at the codex:

IMPORTANT: Setting a value for $post['ID'] WILL NOT create a post with that ID number. Setting this value will cause the function to update the post with that ID number with the other values specified in $post. In short, to insert a new post, $post['ID'] must be blank or not set at all.

http://codex.wordpress.org/Function_Reference/wp_insert_post

Upvotes: 2

Related Questions