Title: wp_insert_post
Last modified: August 30, 2016

---

# wp_insert_post

 *  Resolved [Kevin Chard](https://wordpress.org/support/users/wpsnipp/)
 * (@wpsnipp)
 * [10 years, 7 months ago](https://wordpress.org/support/topic/wp_insert_post-5/)
 * anyway to get this working for wp_insert_post ? I do some things on the front
   end with multisite that would be great to have this working. I don’t mind doing
   some editing if need be,
 * cheers
 * [https://wordpress.org/plugins/w3tc-auto-pilot/](https://wordpress.org/plugins/w3tc-auto-pilot/)

Viewing 11 replies - 1 through 11 (of 11 total)

 *  Plugin Author [Sybre Waaijer](https://wordpress.org/support/users/cybr/)
 * (@cybr)
 * [10 years, 7 months ago](https://wordpress.org/support/topic/wp_insert_post-5/#post-6698503)
 * Hi [@kevin](https://wordpress.org/support/users/kevin/) Chard,
 * I believe this can be achieved with the following code, it’s advised to not edit
   the plugin because an update will override your changes.
 * Add this piece of code anywhere after you’ve called wp_insert_post(), and it 
   should work.
 *     ```
       //Your wp_insert_post code.
       // wp_insert_post returns the post_id. So let's store it in a variable.
       $post_id = wp_insert_post( $args );
   
       if ( $post_id ) {
       	//* wp_insert_post has been successful. We're using the $post_id too.
       	if ( function_exists( 'w3_instance' ) && class_exists( 'W3TC_Auto_Pilot' ) ) {
       		//* If both w3tc and w3tc auto pilot are found, continue.
   
       		$w3tc_auto_pilot = new W3TC_Auto_Pilot();
   
       		if ( method_exists( $w3tc_auto_pilot, 'w3tc_flush_all' ) ) {
       			// This one flushes the latest 20 posts.
       			$w3tc_auto_pilot->w3tc_flush_all();
   
       			// This one flushes the home page and the new post.
       			$w3tc_auto_pilot->w3tc_flush_all( $post_id );
       		}
       	}
       }
       ```
   
 * Please note that I have not tested the code above.
 * Hope this helps! If you have any more questions, I’m here for you 🙂
 * Thanks!
 * EDIT:
 * The reason I’m not adding this to the plugin directly is because I would have
   to do a debug_backtrace() on PHP shutdown to find out if wp_insert_post took 
   place. Which is very resource expensive.
 * So adding the code above should work very well :).
 *  Thread Starter [Kevin Chard](https://wordpress.org/support/users/wpsnipp/)
 * (@wpsnipp)
 * [10 years, 7 months ago](https://wordpress.org/support/topic/wp_insert_post-5/#post-6698510)
 * Thanks so much for the help,
 * When I run the code on a site without a mapped domain it does appear to work 
   however anything with a domain I need to purge cache from within the admin. Nginx,
   Digital Ocean,
 * Does your snippet remove the whole cache i.e. for all sites ?
 * plugin I use
    [https://wordpress.org/plugins/wordpress-mu-domain-mapping/](https://wordpress.org/plugins/wordpress-mu-domain-mapping/)
 * tested switch_to_blog incase I needed to specify blog_id, the form is on main
   domain that updates users blog. Any suggestions would be greatly appreciated,
 *  Plugin Author [Sybre Waaijer](https://wordpress.org/support/users/cybr/)
 * (@cybr)
 * [10 years, 7 months ago](https://wordpress.org/support/topic/wp_insert_post-5/#post-6698517)
 * Hi [@kevin](https://wordpress.org/support/users/kevin/) Chard,
 * The snippet only removes the cache for the current site. It’s designed this way(
   I use multisite too) :).
 * The whole cache (of all sites) can be removed through the W3 Total Cache network
   admin menu, a big button on top of the settings page regarding the cache should
   then be pressed. Although, I must say it’s unreliable.
 * `switch_to_blog( $blog_id );` should be used if you wish to insert a post on 
   another blog ID.
    The code should be added between the switch_to_blog and restore_current_blog()
   function calls.
 * W3TC Auto Pilot uses W3 Total Cache’s functions to flush cache. This is because
   there are many types of cache that could be handled (disk, disk advanced, memcached,
   xcache, etc.).
 * The example would be, as you assumed correctly:
 *     ```
       // Switch to the blog you wish to insert the post.
       switch_to_blog( $blog_id );
   
       //Your wp_insert_post code.
       // wp_insert_post returns the post_id. So let's store it in a variable.
   
       // P.S. Do not forget to specify post_author within $args. Or else a random user will be assigned (cause of cache).
       $post_id = wp_insert_post( $args );
   
       if ( $post_id ) {
       	//* wp_insert_post has been successful. We're using the $post_id too.
       	if ( function_exists( 'w3_instance' ) && class_exists( 'W3TC_Auto_Pilot' ) {
       		//* If both w3tc and w3tc auto pilot are found, continue.
   
       		$w3tc_auto_pilot = new W3TC_Auto_Pilot();
   
       		if ( method_exists( $w3tc_auto_pilot, 'w3tc_flush_all' ) {
       			// This one flushes the latest 20 posts.
       			$w3tc_auto_pilot->w3tc_flush_all();
   
       			// This one flushes the home page and the new post.
       			$w3tc_auto_pilot->w3tc_flush_all( $post_id );
       		}
       	}
       }
   
       // Restore the current blog.
       restore_current_blog();
       ```
   
 * I’m unsure if this is what you were asking for, because your last sentence specified
   you already tested this. But just to be sure 🙂
 * I’m also unsure where you notice that the cache isn’t cleared correctly. Is it
   within the menu’s, widgets, front-page blog? Please elaborate on this part if
   you’re still having issues :).
 * Thanks and have a great day!
 *  Thread Starter [Kevin Chard](https://wordpress.org/support/users/wpsnipp/)
 * (@wpsnipp)
 * [10 years, 7 months ago](https://wordpress.org/support/topic/wp_insert_post-5/#post-6698518)
 * Hi Sabre,
    Ill do some testing and let you know, the specifics. Anyway to output
   data from your plugin that would help? so that I can be sure that the cache is
   clear etc.
 *  Plugin Author [Sybre Waaijer](https://wordpress.org/support/users/cybr/)
 * (@cybr)
 * [10 years, 7 months ago](https://wordpress.org/support/topic/wp_insert_post-5/#post-6698520)
 * Hi [@kevin](https://wordpress.org/support/users/kevin/) Chard,
 * At the bottom of each of the following functions (within w3tc-auto-pilot.php),
   add the following code:
 * The functions:
 *     ```
       w3tc_flush_all
       w3tc_flush_menu
       w3tc_flush_all_widget
       w3tc_flush_all_theme
       w3tc_flush_all_ajax_widget
       w3tc_flush_single_post
       w3tc_flush_object
       ```
   
 * The code, add it before the closing tag ( `}` ) of the function:
 *     ```
       error_log( __CLASS__ . '::' . __FUNCTION__ . ' has run.' );
       ```
   
 * This will output the function calls within the WordPress error log file located
   within /wp-content/.
 * Hope this helps!
 *  Thread Starter [Kevin Chard](https://wordpress.org/support/users/wpsnipp/)
 * (@wpsnipp)
 * [10 years, 7 months ago](https://wordpress.org/support/topic/wp_insert_post-5/#post-6698527)
 * Hi Sybre
    First off sorry about spelling your name wrong above, my MAC autocorrected
   your name. I did more testing and I don’t get any errors. I have however confirmed
   its not currently working. I should have let you know but I didn’t think about
   it at the time the code would be running within a plugin so I don’t know if that
   would change anything ? any globals or anything that might be required in order
   to work.
 *  Plugin Author [Sybre Waaijer](https://wordpress.org/support/users/cybr/)
 * (@cybr)
 * [10 years, 7 months ago](https://wordpress.org/support/topic/wp_insert_post-5/#post-6698529)
 * Hi [@kevin](https://wordpress.org/support/users/kevin/) Chard,
 * Not a problem! 🙂
 * As this isn’t an everyday problem, could you please answer the following questions,
   if you’re able to and want to:
 * 1. Could you please list all active modules from W3 Total Cache? These are found
   on this page:
    [http://example.com/wp-admin/network/admin.php?page=w3tc_general](http://example.com/wp-admin/network/admin.php?page=w3tc_general)
 * 2. I would also like to ask you to tell me where you notice that the cache isn’t
   cleared correctly. Is it within the menu’s, widgets, front-page blog?
 * 3. And last but not least: Did you write the code for wp_insert_post? If so, 
   could you post it here, if you wish of course? It would help me create a better
   solution for you to counter this issue 🙂
 * 4. Or does another plugin do the wp_insert_post call for you? If so, could you
   tell me which plugin that is?
 * Thank you very much and I hope you have a wonderful week!
 *  Thread Starter [Kevin Chard](https://wordpress.org/support/users/wpsnipp/)
 * (@wpsnipp)
 * [10 years, 7 months ago](https://wordpress.org/support/topic/wp_insert_post-5/#post-6698530)
 * 1. Active modules from W3 Total Cache
 * page_cache
    database_cache object_cache
 * Also have –> ” Use single network configuration file for all sites.” enabled
 * 2. Cache isn’t cleared
 *  a. Archive pages
    b. pages c. front page d. options (blog title, blog description,
   etc…)
 *  These are all updated via a plugin that resides on the fronted of the primary
   domain. It is a basic form, that people will create posts, change settings etc
   for their blog. I tested to make sure that the proper blog id and the post id
   etc. are being called.
 * 3. code for form, this is of course the editing form, rather than the insert 
   form. Insert form is the same minus ID and wp_insert rather then update.
 *     ```
       switch_to_blog(get_users_blog());
   
        	 $new_post = array(
       	    'ID' 	                => $form_id,
        	    'post_title'           => $title,
        	    'post_content'     => $content,
                   'post_excerpt'     => $excerpt,
        	    'post_status'       => $post_status,
        	    'post_author'      => $current_user->ID,
        	    'post_type'	        => 'news',
       	    'post_date'          => $publish_date,
       	    'post_date_gm'   => $publish_date,
        	  );
   
           if ( count($error) == 0 ) {
   
             $pid      = wp_update_post($new_post);
   
             set_post_thumbnail( $pid, $attachment_featured );
             update_post_meta( $pid, 'subtitle', $subtitle);
             update_post_meta( $pid, 'attachments_featured', $attachment_featured);
             update_post_meta( $pid, 'attachments', $attachment_ids);
   
           }
   
           restore_current_blog();
       ```
   
 *  Plugin Author [Sybre Waaijer](https://wordpress.org/support/users/cybr/)
 * (@cybr)
 * [10 years, 6 months ago](https://wordpress.org/support/topic/wp_insert_post-5/#post-6698557)
 * Hi [@kevin](https://wordpress.org/support/users/kevin/) Chard,
 * I advise you not to use Database cache, since good plugins refer back to Object
   Cache. It’s a manipulation which actually slows things down unless you have thousands
   of weekly active subscribers whom leave replies.
 * Either way, it’s best to have server-sided SQL query caching. If you use MySQL
   please refer to [https://rtcamp.com/tutorials/mysql/query-cache/](https://rtcamp.com/tutorials/mysql/query-cache/)
 * However, that’s apart from the issue you’re facing.
 * I just took a closer look on `switch_to_blog()` and I noticed it can’t interact
   with plugins. It’s basically only loading database tables and allows you to manipulate
   those. e.g. adding posts.
 * However, in the programming world, everything’s possible! So here’s an out-of-
   the-box solution, using the options API:
 *     ```
       function kchards_function() {
   
       	// Your code..
   
       	switch_to_blog( get_users_blog() );
   
       	$new_post = array(
       		'ID' 					=> $form_id,
       		'post_title' 			=> $title,
       		'post_content' 		=> $content,
       		'post_excerpt' 		=> $excerpt,
       		'post_status' 		=> $post_status,
       		'post_author' 		=> $current_user->ID,
       		'post_type' 			=> 'news',
       		'post_date' 			=> $publish_date,
       		'post_date_gm' 	=> $publish_date,
       	);
   
       	//* Where did you get $error from? Oh well...
       	if ( count($error) == 0 ) {
   
       		$pid = wp_update_post( $new_post );
   
       		//* Let's try not to update stuff for a random post. Only if $pid is correctly assigned, continue:
       		if ( $pid ) {
       			set_post_thumbnail( $pid, $attachment_featured );
       			update_post_meta( $pid, 'subtitle', $subtitle);
       			update_post_meta( $pid, 'attachments_featured', $attachment_featured);
       			update_post_meta( $pid, 'attachments', $attachment_ids);
   
       			/**
       			 * The out-of-the-box solution:
       			 *
       			 * Note the use of get_users_blog(). I assume it's the user's blog ID.
       			 */
       			$cache_key = 'lets_flush_this_blog_' . (string) get_users_blog();
   
       			/**
       			 * Update global site option (accessible on every blog)
       			 *
       			 * @see kchard_special_flush_the_blog()
       			 */
       			update_site_option( $cache_key, true );
       		}
   
       	}
   
       	restore_current_blog();
   
       	// Your code...
   
       }
   
       /**
        * Add the following code to a mu-plugin or the plugin you're working in. It has to run on INIT on EVERY blog.
        *
        *
        */
   
       //* Initialize the need for a flush check.
       add_action( 'init', 'kchard_special_flush_the_blog' );
   
       /**
        * Flush the blog's cache.
        *
        * @since 1.0.0
        *
        * @return bool|null True on flush, else void.
        */
       function kchard_special_flush_the_blog() {
   
       	/**
       	 * The out-of-the-box solution:
       	 *
       	 * Note the use of get_users_blog(). I assume it's the user's blog ID.
       	 */
       	$cache_key = 'lets_flush_this_blog_' . (string) get_users_blog();
   
       	if ( get_site_option( $cache_key ) ) {
       		if ( function_exists( 'w3_instance' ) && class_exists( 'W3TC_Auto_Pilot' ) ) {
       			//* If both w3tc and w3tc auto pilot are found, continue.
   
       			$w3tc_auto_pilot = new W3TC_Auto_Pilot();
   
       			if ( method_exists( $w3tc_auto_pilot, 'w3tc_flush_all' ) ) {
       				// This one flushes the latest 20 posts.
       				$w3tc_auto_pilot->w3tc_flush_all();
       			}
       		} else if ( function_exists( 'w3tc_flush_all' ) ) {
       			//* Fallback to default W3 Total Cache behaviour if Sybre's plugin is inactive.
   
       			w3tc_flush_all();
       		}
   
       		//* Don't run twice. So we set the option back to false.
       		update_site_option( $cache_key, false );
   
       		//* Return true for debugging purposes. Optional.
       		return true;
       	}
   
       	//* Return void for debugging purposes. Optional.
       	return;
       }
       ```
   
 * Please note that I have not tested this solution directly. I did however fetch
   it from the Sitemap’s API from The SEO Framework 🙂 ([https://wordpress.org/plugins/autodescription/](https://wordpress.org/plugins/autodescription/))
 * Hope this helps! 😀
 * Edit: I keep forgetting to close the if statements D:
 *  Thread Starter [Kevin Chard](https://wordpress.org/support/users/wpsnipp/)
 * (@wpsnipp)
 * [10 years, 6 months ago](https://wordpress.org/support/topic/wp_insert_post-5/#post-6698579)
 * looks like its working now. Ill do a little more testing but I think we may have
   it. Thanks, you have unbelivably helpful.
 * cheers
 *  Plugin Author [Sybre Waaijer](https://wordpress.org/support/users/cybr/)
 * (@cybr)
 * [10 years, 6 months ago](https://wordpress.org/support/topic/wp_insert_post-5/#post-6698583)
 * Hi [@kevin](https://wordpress.org/support/users/kevin/) Chard,
 * That’s very good to hear!
 * Please note that the flush will only happen with the code above when someone 
   visits a non-cached page or when a logged in user accesses a page. It’s impossible(
   with WordPress behavior) to do otherwise (since init isn’t run when loading a
   cached page).
 * I’ll mark this topic as resolved, you can change it back if you still encounter
   this issue and we’ll try to find another solution :).
 * If you are happy with the plugin, feel free to leave a review :). It would really
   help me out!
 * Thanks and have a great day!

Viewing 11 replies - 1 through 11 (of 11 total)

The topic ‘wp_insert_post’ is closed to new replies.

 * ![](https://s.w.org/plugins/geopattern-icon/w3tc-auto-pilot_6f7170.svg)
 * [W3TC Auto Pilot](https://wordpress.org/plugins/w3tc-auto-pilot/)
 * [Support Threads](https://wordpress.org/support/plugin/w3tc-auto-pilot/)
 * [Active Topics](https://wordpress.org/support/plugin/w3tc-auto-pilot/active/)
 * [Unresolved Topics](https://wordpress.org/support/plugin/w3tc-auto-pilot/unresolved/)
 * [Reviews](https://wordpress.org/support/plugin/w3tc-auto-pilot/reviews/)

 * 11 replies
 * 2 participants
 * Last reply from: [Sybre Waaijer](https://wordpress.org/support/users/cybr/)
 * Last activity: [10 years, 6 months ago](https://wordpress.org/support/topic/wp_insert_post-5/#post-6698583)
 * Status: resolved