[ Index ] |
PHP Cross Reference of BBPress |
[Summary view] [Print] [Text view]
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 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Sat Dec 21 01:00:52 2024 | Cross-referenced by PHPXref 0.7.1 |