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