Changeset 9693
- Timestamp:
- 04/03/2015 10:11:15 PM (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/bp-xprofile/bp-xprofile-cache.php
r9676 r9693 56 56 global $wpdb; 57 57 58 // Bail if no objects 58 59 if ( empty( $object_ids ) ) { 59 60 return false; 60 61 } 61 62 62 // $object_ids is a multi-dimensional array 63 $bp = buddypress(); 64 65 // Define the array where uncached object IDs will be stored 63 66 $uncached_object_ids = array( 64 'group' => array(),65 'field' => array(),66 'data' => array(),67 'group', 68 'field', 69 'data' 67 70 ); 68 71 72 // Define the cache groups for the 3 types of XProfile metadata 69 73 $cache_groups = array( 70 74 'group' => 'xprofile_group_meta', … … 73 77 ); 74 78 79 // No reason to query yet 75 80 $do_query = false; 76 foreach ( $uncached_object_ids as $object_type => $uncached_object_type_ids ) { 77 if ( ! empty( $object_ids[ $object_type ] ) ) { 78 79 // Sanitize $object_ids passed to the function 80 $object_type_ids = wp_parse_id_list( $object_ids[ $object_type ] ); 81 82 // Get non-cached IDs for each object type 83 $uncached_object_ids[ $object_type ] = bp_get_non_cached_ids( $object_type_ids, $cache_groups[ $object_type ] ); 84 85 // Set the flag to do the meta query 86 if ( ! empty( $uncached_object_ids[ $object_type ] ) && ! $do_query ) { 87 $do_query = true; 88 } 89 } 90 } 91 92 // If there are uncached items, go ahead with the query 93 if ( true === $do_query ) { 94 $where = array(); 95 foreach ( $uncached_object_ids as $otype => $oids ) { 96 if ( empty( $oids ) ) { 97 continue; 98 } 99 100 $oids_sql = implode( ',', wp_parse_id_list( $oids ) ); 101 $where[] = $wpdb->prepare( "( object_type = %s AND object_id IN ({$oids_sql}) )", $otype ); 102 } 103 $where_sql = implode( " OR ", $where ); 104 } 105 106 107 $bp = buddypress(); 108 $cache = array(); 81 82 // Loop through object types and look for uncached data 83 foreach ( $uncached_object_ids as $object_type ) { 84 85 // Skip if empty object type 86 if ( empty( $object_ids[ $object_type ] ) ) { 87 continue; 88 } 89 90 // Sanitize $object_ids passed to the function 91 $object_type_ids = wp_parse_id_list( $object_ids[ $object_type ] ); 92 93 // Get non-cached IDs for each object type 94 $uncached_object_ids[ $object_type ] = bp_get_non_cached_ids( $object_type_ids, $cache_groups[ $object_type ] ); 95 96 // Set the flag to do the meta query 97 if ( ! empty( $uncached_object_ids[ $object_type ] ) && ( false === $do_query ) ) { 98 $do_query = true; 99 } 100 } 101 102 // Bail if no uncached items 103 if ( false === $do_query ) { 104 return; 105 } 106 107 // Setup where conditions for query 108 $where_sql = ''; 109 $where_conditions = array(); 110 111 // Loop through uncached objects and prepare to query for them 112 foreach ( $uncached_object_ids as $otype => $oids ) { 113 114 // Skip empty object IDs 115 if ( empty( $oids ) ) { 116 continue; 117 } 118 119 // Compile WHERE query conditions for uncached metadata 120 $oids_sql = implode( ',', wp_parse_id_list( $oids ) ); 121 $where_conditions[] = $wpdb->prepare( "( object_type = %s AND object_id IN ({$oids_sql}) )", $otype ); 122 } 123 124 // Bail if no where conditions 125 if ( empty( $where_conditions ) ) { 126 return; 127 } 128 129 // Setup the WHERE query part 130 $where_sql = implode( " OR ", $where_conditions ); 131 132 // Attempt to query meta values 109 133 $meta_list = $wpdb->get_results( "SELECT object_id, object_type, meta_key, meta_value FROM {$bp->profile->table_name_meta} WHERE {$where_sql}" ); 110 134 111 if ( ! empty( $meta_list ) ) { 112 foreach ( $meta_list as $meta ) { 113 $oid = $meta->object_id; 114 $otype = $meta->object_type; 115 $okey = $meta->meta_key; 116 $ovalue = $meta->meta_value; 117 118 // Force subkeys to be array type 119 if ( ! isset( $cache[ $otype ][ $oid ] ) || ! is_array( $cache[ $otype ][ $oid ] ) ) { 120 $cache[ $otype ][ $oid ] = array(); 121 } 122 123 if ( ! isset( $cache[ $otype ][ $oid ][ $okey ] ) || ! is_array( $cache[ $otype ][ $oid ][ $okey ] ) ) { 124 $cache[ $otype ][ $oid ][ $okey ] = array(); 125 } 126 127 // Add to the cache array 128 $cache[ $otype ][ $oid ][ $okey ][] = maybe_unserialize( $ovalue ); 129 } 130 131 foreach ( $cache as $object_type => $object_caches ) { 132 $cache_group = $cache_groups[ $object_type ]; 133 foreach ( $object_caches as $object_id => $object_cache ) { 134 wp_cache_set( $object_id, $object_cache, $cache_group ); 135 } 136 } 137 } 138 139 return; 135 // Bail if no results found 136 if ( empty( $meta_list ) || is_wp_error( $meta_list ) ) { 137 return; 138 } 139 140 // Setup empty cache array 141 $cache = array(); 142 143 // Loop through metas 144 foreach ( $meta_list as $meta ) { 145 $oid = $meta->object_id; 146 $otype = $meta->object_type; 147 $okey = $meta->meta_key; 148 $ovalue = $meta->meta_value; 149 150 // Force subkeys to be array type 151 if ( ! isset( $cache[ $otype ][ $oid ] ) || ! is_array( $cache[ $otype ][ $oid ] ) ) { 152 $cache[ $otype ][ $oid ] = array(); 153 } 154 155 if ( ! isset( $cache[ $otype ][ $oid ][ $okey ] ) || ! is_array( $cache[ $otype ][ $oid ][ $okey ] ) ) { 156 $cache[ $otype ][ $oid ][ $okey ] = array(); 157 } 158 159 // Add to the cache array 160 $cache[ $otype ][ $oid ][ $okey ][] = maybe_unserialize( $ovalue ); 161 } 162 163 // Loop through data and cache to the appropriate object 164 foreach ( $cache as $object_type => $object_caches ) { 165 166 // Determine the cache group for this data 167 $cache_group = $cache_groups[ $object_type ]; 168 169 // Loop through objects and cache appropriately 170 foreach ( $object_caches as $object_id => $object_cache ) { 171 wp_cache_set( $object_id, $object_cache, $cache_group ); 172 } 173 } 140 174 } 141 175
Note: See TracChangeset
for help on using the changeset viewer.