web/wp-content/plugins/bbpress/includes/core/cache.php
changeset 196 5e8dcbe22c24
equal deleted inserted replaced
195:c7c0fbc09788 196:5e8dcbe22c24
       
     1 <?php
       
     2 
       
     3 /**
       
     4  * bbPress Cache Helpers
       
     5  *
       
     6  * Helper functions used to communicate with WordPress's various caches. Many
       
     7  * of these functions are used to work around specific WordPress nuances. They
       
     8  * are subject to changes, tweaking, and will need iteration as performance
       
     9  * improvements are made to WordPress core.
       
    10  *
       
    11  * @package bbPress
       
    12  * @subpackage Cache
       
    13  */
       
    14 
       
    15 // Exit if accessed directly
       
    16 if ( !defined( 'ABSPATH' ) ) exit;
       
    17 
       
    18 /** Helpers *******************************************************************/
       
    19 
       
    20 /**
       
    21  * Skip invalidation of child post content when editing a parent.
       
    22  *
       
    23  * This prevents invalidating caches for topics and replies when editing a forum
       
    24  * or a topic. Without this in place, WordPress will attempt to invalidate all
       
    25  * child posts whenever a parent post is modified. This can cause thousands of
       
    26  * cache invalidations to occur on a single edit, which is no good for anyone.
       
    27  *
       
    28  * @since bbPress (r4011)
       
    29  *
       
    30  * @package bbPress
       
    31  * @subpackage Cache
       
    32  */
       
    33 class BBP_Skip_Children {
       
    34 
       
    35 	/**
       
    36 	 * @var int Post ID being updated
       
    37 	 */
       
    38 	private $updating_post = 0;
       
    39 
       
    40 	/**
       
    41 	 * @var bool The original value of $_wp_suspend_cache_invalidation global
       
    42 	 */
       
    43 	private $original_cache_invalidation = false;
       
    44 
       
    45 	/** Methods ***************************************************************/
       
    46 
       
    47 	/**
       
    48 	 * Hook into the 'pre_post_update' action.
       
    49 	 *
       
    50 	 * @since bbPress (r4011)
       
    51 	 */
       
    52 	public function __construct() {
       
    53 		add_action( 'pre_post_update', array( $this, 'pre_post_update' ) );
       
    54 	}
       
    55 
       
    56 	/**
       
    57 	 * Only clean post caches for main bbPress posts.
       
    58 	 *
       
    59 	 * Check that the post being updated is a bbPress post type, saves the
       
    60 	 * post ID to be used later, and adds an action to 'clean_post_cache' that
       
    61 	 * prevents child post caches from being cleared.
       
    62 	 *
       
    63 	 * @since bbPress (r4011)
       
    64 	 *
       
    65 	 * @param int $post_id The post ID being updated
       
    66 	 * @return If invalid post data
       
    67 	 */
       
    68 	public function pre_post_update( $post_id = 0 ) {
       
    69 
       
    70 		// Bail if post ID is not a bbPress post type
       
    71 		if ( empty( $post_id ) || ! bbp_is_custom_post_type( $post_id ) )
       
    72 			return;
       
    73 
       
    74 		// Store the $post_id
       
    75 		$this->updating_post = $post_id;
       
    76 
       
    77 		// Skip related post cache invalidation. This prevents invalidating the
       
    78 		// caches of the child posts when there is no reason to do so.
       
    79 		add_action( 'clean_post_cache', array( $this, 'skip_related_posts' ) );
       
    80 	}
       
    81 
       
    82 	/**
       
    83 	 * Skip cache invalidation of related posts if the post ID being invalidated
       
    84 	 * is not the one that was just updated.
       
    85 	 *
       
    86 	 * @since bbPress (r4011)
       
    87 	 *
       
    88 	 * @param int $post_id The post ID of the cache being invalidated
       
    89 	 * @return If invalid post data
       
    90 	 */
       
    91 	public function skip_related_posts( $post_id = 0 ) {
       
    92 
       
    93 		// Bail if this post is not the current bbPress post
       
    94 		if ( empty( $post_id ) || ( $this->updating_post !== $post_id ) )
       
    95 			return;
       
    96 
       
    97 		// Stash the current cache invalidation value in a variable, so we can
       
    98 		// restore back to it nicely in the future.
       
    99 		global $_wp_suspend_cache_invalidation;
       
   100 
       
   101 		$this->original_cache_invalidation = $_wp_suspend_cache_invalidation;
       
   102 
       
   103 		// Turn off cache invalidation
       
   104 		wp_suspend_cache_invalidation( true );
       
   105 
       
   106 		// Restore cache invalidation
       
   107 		add_action( 'wp_insert_post', array( $this, 'restore_cache_invalidation' ) );
       
   108 	}
       
   109 
       
   110 	/**
       
   111 	 * Restore the cache invalidation to its previous value.
       
   112 	 *
       
   113 	 * @since bbPress (r4011)
       
   114 	 * @uses wp_suspend_cache_invalidation()
       
   115 	 */
       
   116 	public function restore_cache_invalidation() {
       
   117 		wp_suspend_cache_invalidation( $this->original_cache_invalidation );
       
   118 	}
       
   119 }
       
   120 new BBP_Skip_Children();
       
   121 
       
   122 /** General *******************************************************************/
       
   123 
       
   124 /**
       
   125  * Will clean a post in the cache.
       
   126  *
       
   127  * Will call to clean the term object cache associated with the post ID.
       
   128  *
       
   129  * @since bbPress (r4040)
       
   130  *
       
   131  * @uses do_action() Calls 'bbp_clean_post_cache' on $id
       
   132  * @param object|int $_post The post object or ID to remove from the cache
       
   133  */
       
   134 function bbp_clean_post_cache( $_post = '' ) {
       
   135 
       
   136 	// Bail if no post
       
   137 	$_post = get_post( $_post );
       
   138 	if ( empty( $_post ) )
       
   139 		return;
       
   140 
       
   141 	wp_cache_delete( $_post->ID, 'posts'     );
       
   142 	wp_cache_delete( $_post->ID, 'post_meta' );
       
   143 
       
   144 	clean_object_term_cache( $_post->ID, $_post->post_type );
       
   145 
       
   146 	do_action( 'bbp_clean_post_cache', $_post->ID, $_post );
       
   147 
       
   148 	// Child query types to clean
       
   149 	$post_types = array(
       
   150 		bbp_get_topic_post_type(),
       
   151 		bbp_get_forum_post_type(),
       
   152 		bbp_get_reply_post_type()
       
   153 	);
       
   154 
       
   155 	// Loop through query types and clean caches
       
   156 	foreach ( $post_types as $post_type ) {
       
   157 		wp_cache_delete( 'bbp_get_forum_'     . $_post->ID . '_reply_id',                              'bbpress' );
       
   158 		wp_cache_delete( 'bbp_parent_'        . $_post->ID . '_type_' . $post_type . '_child_last_id', 'bbpress' );
       
   159 		wp_cache_delete( 'bbp_parent_'        . $_post->ID . '_type_' . $post_type . '_child_count',   'bbpress' );
       
   160 		wp_cache_delete( 'bbp_parent_public_' . $_post->ID . '_type_' . $post_type . '_child_ids',     'bbpress' );
       
   161 		wp_cache_delete( 'bbp_parent_all_'    . $_post->ID . '_type_' . $post_type . '_child_ids',     'bbpress' );
       
   162 	}
       
   163 
       
   164 	// Invalidate parent caches
       
   165 	if ( ! empty( $_post->post_parent ) ) {
       
   166 		bbp_clean_post_cache( $_post->post_parent );
       
   167 	}
       
   168 }