[ Index ]

PHP Cross Reference of BBPress

title

Body

[close]

/src/includes/core/ -> cache.php (source)

   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  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 2.1.0 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 2.1.0 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 2.1.0 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  
  75          // Store the $post_id
  76          $this->updating_post = $post_id;
  77  
  78          // Skip related post cache invalidation. This prevents invalidating the
  79          // caches of the child posts when there is no reason to do so.
  80          add_action( 'clean_post_cache', array( $this, 'skip_related_posts' ) );
  81      }
  82  
  83      /**
  84       * Skip cache invalidation of related posts if the post ID being invalidated
  85       * is not the one that was just updated.
  86       *
  87       * @since 2.1.0 bbPress (r4011)
  88       *
  89       * @param int $post_id The post ID of the cache being invalidated
  90       * @return If invalid post data
  91       */
  92  	public function skip_related_posts( $post_id = 0 ) {
  93  
  94          // Bail if this post is not the current bbPress post
  95          if ( empty( $post_id ) || ( $this->updating_post !== $post_id ) ) {
  96              return;
  97          }
  98  
  99          // Stash the current cache invalidation value in a variable, so we can
 100          // restore back to it nicely in the future.
 101          global $_wp_suspend_cache_invalidation;
 102  
 103          $this->original_cache_invalidation = $_wp_suspend_cache_invalidation;
 104  
 105          // Turn off cache invalidation
 106          wp_suspend_cache_invalidation( true );
 107  
 108          // Restore cache invalidation
 109          add_action( 'wp_insert_post', array( $this, 'restore_cache_invalidation' ) );
 110      }
 111  
 112      /**
 113       * Restore the cache invalidation to its previous value.
 114       *
 115       * @since 2.1.0 bbPress (r4011)
 116       */
 117  	public function restore_cache_invalidation() {
 118          wp_suspend_cache_invalidation( $this->original_cache_invalidation );
 119      }
 120  }
 121  new BBP_Skip_Children();
 122  
 123  /** General *******************************************************************/
 124  
 125  /**
 126   * Will clean a post in the cache.
 127   *
 128   * Will call to clean the term object cache associated with the post ID.
 129   *
 130   * @since 2.1.0 bbPress (r4040)
 131   * @since 2.6.0 bbPress (r6053) Introduced the `$post_id` parameter.
 132   *
 133   * @param int     $post_id The post id.
 134   * @param WP_Post $post    The WP_Post object.
 135   */
 136  function bbp_clean_post_cache( $post_id = null, $post = null ) {
 137  
 138      // Child query types to clean
 139      $post_types = array(
 140          bbp_get_forum_post_type(),
 141          bbp_get_topic_post_type(),
 142          bbp_get_reply_post_type()
 143      );
 144  
 145      // Bail if not a bbPress post type
 146      if ( ! in_array( $post->post_type, $post_types, true ) ) {
 147          return;
 148      }
 149  
 150      /**
 151       * Fires immediately after the given post cache is cleaned.
 152       *
 153       * @since 2.1.0
 154       *
 155       * @param int     $post_id Post ID.
 156       * @param WP_Post $post    Post object.
 157       */
 158      do_action( 'bbp_clean_post_cache', $post->ID, $post );
 159  
 160      // Invalidate parent caches
 161      if ( ! empty( $post->post_parent ) ) {
 162          clean_post_cache( $post->post_parent );
 163  
 164      // Only bump `last_changed` when forum-root is reached
 165      } else {
 166          wp_cache_set( 'last_changed', microtime(), 'bbpress_posts' );
 167      }
 168  }


Generated: Mon Apr 29 01:01:00 2024 Cross-referenced by PHPXref 0.7.1