Viewing 11 replies - 1 through 11 (of 11 total)
  • Plugin Author Sybre Waaijer

    (@cybr)

    Hi @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

    (@wpsnipp)

    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/

    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

    (@cybr)

    Hi @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

    (@wpsnipp)

    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

    (@cybr)

    Hi @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

    (@wpsnipp)

    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

    (@cybr)

    Hi @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

    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

    (@wpsnipp)

    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

    (@cybr)

    Hi @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/

    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/)

    Hope this helps! πŸ˜€

    Edit: I keep forgetting to close the if statements D:

    Thread Starter Kevin Chard

    (@wpsnipp)

    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

    (@cybr)

    Hi @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.