WPMU: Programmatically adding CPT posts to specific blog id

The question:

I’m trying to programmatically add press releases from an API, to specific sub sites (blog ID’s).

The application is quite large, but I’ve boiled it down for the purposes of this question. It runs outside of WP Core, only loading it while running, through wp-load.php.

require_once( "../wp-load.php" );

$blog_id = 2;
switch_to_blog( $blog_id );
$lang = 'en';

$new_pr = wp_insert_post(
    array(
        'post_author'   => 1,
        'post_status'   => 'publish',
        'post_type'     => 'pressreleases',
        'post_date'         => $this->publish_date,
        'post_content'      => $this->body,
        'post_title'        => $this->title,
        'tax_input'         => array(
            'pr_categories'     => $this->pr_category_id
        )
    )
);
var_dump( get_current_blog_id() ); // This returns (int)2, just like it should.
restore_current_blog();

Here’s the problem:
No matter what I put in the $blog_id variable, the release gets added to the blog with ID 1.

Am I missing something here?

The Solutions:

Below are the methods you can try. The first solution is probably the best. Try others if the first one doesn’t work. Senior developers aren’t just copying/pasting – they read the methods carefully & apply them wisely to each case.

Method 1

I finally found the answer myself. It’s two parts:

  1. I need the global $switched to be defined.
  2. The variable for blog id can’t be $blog_id because that’s reserved.

The above code should thus be the following.

require_once( "../wp-load.php" );

global $switched;
$blog_id_target = 2;
switch_to_blog($blog_id_target);

$lang = 'en';

$new_pr = wp_insert_post(
    array(
        'post_author'   => 1,
        'post_status'   => 'publish',
        'post_type'     => 'pressreleases',
        'post_date'         => $this->publish_date,
        'post_content'      => $this->body,
        'post_title'        => $this->title,
        'tax_input'         => array(
            'pr_categories'     => $this->pr_category_id
        )
    )
);
var_dump( get_current_blog_id() ); // This returns (int)2, just like it should.
restore_current_blog();


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

Leave a Comment