Skip to:
Content

BuddyPress.org

source: trunk/bp-core/bp-core-cache.php @ 7821

Last change on this file since 7821 was 7821, checked in by boonebgorges, 8 years ago

Use 'save_post' hook to bust directory_pages cache

The save_post_{$post_type} hook did not exist until a recent version of
WordPress.

  • Property svn:eol-style set to native
File size: 7.1 KB
Line 
1<?php
2/**
3 * BuddyPress Core Caching Functions.
4 *
5 * Caching functions handle the clearing of cached objects and pages on specific
6 * actions throughout BuddyPress.
7 */
8
9// Exit if accessed directly
10if ( !defined( 'ABSPATH' ) ) exit;
11
12/**
13 * Prune the WP Super Cache.
14 *
15 * @see prune_super_cache()
16 *
17 * When wp-super-cache is installed this function will clear cached pages
18 * so that success/error messages are not cached, or time sensitive content.
19 */
20function bp_core_clear_cache() {
21        global $cache_path;
22
23        if ( function_exists( 'prune_super_cache' ) ) {
24                do_action( 'bp_core_clear_cache' );
25                return prune_super_cache( $cache_path, true );
26        }
27}
28
29/**
30 * Add 'bp' to global group of network wide cachable objects.
31 */
32function bp_core_add_global_group() {
33        if ( function_exists( 'wp_cache_add_global_groups' ) ) {
34                wp_cache_add_global_groups( array( 'bp' ) );
35        }
36}
37add_action( 'bp_loaded', 'bp_core_add_global_group' );
38
39/**
40 * Clear all cached objects for a user, or those that a user is part of.
41 */
42function bp_core_clear_user_object_cache( $user_id ) {
43        wp_cache_delete( 'bp_user_' . $user_id, 'bp' );
44}
45
46/**
47 * Clear member count caches and transients.
48 */
49function bp_core_clear_member_count_caches() {
50        wp_cache_delete( 'bp_total_member_count', 'bp' );
51        delete_transient( 'bp_active_member_count' );
52}
53add_action( 'bp_core_activated_user',         'bp_core_clear_member_count_caches' );
54add_action( 'bp_core_process_spammer_status', 'bp_core_clear_member_count_caches' );
55add_action( 'bp_core_deleted_account',        'bp_core_clear_member_count_caches' );
56add_action( 'bp_first_activity_for_member',   'bp_core_clear_member_count_caches' );
57add_action( 'deleted_user',                   'bp_core_clear_member_count_caches' );
58
59/**
60 * Clear the directory_pages cache when one of the pages is updated.
61 *
62 * @since BuddyPress (2.0.0)
63 *
64 * @param int $post_id
65 */
66function bp_core_clear_directory_pages_cache_page_edit( $post_id ) {
67        if ( ! bp_is_root_blog() ) {
68                return;
69        }
70
71        // Bail if BP is not defined here
72        if ( ! buddypress() ) {
73                return;
74        }
75
76        $page_ids = bp_core_get_directory_page_ids();
77
78        if ( ! in_array( $post_id, (array) $page_ids ) ) {
79                return;
80        }
81
82        wp_cache_delete( 'directory_pages', 'bp' );
83}
84add_action( 'save_post', 'bp_core_clear_directory_pages_cache_page_edit' );
85
86/**
87 * Clear the directory_pages cache when the bp-pages option is updated.
88 *
89 * @since BuddyPress (2.0.0)
90 *
91 * @param string $option Option name.
92 */
93function bp_core_clear_directory_pages_cache_settings_edit( $option ) {
94        if ( 'bp-pages' === $option ) {
95                wp_cache_delete( 'directory_pages', 'bp' );
96        }
97}
98add_action( 'update_option', 'bp_core_clear_directory_pages_cache_settings_edit' );
99
100/**
101 * Clear the root_blog_options cache when any of its options are updated.
102 *
103 * @since BuddyPress (2.0.0)
104 *
105 * @param string $option Option name.
106 */
107function bp_core_clear_root_options_cache( $option ) {
108        $keys = array_keys( bp_get_default_options() );
109        $keys = array_merge( $keys, array(
110                'registration',
111                'avatar_default',
112                'tags_blog_id',
113                'sitewide_tags_blog',
114                'registration',
115                'fileupload_mask',
116        ) );
117
118        if ( in_array( $option, $keys ) ) {
119                wp_cache_delete( 'root_blog_options', 'bp' );
120        }
121}
122add_action( 'update_option', 'bp_core_clear_root_options_cache' );
123add_action( 'update_site_option', 'bp_core_clear_root_options_cache' );
124add_action( 'add_option', 'bp_core_clear_root_options_cache' );
125add_action( 'add_site_option', 'bp_core_clear_root_options_cache' );
126
127/**
128 * Determine which items from a list do not have cached values.
129 *
130 * @since BuddyPress (2.0.0)
131 *
132 * @param array $item_ids ID list.
133 * @param string $cache_group The cache group to check against.
134 * @return array
135 */
136function bp_get_non_cached_ids( $item_ids, $cache_group ) {
137        $uncached = array();
138
139        foreach ( $item_ids as $item_id ) {
140                $item_id = (int) $item_id;
141                if ( false === wp_cache_get( $item_id, $cache_group ) ) {
142                        $uncached[] = $item_id;
143                }
144        }
145
146        return $uncached;
147}
148
149/**
150 * Update the metadata cache for the specified objects.
151 *
152 * Based on WordPress's {@link update_meta_cache()}, this function primes the
153 * cache with metadata related to a set of objects. This is typically done when
154 * querying for a loop of objects; pre-fetching metadata for each queried
155 * object can lead to dramatic performance improvements when using metadata
156 * in the context of template loops.
157 *
158 * @since BuddyPress (1.6.0)
159 *
160 * @global $wpdb WordPress database object for queries..
161 *
162 * @param array $args {
163 *     Array of arguments.
164 *     @type array|string $object_ids List of object IDs to fetch metadata for.
165 *           Accepts an array or a comma-separated list of numeric IDs.
166 *     @type string $object_type The type of object, eg 'groups' or 'activity'.
167 *     @type string $meta_table The name of the metadata table being queried.
168 *     @type string $object_column Optional. The name of the database column
169 *           where IDs (those provided by $object_ids) are found. Eg, 'group_id'
170 *           for the groups metadata tables. Default: $object_type . '_id'.
171 *     @type string $cache_key_prefix Optional. The prefix to use when creating
172 *           cache key names. Default: the value of $meta_table.
173 * }
174 * @return array|bool Metadata cache for the specified objects, or false on failure.
175 */
176function bp_update_meta_cache( $args = array() ) {
177        global $wpdb;
178
179        $defaults = array(
180                'object_ids'       => array(), // Comma-separated list or array of item ids
181                'object_type'      => '',      // Canonical component id: groups, members, etc
182                'meta_table'       => '',      // Name of the table containing the metadata
183                'object_column'    => '',      // DB column for the object ids (group_id, etc)
184                'cache_key_prefix' => ''       // Prefix to use when creating cache key names. Eg
185                                               //    'bp_groups_groupmeta'
186        );
187        $r = wp_parse_args( $args, $defaults );
188        extract( $r );
189
190        if ( empty( $object_ids ) || empty( $object_type ) || empty( $meta_table ) ) {
191                return false;
192        }
193
194        if ( empty( $cache_key_prefix ) ) {
195                $cache_key_prefix = $meta_table;
196        }
197
198        if ( empty( $object_column ) ) {
199                $object_column = $object_type . '_id';
200        }
201
202        $object_ids = wp_parse_id_list( $object_ids );
203
204        $cache = array();
205
206        // Get meta info
207        $id_list   = join( ',', $object_ids );
208        $meta_list = $wpdb->get_results( $wpdb->prepare( "SELECT {$object_column}, meta_key, meta_value FROM {$meta_table} WHERE {$object_column} IN ($id_list)", $object_type ), ARRAY_A );
209
210        if ( !empty( $meta_list ) ) {
211                foreach ( $meta_list as $metarow ) {
212                        $mpid = intval( $metarow[$object_column] );
213                        $mkey = $metarow['meta_key'];
214                        $mval = $metarow['meta_value'];
215
216                        // Force subkeys to be array type:
217                        if ( !isset( $cache[$mpid] ) || !is_array( $cache[$mpid] ) )
218                                $cache[$mpid] = array();
219                        if ( !isset( $cache[$mpid][$mkey] ) || !is_array( $cache[$mpid][$mkey] ) )
220                                $cache[$mpid][$mkey] = array();
221
222                        // Add a value to the current pid/key:
223                        $cache[$mpid][$mkey][] = $mval;
224                }
225        }
226
227        foreach ( $object_ids as $id ) {
228                if ( ! isset($cache[$id]) )
229                        $cache[$id] = array();
230
231                foreach( $cache[$id] as $meta_key => $meta_value ) {
232                        wp_cache_set( $cache_key_prefix . '_' . $id . '_' . $meta_key, $meta_value, 'bp' );
233                }
234        }
235
236        return $cache;
237}
Note: See TracBrowser for help on using the repository browser.