WordPress.org

Make WordPress Core

Ticket #25344: 25344.10.network-meta.diff

File 25344.10.network-meta.diff, 29.3 KB (added by flixos90, 7 months ago)
  • src/wp-includes/class-wp-network-query.php

     
    4242        ); 
    4343 
    4444        /** 
     45         * Metadata query container. 
     46         * 
     47         * @since 4.8.0 
     48         * @access public 
     49         * @var object WP_Meta_Query 
     50         */ 
     51        public $meta_query = false; 
     52 
     53        /** 
     54         * Metadata query clauses. 
     55         * 
     56         * @since 4.8.0 
     57         * @access protected 
     58         * @var array 
     59         */ 
     60        protected $meta_query_clauses = array(); 
     61 
     62        /** 
    4563         * Query vars set by the user. 
    4664         * 
    4765         * @since 4.6.0 
     
    92110         * Sets up the network query, based on the query vars passed. 
    93111         * 
    94112         * @since 4.6.0 
     113         * @since 4.8.0 Introduced the `update_network_meta_cache`, `meta_query`, 
     114         *              `meta_key`, `meta_value`, `meta_type` and `meta_compare` 
     115         *              parameters. 
    95116         * @access public 
    96117         * 
    97118         * @param string|array $query { 
    98119         *     Optional. Array or query string of network query parameters. Default empty. 
    99120         * 
    100          *     @type array        $network__in          Array of network IDs to include. Default empty. 
    101          *     @type array        $network__not_in      Array of network IDs to exclude. Default empty. 
    102          *     @type bool         $count                Whether to return a network count (true) or array of network objects. 
    103          *                                              Default false. 
    104          *     @type string       $fields               Network fields to return. Accepts 'ids' (returns an array of network IDs) 
    105          *                                              or empty (returns an array of complete network objects). Default empty. 
    106          *     @type int          $number               Maximum number of networks to retrieve. Default empty (no limit). 
    107          *     @type int          $offset               Number of networks to offset the query. Used to build LIMIT clause. 
    108          *                                              Default 0. 
    109          *     @type bool         $no_found_rows        Whether to disable the `SQL_CALC_FOUND_ROWS` query. Default true. 
    110          *     @type string|array $orderby              Network status or array of statuses. Accepts 'id', 'domain', 'path', 
    111          *                                              'domain_length', 'path_length' and 'network__in'. Also accepts false, 
    112          *                                              an empty array, or 'none' to disable `ORDER BY` clause. Default 'id'. 
    113          *     @type string       $order                How to order retrieved networks. Accepts 'ASC', 'DESC'. Default 'ASC'. 
    114          *     @type string       $domain               Limit results to those affiliated with a given domain. Default empty. 
    115          *     @type array        $domain__in           Array of domains to include affiliated networks for. Default empty. 
    116          *     @type array        $domain__not_in       Array of domains to exclude affiliated networks for. Default empty. 
    117          *     @type string       $path                 Limit results to those affiliated with a given path. Default empty. 
    118          *     @type array        $path__in             Array of paths to include affiliated networks for. Default empty. 
    119          *     @type array        $path__not_in         Array of paths to exclude affiliated networks for. Default empty. 
    120          *     @type string       $search               Search term(s) to retrieve matching networks for. Default empty. 
    121          *     @type bool         $update_network_cache Whether to prime the cache for found networks. Default true. 
     121         *     @type array        $network__in               Array of network IDs to include. Default empty. 
     122         *     @type array        $network__not_in           Array of network IDs to exclude. Default empty. 
     123         *     @type bool         $count                     Whether to return a network count (true) or array of network objects. 
     124         *                                                   Default false. 
     125         *     @type string       $fields                    Network fields to return. Accepts 'ids' (returns an array of network IDs) 
     126         *                                                   or empty (returns an array of complete network objects). Default empty. 
     127         *     @type int          $number                    Maximum number of networks to retrieve. Default empty (no limit). 
     128         *     @type int          $offset                    Number of networks to offset the query. Used to build LIMIT clause. 
     129         *                                                   Default 0. 
     130         *     @type bool         $no_found_rows             Whether to disable the `SQL_CALC_FOUND_ROWS` query. Default true. 
     131         *     @type string|array $orderby                   Network status or array of statuses. Accepts 'id', 'domain', 'path', 
     132         *                                                   'domain_length', 'path_length' and 'network__in'. Also accepts false, 
     133         *                                                   an empty array, or 'none' to disable `ORDER BY` clause. Default 'id'. 
     134         *     @type string       $order                     How to order retrieved networks. Accepts 'ASC', 'DESC'. Default 'ASC'. 
     135         *     @type string       $domain                    Limit results to those affiliated with a given domain. Default empty. 
     136         *     @type array        $domain__in                Array of domains to include affiliated networks for. Default empty. 
     137         *     @type array        $domain__not_in            Array of domains to exclude affiliated networks for. Default empty. 
     138         *     @type string       $path                      Limit results to those affiliated with a given path. Default empty. 
     139         *     @type array        $path__in                  Array of paths to include affiliated networks for. Default empty. 
     140         *     @type array        $path__not_in              Array of paths to exclude affiliated networks for. Default empty. 
     141         *     @type string       $search                    Search term(s) to retrieve matching networks for. Default empty. 
     142         *     @type bool         $update_network_cache      Whether to prime the cache for found networks. Default true. 
     143         *     @type bool         $update_network_meta_cache Whether to prime meta caches for found networks. Default true. 
     144         *     @type array        $meta_query                Optional. Meta query clauses to limit retrieved networks by. 
     145         *                                                   See `WP_Meta_Query`. Default empty. 
     146         *     @type string       $meta_key                  Limit networks to those matching a specific metadata key. 
     147         *                                                   Can be used in conjunction with `$meta_value`. Default empty. 
     148         *     @type string       $meta_value                Limit networks to those matching a specific metadata value. 
     149         *                                                   Usually used in conjunction with `$meta_key`. Default empty. 
     150         *     @type string       $meta_type                 Type of object metadata is for (e.g., comment, post, or user). 
     151         *                                                   Default empty. 
     152         *     @type string       $meta_compare              Comparison operator to test the 'meta_value'. Default empty. 
    122153         * } 
    123154         */ 
    124155        public function __construct( $query = '' ) { 
    125156                $this->query_var_defaults = array( 
    126                         'network__in'          => '', 
    127                         'network__not_in'      => '', 
    128                         'count'                => false, 
    129                         'fields'               => '', 
    130                         'number'               => '', 
    131                         'offset'               => '', 
    132                         'no_found_rows'        => true, 
    133                         'orderby'              => 'id', 
    134                         'order'                => 'ASC', 
    135                         'domain'               => '', 
    136                         'domain__in'           => '', 
    137                         'domain__not_in'       => '', 
    138                         'path'                 => '', 
    139                         'path__in'             => '', 
    140                         'path__not_in'         => '', 
    141                         'search'               => '', 
    142                         'update_network_cache' => true, 
     157                        'network__in'               => '', 
     158                        'network__not_in'           => '', 
     159                        'count'                     => false, 
     160                        'fields'                    => '', 
     161                        'number'                    => '', 
     162                        'offset'                    => '', 
     163                        'no_found_rows'             => true, 
     164                        'orderby'                   => 'id', 
     165                        'order'                     => 'ASC', 
     166                        'domain'                    => '', 
     167                        'domain__in'                => '', 
     168                        'domain__not_in'            => '', 
     169                        'path'                      => '', 
     170                        'path__in'                  => '', 
     171                        'path__not_in'              => '', 
     172                        'search'                    => '', 
     173                        'update_network_cache'      => true, 
     174                        'update_network_meta_cache' => true, 
     175                        'meta_query'                => '', 
     176                        'meta_key'                  => '', 
     177                        'meta_value'                => '', 
     178                        'meta_type'                 => '', 
     179                        'meta_compare'              => '', 
    143180                ); 
    144181 
    145182                if ( ! empty( $query ) ) { 
     
    193230         * @since 4.6.0 
    194231         * @access public 
    195232         * 
     233         * @global wpdb $wpdb WordPress database abstraction object. 
     234         * 
    196235         * @return int|array The list of networks. 
    197236         */ 
    198237        public function get_networks() { 
     238                global $wpdb; 
     239 
    199240                $this->parse_query(); 
    200241 
     242                // Set up meta_query so it's available to 'pre_get_networks'. 
     243                if ( class_exists( 'WP_Meta_Query' ) ) { 
     244                        $this->meta_query = new WP_Meta_Query(); 
     245                        $this->meta_query->parse_query_vars( $this->query_vars ); 
     246                } 
     247 
    201248                /** 
    202249                 * Fires before networks are retrieved. 
    203250                 * 
     
    207254                 */ 
    208255                do_action_ref_array( 'pre_get_networks', array( &$this ) ); 
    209256 
     257                // Reparse query vars, in case they were modified in a 'pre_get_comments' callback. 
     258                if ( $this->meta_query ) { 
     259                        $this->meta_query->parse_query_vars( $this->query_vars ); 
     260                        if ( ! empty( $this->meta_query->queries ) ) { 
     261                                $this->meta_query_clauses = $this->meta_query->get_sql( 'site', $wpdb->site, 'id', $this ); 
     262                        } 
     263                } 
     264 
    210265                // $args can include anything. Only use the args defined in the query_var_defaults to compute the key. 
    211266                $key = md5( serialize( wp_array_slice_assoc( $this->query_vars, array_keys( $this->query_var_defaults ) ) ) ); 
    212267                $last_changed = wp_cache_get_last_changed( 'networks' ); 
     
    248303                } 
    249304 
    250305                if ( $this->query_vars['update_network_cache'] ) { 
    251                         _prime_network_caches( $network_ids ); 
     306                        if ( $this->meta_query ) { 
     307                                _prime_network_caches( $network_ids, $this->query_vars['update_network_meta_cache'] ); 
     308                        } else { 
     309                                _prime_network_caches( $network_ids, false ); 
     310                        } 
    252311                } 
    253312 
    254313                // Fetch full network objects from the primed cache. 
     
    394453 
    395454                $join = ''; 
    396455 
     456                if ( ! empty( $this->meta_query_clauses ) ) { 
     457                        $join .= $this->meta_query_clauses['join']; 
     458 
     459                        // Strip leading 'AND'. 
     460                        $this->sql_clauses['where']['meta_query'] = preg_replace( '/^\s*AND\s*/', '', $this->meta_query_clauses['where'] ); 
     461 
     462                        if ( ! $this->query_vars['count'] ) { 
     463                                $groupby = "$wpdb->site.id"; 
     464                        } 
     465                } 
     466 
    397467                $where = implode( ' AND ', $this->sql_clauses['where'] ); 
    398468 
    399469                $pieces = array( 'fields', 'join', 'where', 'orderby', 'limits', 'groupby' ); 
     
    533603                        $parsed = "$wpdb->site.$orderby"; 
    534604                } 
    535605 
     606                if ( ! $parsed && $this->meta_query ) { 
     607                        switch ( $orderby ) { 
     608                                case $this->query_vars['meta_key']: 
     609                                case 'meta_value': 
     610                                        $parsed = "$wpdb->sitemeta.meta_value"; 
     611                                        break; 
     612                                case 'meta_value_num': 
     613                                        $parsed = "$wpdb->sitemeta.meta_value+0"; 
     614                                        break; 
     615                                default: 
     616                                        $meta_query_clauses = $this->meta_query->get_clauses(); 
     617                                        if ( $meta_query_clauses && isset( $meta_query_clauses[ $orderby ] ) ) { 
     618                                                $meta_clause = $meta_query_clauses[ $orderby ]; 
     619                                                $parsed = sprintf( "CAST(%s.meta_value AS %s)", esc_sql( $meta_clause['alias'] ), esc_sql( $meta_clause['cast'] ) ); 
     620                                        } 
     621                        } 
     622                } 
     623 
    536624                return $parsed; 
    537625        } 
    538626 
  • src/wp-includes/load.php

     
    515515        } 
    516516 
    517517        if ( function_exists( 'wp_cache_add_global_groups' ) ) { 
    518                 wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'useremail', 'userslugs', 'site-transient', 'site-options', 'blog-lookup', 'blog-details', 'site-details', 'rss', 'global-posts', 'blog-id-cache', 'networks', 'sites' ) ); 
     518                wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'useremail', 'userslugs', 'site-transient', 'site-options', 'blog-lookup', 'blog-details', 'site-details', 'rss', 'global-posts', 'blog-id-cache', 'networks', 'sites', 'site_meta' ) ); 
    519519                wp_cache_add_non_persistent_groups( array( 'counts', 'plugins' ) ); 
    520520        } 
    521521} 
  • src/wp-includes/ms-blogs.php

     
    842842                        if ( is_array( $global_groups ) ) { 
    843843                                wp_cache_add_global_groups( $global_groups ); 
    844844                        } else { 
    845                                 wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'useremail', 'userslugs', 'site-transient', 'site-options', 'blog-lookup', 'blog-details', 'rss', 'global-posts', 'blog-id-cache', 'networks', 'sites', 'site-details' ) ); 
     845                                wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'useremail', 'userslugs', 'site-transient', 'site-options', 'blog-lookup', 'blog-details', 'rss', 'global-posts', 'blog-id-cache', 'networks', 'sites', 'site-details', 'site_meta' ) ); 
    846846                        } 
    847847                        wp_cache_add_non_persistent_groups( array( 'counts', 'plugins' ) ); 
    848848                } 
     
    916916                        if ( is_array( $global_groups ) ) { 
    917917                                wp_cache_add_global_groups( $global_groups ); 
    918918                        } else { 
    919                                 wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'useremail', 'userslugs', 'site-transient', 'site-options', 'blog-lookup', 'blog-details', 'rss', 'global-posts', 'blog-id-cache', 'networks', 'sites', 'site-details' ) ); 
     919                                wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'useremail', 'userslugs', 'site-transient', 'site-options', 'blog-lookup', 'blog-details', 'rss', 'global-posts', 'blog-id-cache', 'networks', 'sites', 'site-details', 'site_meta' ) ); 
    920920                        } 
    921921                        wp_cache_add_non_persistent_groups( array( 'counts', 'plugins' ) ); 
    922922                } 
     
    11531153} 
    11541154 
    11551155/** 
     1156 * Add metadata to a network. 
     1157 * 
     1158 * @since 4.8.0 
     1159 * 
     1160 * @param int    $id         Network ID. 
     1161 * @param string $meta_key   Metadata name. 
     1162 * @param mixed  $meta_value Metadata value. Must be serializable if non-scalar. 
     1163 * @param bool   $unique     Optional. Whether the same key should not be added. 
     1164 *                           Default false. 
     1165 * @return int|false Meta ID on success, false on failure. 
     1166 */ 
     1167function add_network_meta( $id, $meta_key, $meta_value, $unique = false ) { 
     1168        $added = add_metadata( 'site', $id, $meta_key, $meta_value, $unique ); 
     1169 
     1170        if ( $added ) { 
     1171                wp_cache_set( 'last_changed', microtime(), 'networks' ); 
     1172        } 
     1173 
     1174        return $added; 
     1175} 
     1176 
     1177/** 
     1178 * Remove from a network, metadata matching key and/or value. 
     1179 * 
     1180 * You can match based on the key, or key and value. Removing based on key and 
     1181 * value, will keep from removing duplicate metadata with the same key. It also 
     1182 * allows removing all metadata matching key, if needed. 
     1183 * 
     1184 * @since 4.8.0 
     1185 * 
     1186 * @param int    $id         Network ID. 
     1187 * @param string $meta_key   Metadata name. 
     1188 * @param mixed  $meta_value Optional. Metadata value. Must be serializable if 
     1189 *                           non-scalar. Default empty. 
     1190 * @return bool True on success, false on failure. 
     1191 */ 
     1192function delete_network_meta( $id, $meta_key, $meta_value = '' ) { 
     1193        $deleted = delete_metadata( 'site', $id, $meta_key, $meta_value ); 
     1194 
     1195        if ( $deleted ) { 
     1196                wp_cache_set( 'last_changed', microtime(), 'networks' ); 
     1197        } 
     1198 
     1199        return $deleted; 
     1200} 
     1201 
     1202/** 
     1203 * Retrieve from a network, metadata value by key. 
     1204 * 
     1205 * @since 4.8.0 
     1206 * 
     1207 * @param int    $id        Network ID. 
     1208 * @param string $meta_key  Optional. The meta key to retrieve. By default, returns 
     1209 *                          data for all keys. Default empty. 
     1210 * @param bool   $single    Optional. Whether to return a single value. Default false. 
     1211 * @return mixed Will be an array if $single is false. Will be value of meta data 
     1212 *               field if $single is true. 
     1213 */ 
     1214function get_network_meta( $id, $meta_key = '', $single = false ) { 
     1215        return get_metadata( 'site', $id, $meta_key, $single ); 
     1216} 
     1217 
     1218/** 
     1219 * Update metadata for a network ID, and/or key, and/or value. 
     1220 * 
     1221 * Use the $prev_value parameter to differentiate between meta fields with the 
     1222 * same key and network ID. 
     1223 * 
     1224 * If the meta field for the network does not exist, it will be added. 
     1225 * 
     1226 * @since 4.8.0 
     1227 * 
     1228 * @param int    $id         Network ID. 
     1229 * @param string $meta_key   Metadata key. 
     1230 * @param mixed  $meta_value Metadata value. Must be serializable if non-scalar. 
     1231 * @param mixed  $prev_value Optional. Previous value to check before removing. 
     1232 *                           Default empty. 
     1233 * @return int|bool Meta ID if the key didn't exist, true on successful update, 
     1234 *                  false on failure. 
     1235 */ 
     1236function update_network_meta( $id, $meta_key, $meta_value, $prev_value = '' ) { 
     1237        $updated = update_metadata( 'site', $id, $meta_key, $meta_value, $prev_value ); 
     1238 
     1239        if ( $updated ) { 
     1240                wp_cache_set( 'last_changed', microtime(), 'networks' ); 
     1241        } 
     1242 
     1243        return $updated; 
     1244} 
     1245 
     1246/** 
     1247 * Delete everything from network meta matching meta key. 
     1248 * 
     1249 * @since 4.8.0 
     1250 * 
     1251 * @param string $network_meta_key Key to search for when deleting. 
     1252 * 
     1253 * @return bool Whether the network meta key was deleted from the database. 
     1254 */ 
     1255function delete_network_meta_by_key( $network_meta_key ) { 
     1256        $deleted = delete_metadata( 'site', null, $network_meta_key, '', true ); 
     1257 
     1258        if ( $deleted ) { 
     1259                wp_cache_set( 'last_changed', microtime(), 'networks' ); 
     1260        } 
     1261 
     1262        return $deleted; 
     1263} 
     1264 
     1265/** 
    11561266 * Removes a network from the object cache. 
    11571267 * 
    11581268 * @since 4.6.0 
     
    11701280 
    11711281        foreach ( (array) $ids as $id ) { 
    11721282                wp_cache_delete( $id, 'networks' ); 
     1283                wp_cache_delete( $id, 'site_meta' ); 
    11731284 
    11741285                /** 
    11751286                 * Fires immediately after a network has been removed from the object cache. 
     
    11921303 * cache using the network group with the key using the ID of the networks. 
    11931304 * 
    11941305 * @since 4.6.0 
     1306 * @since 4.8.0 Introduced the `$update_meta_cache` parameter. 
    11951307 * 
    1196  * @param array $networks Array of network row objects. 
     1308 * @param array $networks          Array of network row objects. 
     1309 * @param bool  $update_meta_cache Optional. Whether to update the meta cache. Default true. 
    11971310 */ 
    1198 function update_network_cache( $networks ) { 
     1311function update_network_cache( $networks, $update_meta_cache = true ) { 
    11991312        foreach ( (array) $networks as $network ) { 
    12001313                wp_cache_add( $network->id, $network, 'networks' ); 
    12011314        } 
     1315 
     1316        if ( $update_meta_cache ) { 
     1317                update_networkmeta_cache( wp_list_pluck( $networks, 'id' ) ); 
     1318        } 
     1319} 
     1320 
     1321/** 
     1322 * Updates metadata cache for list of network IDs. 
     1323 * 
     1324 * Performs SQL query to retrieve the metadata for the network IDs and updates the 
     1325 * metadata cache for the posts. Therefore, the functions, which call this 
     1326 * function, do not need to perform SQL queries on their own. 
     1327 * 
     1328 * @since 4.8.0 
     1329 * 
     1330 * @param array $network_ids List of network IDs. 
     1331 * @return array|false Returns false if there is nothing to update or an array 
     1332 *                     of metadata. 
     1333 */ 
     1334function update_networkmeta_cache( $network_ids) { 
     1335        return update_meta_cache( 'site', $network_ids ); 
    12021336} 
    12031337 
    12041338/** 
    12051339 * Adds any networks from the given IDs to the cache that do not already exist in cache. 
    12061340 * 
    12071341 * @since 4.6.0 
     1342 * @since 4.8.0 Introduced the `$update_meta_cache` parameter. 
    12081343 * @access private 
    12091344 * 
    12101345 * @see update_network_cache() 
    12111346 * @global wpdb $wpdb WordPress database abstraction object. 
    12121347 * 
    1213  * @param array $network_ids Array of network IDs. 
     1348 * @param array $network_ids       Array of network IDs. 
     1349 * @param bool  $update_meta_cache Optional. Whether to update the meta cache. Default true. 
    12141350 */ 
    1215 function _prime_network_caches( $network_ids ) { 
     1351function _prime_network_caches( $network_ids, $update_meta_cache = true ) { 
    12161352        global $wpdb; 
    12171353 
    12181354        $non_cached_ids = _get_non_cached_ids( $network_ids, 'networks' ); 
    1219         if ( !empty( $non_cached_ids ) ) { 
    1220                 $fresh_networks = $wpdb->get_results( sprintf( "SELECT $wpdb->site.* FROM $wpdb->site WHERE id IN (%s)", join( ",", array_map( 'intval', $non_cached_ids ) ) ) ); 
     1355        if ( ! empty( $non_cached_ids ) ) { 
     1356                $fresh_networks = $wpdb->get_results( sprintf( "SELECT * FROM {$wpdb->site} WHERE id IN (%s)", join( ",", array_map( 'intval', $non_cached_ids ) ) ) ); 
    12211357 
    1222                 update_network_cache( $fresh_networks ); 
     1358                update_network_cache( $fresh_networks, $update_meta_cache ); 
    12231359        } 
    12241360} 
    12251361 
  • tests/phpunit/includes/testcase.php

     
    301301                        $wp_object_cache->__remoteset(); 
    302302                } 
    303303                wp_cache_flush(); 
    304                 wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'useremail', 'userslugs', 'site-transient', 'site-options', 'blog-lookup', 'blog-details', 'rss', 'global-posts', 'blog-id-cache', 'networks', 'sites', 'site-details' ) ); 
     304                wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'useremail', 'userslugs', 'site-transient', 'site-options', 'blog-lookup', 'blog-details', 'rss', 'global-posts', 'blog-id-cache', 'networks', 'sites', 'site-details', 'site_meta' ) ); 
    305305                wp_cache_add_non_persistent_groups( array( 'comment', 'counts', 'plugins' ) ); 
    306306        } 
    307307 
  • tests/phpunit/tests/cache.php

     
    2222                global $wp_object_cache; 
    2323                $cache_class = get_class( $wp_object_cache ); 
    2424                $cache = new $cache_class(); 
    25                 $cache->add_global_groups( array( 'global-cache-test', 'users', 'userlogins', 'usermeta', 'user_meta', 'useremail', 'userslugs', 'site-transient', 'site-options', 'blog-lookup', 'blog-details', 'rss', 'global-posts', 'blog-id-cache', 'networks', 'sites', 'site-details' ) ); 
     25                $cache->add_global_groups( array( 'global-cache-test', 'users', 'userlogins', 'usermeta', 'user_meta', 'useremail', 'userslugs', 'site-transient', 'site-options', 'blog-lookup', 'blog-details', 'rss', 'global-posts', 'blog-id-cache', 'networks', 'sites', 'site-details', 'site_meta' ) ); 
    2626                return $cache; 
    2727        } 
    2828 
  • tests/phpunit/tests/multisite/networkMeta.php

     
     1<?php 
     2 
     3if ( is_multisite() ) : 
     4/** 
     5 * @group ms-network 
     6 * @group multisite 
     7 * @group meta 
     8 * @ticket 25344 
     9 */ 
     10class Tests_Multisite_Network_Meta extends WP_UnitTestCase { 
     11        protected static $network_id; 
     12        protected static $network_id2; 
     13 
     14        public static function wpSetUpBeforeClass( $factory ) { 
     15                self::$network_id = $factory->network->create( array( 'domain' => 'wordpress.org', 'path' => '/' ) ); 
     16                self::$network_id2 = $factory->network->create( array( 'domain' => 'wordpress.org', 'path' => '/foo/' ) ); 
     17        } 
     18 
     19        public static function wpTearDownAfterClass() { 
     20                global $wpdb; 
     21 
     22                $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->sitemeta} WHERE site_id = %d", self::$network_id ) ); 
     23                $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->site} WHERE id= %d", self::$network_id ) ); 
     24 
     25                $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->sitemeta} WHERE site_id = %d", self::$network_id2 ) ); 
     26                $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->site} WHERE id= %d", self::$network_id2 ) ); 
     27        } 
     28 
     29        public function test_add() { 
     30                $this->assertNotEmpty( add_network_meta( self::$network_id, 'foo', 'bar' ) ); 
     31        } 
     32 
     33        public function test_add_unique() { 
     34                $this->assertNotEmpty( add_network_meta( self::$network_id, 'foo', 'bar' ) ); 
     35                $this->assertFalse( add_network_meta( self::$network_id, 'foo', 'bar', true ) ); 
     36        } 
     37 
     38        public function test_delete() { 
     39                add_network_meta( self::$network_id, 'foo', 'bar' ); 
     40 
     41                $this->assertTrue( delete_network_meta( self::$network_id, 'foo' ) ); 
     42        } 
     43 
     44        public function test_delete_with_invalid_meta_key_should_return_false() { 
     45                $this->assertFalse( delete_network_meta( self::$network_id, 'foo' ) ); 
     46        } 
     47 
     48        public function test_delete_should_respect_meta_value() { 
     49                add_network_meta( self::$network_id, 'foo', 'bar' ); 
     50                add_network_meta( self::$network_id, 'foo', 'baz' ); 
     51 
     52                $this->assertTrue( delete_network_meta( self::$network_id, 'foo', 'bar' ) ); 
     53 
     54                $metas = get_network_meta( self::$network_id, 'foo', false ); 
     55                $this->assertSame( array( 'baz' ), $metas ); 
     56        } 
     57 
     58        public function test_get_with_no_key_should_fetch_all_keys() { 
     59                add_network_meta( self::$network_id, 'foo', 'bar' ); 
     60                add_network_meta( self::$network_id, 'foo1', 'baz' ); 
     61 
     62                $found = get_network_meta( self::$network_id ); 
     63 
     64                $expected = array( 
     65                        'foo' => array( 'bar' ), 
     66                        'foo1' => array( 'baz' ), 
     67                ); 
     68 
     69                // Ignore default network options. 
     70                $found = array_intersect_key( $found, $expected ); 
     71 
     72                $this->assertEqualSets( $expected, $found ); 
     73        } 
     74 
     75        public function test_get_with_key_should_fetch_all_for_key() { 
     76                add_network_meta( self::$network_id, 'foo', 'bar' ); 
     77                add_network_meta( self::$network_id, 'foo', 'baz' ); 
     78                add_network_meta( self::$network_id, 'foo1', 'baz' ); 
     79 
     80                $found = get_network_meta( self::$network_id, 'foo' ); 
     81                $expected = array( 'bar', 'baz' ); 
     82 
     83                $this->assertEqualSets( $expected, $found ); 
     84        } 
     85 
     86        public function test_get_should_respect_single_true() { 
     87                add_network_meta( self::$network_id, 'foo', 'bar' ); 
     88                add_network_meta( self::$network_id, 'foo', 'baz' ); 
     89 
     90                $found = get_network_meta( self::$network_id, 'foo', true ); 
     91                $this->assertEquals( 'bar', $found ); 
     92        } 
     93 
     94        public function test_update_should_pass_to_add_when_no_value_exists_for_key() { 
     95                $actual = update_network_meta( self::$network_id, 'foo', 'bar' ); 
     96                $this->assertInternalType( 'int', $actual ); 
     97                $this->assertNotEmpty( $actual ); 
     98 
     99                $meta = get_network_meta( self::$network_id, 'foo', true ); 
     100                $this->assertSame( 'bar', $meta ); 
     101        } 
     102 
     103        public function test_update_should_return_true_when_updating_existing_value_for_key() { 
     104                add_network_meta( self::$network_id, 'foo', 'bar' ); 
     105 
     106                $actual = update_network_meta( self::$network_id, 'foo', 'baz' ); 
     107                $this->assertTrue( $actual ); 
     108 
     109                $meta = get_network_meta( self::$network_id, 'foo', true ); 
     110                $this->assertSame( 'baz', $meta ); 
     111        } 
     112 
     113        public function test_delete_by_key() { 
     114                add_network_meta( self::$network_id, 'unique_delete_by_key', 'value', true ); 
     115                add_network_meta( self::$network_id2, 'unique_delete_by_key', 'value', true ); 
     116 
     117                $this->assertEquals( 'value', get_network_meta( self::$network_id, 'unique_delete_by_key', true ) ); 
     118                $this->assertEquals( 'value', get_network_meta( self::$network_id2, 'unique_delete_by_key', true ) ); 
     119 
     120                $this->assertTrue( delete_network_meta_by_key( 'unique_delete_by_key' ) ); 
     121 
     122                $this->assertEquals( '', get_network_meta( self::$network_id, 'unique_delete_by_key', true ) ); 
     123                $this->assertEquals( '', get_network_meta( self::$network_id2, 'unique_delete_by_key', true ) ); 
     124        } 
     125 
     126        public function test_adding_network_meta_should_bust_get_networks_cache() { 
     127                add_network_meta( self::$network_id, 'foo', 'bar' ); 
     128 
     129                // Prime cache. 
     130                $found = get_networks( array( 
     131                        'fields' => 'ids', 
     132                        'meta_query' => array( 
     133                                array( 
     134                                        'key' => 'foo', 
     135                                        'value' => 'bar', 
     136                                ), 
     137                        ), 
     138                ) ); 
     139 
     140                $this->assertEqualSets( array( self::$network_id ), $found ); 
     141 
     142                add_network_meta( self::$network_id2, 'foo', 'bar' ); 
     143 
     144                $found = get_networks( array( 
     145                        'fields' => 'ids', 
     146                        'meta_query' => array( 
     147                                array( 
     148                                        'key' => 'foo', 
     149                                        'value' => 'bar', 
     150                                ), 
     151                        ), 
     152                ) ); 
     153 
     154                $this->assertEqualSets( array( self::$network_id, self::$network_id2 ), $found ); 
     155        } 
     156 
     157        public function test_updating_network_meta_should_bust_get_networks_cache() { 
     158                add_network_meta( self::$network_id, 'foo', 'bar' ); 
     159                add_network_meta( self::$network_id2, 'foo', 'baz' ); 
     160 
     161                // Prime cache. 
     162                $found = get_networks( array( 
     163                        'fields' => 'ids', 
     164                        'meta_query' => array( 
     165                                array( 
     166                                        'key' => 'foo', 
     167                                        'value' => 'bar', 
     168                                ), 
     169                        ), 
     170                ) ); 
     171 
     172                $this->assertEqualSets( array( self::$network_id ), $found ); 
     173 
     174                update_network_meta( self::$network_id2, 'foo', 'bar' ); 
     175 
     176                $found = get_networks( array( 
     177                        'fields' => 'ids', 
     178                        'meta_query' => array( 
     179                                array( 
     180                                        'key' => 'foo', 
     181                                        'value' => 'bar', 
     182                                ), 
     183                        ), 
     184                ) ); 
     185 
     186                $this->assertEqualSets( array( self::$network_id, self::$network_id2 ), $found ); 
     187        } 
     188 
     189        public function test_deleting_network_meta_should_bust_get_networks_cache() { 
     190                add_network_meta( self::$network_id, 'foo', 'bar' ); 
     191                add_network_meta( self::$network_id2, 'foo', 'bar' ); 
     192 
     193                // Prime cache. 
     194                $found = get_networks( array( 
     195                        'fields' => 'ids', 
     196                        'meta_query' => array( 
     197                                array( 
     198                                        'key' => 'foo', 
     199                                        'value' => 'bar', 
     200                                ), 
     201                        ), 
     202                ) ); 
     203 
     204                $this->assertEqualSets( array( self::$network_id, self::$network_id2 ), $found ); 
     205 
     206                delete_network_meta( self::$network_id2, 'foo', 'bar' ); 
     207 
     208                $found = get_networks( array( 
     209                        'fields' => 'ids', 
     210                        'meta_query' => array( 
     211                                array( 
     212                                        'key' => 'foo', 
     213                                        'value' => 'bar', 
     214                                ), 
     215                        ), 
     216                ) ); 
     217 
     218                $this->assertEqualSets( array( self::$network_id ), $found ); 
     219        } 
     220} 
     221 
     222endif;