PluginProbe
bbPress / 2.2
bbPress v2.2
trunk 2.0 2.0-beta-1 2.0-beta-2b 2.0-beta-3 2.0-beta-3b 2.0-rc-2 2.0-rc-3 2.0-rc-4 2.0-rc-5 2.0.1 2.0.2 2.0.3 2.1 2.1-beta-1 2.1-rc1 2.1-rc2 2.1-rc3 2.1-rc4 2.1.1 2.1.2 2.1.3 2.2 2.2.1 2.2.2 All 71 releases
bbpress / includes / core / cache.php

cache.php in bbPress 2.2, at includes/core/cache.php

169 lines 5.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
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 }
169