wp insert post – wp_insert_post always returns 0 on one site, extensive testing done, can’t get to the bottom


I have two sites. One, a fresh install, the other an existing site with errors/white screen of death on the wp-admin/post-new.php screen. I’ve disabled all of the active plugins, and enabled a default theme, and am still getting these errors (because the draft post is not created properly in the DB during the page load).

Notice: Trying to get property 'post_type' of non-object 
Warning: Creating default object from empty value
Notice: Trying to get property 'post_status' of non-object
Notice: Trying to get property 'ID' of non-object

I’ve tracked this down to an issue with wp_insert_post() when loading the wp-admin/post-new.php screen. For testing, I added a wp_die( print_r( $wpdb ) ); in the wp-includes/post.php core file (here). This outputs a lot of information about the database query. No errors are present, and it says [rows_affected] => 1, [insert_id] => 0, and the return of wp_insert_post() is always 0.

I can’t figure out why with a default core theme, no plugins active, no mu-plugins directory and no core files altered, wp_insert_post() is always returning 0. The post is inserted into the database, but it always has a post ID of 0 and the post-new.php screen white screens. When I have WP_DEBUG enabled, the above errors are present. I have a feeling it has to do with the one database, but I don’t see any errors that would indicate so. Both DBs are InnoDB and pretty much identical except for the data held within them.

My very basic code to test wp_insert_post() is as follows, and as stated works on one site and not the other.

$my_post = array(
    'post_title'    => 'test',
    'post_content'  => '',
    'post_status'   => 'publish',
    'post_author'   => 1,

// Insert the post into the database
$test = wp_insert_post( $my_post );

wp_die( 'New ID: ' . $test );

On the non-working site, the post is inserted into the database as post 0 and set to auto draft.

Var Dump from Broken $wpdb

Here is the var_dump of the $wpdb return inside of wp_insert_post() in the core file linked above: https://pastebin.com/CGGv5q4N

As you can see there are no visible errors, and it looks like the post should have been assigned a post ID, because it’s in the DB, but it’s always post ID 0.

Var Dump from Working $wpdb


Gary 11 months 2021-09-13T15:24:45-05:00 0 Answers 0 views 0

Leave an answer