PluginProbe
Forumax – AI Powered Advanced Community Forum Plugin / trunk
Forumax – AI Powered Advanced Community Forum Plugin vtrunk
2.4.4 2.4.3 2.4.2 2.4.1 2.4.0 trunk 1.0.8 1.1.0 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.2.7 1.2.8 1.2.9 1.3.0 1.3.1 1.3.2 1.3.3 1.4.0 1.4.1 2.0.0 2.1.0 All 29 releases
bbp-core / lib / bbpress / includes / core / cache.php

cache.php in Forumax – AI Powered Advanced Community Forum Plugin trunk, at lib/bbpress/includes/core/cache.php

169 lines 4.6 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 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 }
169