Is there a faster way than wp_insert_post to add content to a blog

I’ve written a plugin which retrieves an xml file, parses and creates a series of short posts from the content.

Although each post is very short (sometimes just a single sentence, never more than a few sentences), there are around 1000 posts to create from the file.

Read More

Using wp_insert_post takes enough time for this job to timeout giving a 500 status.

I also encounter similar problems when deactivating the plugin and trying to move the same content.

Are there any quicker ways of populating (or removing) posts?

Related posts

Leave a Reply

2 comments

  1. You can access the database with an INSERT statement and add multiple rows at once.

    Something like this pseudo-code:

    INSERT INTO $wpdb->posts (
    `post_author`, 
    `post_date`, 
    `post_date_gmt`, 
    `post_content`, 
    `post_title`, 
    `post_status`, 
    `post_name`, 
    `post_modified`, 
    `guid`, 
    `post_type`, 
    `post_mime_type`
    ) 
    VALUES
        ( $user_id, $current_date,$current_date_gmt, $content1 ),
        ( $user_id, $current_date,$current_date_gmt, $content2 ),
        ( $user_id, $current_date,$current_date_gmt, $content3 )
    ;
    

    Make sure to fill all the values that are set to NOT NULL and have no default value in the post table schema.
    From wp-admin/includes/schema.php:

    CREATE TABLE $wpdb->posts (
      ID bigint(20) unsigned NOT NULL auto_increment,
      post_author bigint(20) unsigned NOT NULL default '0',
      post_date datetime NOT NULL default '0000-00-00 00:00:00',
      post_date_gmt datetime NOT NULL default '0000-00-00 00:00:00',
      post_content longtext NOT NULL,
      post_title text NOT NULL,
      post_excerpt text NOT NULL,
      post_status varchar(20) NOT NULL default 'publish',
      comment_status varchar(20) NOT NULL default 'open',
      ping_status varchar(20) NOT NULL default 'open',
      post_password varchar(20) NOT NULL default '',
      post_name varchar(200) NOT NULL default '',
      to_ping text NOT NULL,
      pinged text NOT NULL,
      post_modified datetime NOT NULL default '0000-00-00 00:00:00',
      post_modified_gmt datetime NOT NULL default '0000-00-00 00:00:00',
      post_content_filtered longtext NOT NULL,
      post_parent bigint(20) unsigned NOT NULL default '0',
      guid varchar(255) NOT NULL default '',
      menu_order int(11) NOT NULL default '0',
      post_type varchar(20) NOT NULL default 'post',
      post_mime_type varchar(100) NOT NULL default '',
      comment_count bigint(20) NOT NULL default '0',
      PRIMARY KEY  (ID),
      KEY post_name (post_name),
      KEY type_status_date (post_type,post_status,post_date,ID),
      KEY post_parent (post_parent),
      KEY post_author (post_author)
    ) $charset_collate;n";
    

    Also, regular posts need a default category. Not sure what happens if you omit that.

  2. Not using the API might save you a minute now but cost you hours later. I have done similiar things and run into timeouts but not 500, you should realy check the php and appache logs first to try and find the cuase.