Make WordPress Core

Ticket #35658: 35658.46.diff

File 35658.46.diff, 34.4 KB (added by jeremyfelt, 8 years ago)
  • src/wp-includes/functions.php

     
    53665366 * @return bool                True if the object type exists, false if not.
    53675367 */
    53685368function wp_object_type_exists( $object_type ) {
     5369        $object_type = explode( ':', $object_type );
     5370        $object_type = $object_type[0];
     5371
    53695372        /**
    53705373         * Filters WordPress object types.
    53715374         *
  • src/wp-includes/meta.php

     
    4444                return false;
    4545        }
    4646
    47         $column = sanitize_key($meta_type . '_id');
     47        $meta_type_column = explode( ':', $meta_type );
     48        $column = sanitize_key( $meta_type_column[0] . '_id' );
    4849
    4950        // expected_slashed ($meta_key)
    5051        $meta_key = wp_unslash($meta_key);
     
    157158                return false;
    158159        }
    159160
    160         $column = sanitize_key($meta_type . '_id');
    161         $id_column = 'user' == $meta_type ? 'umeta_id' : 'meta_id';
     161        $meta_type_column = explode( ':', $meta_type );
     162        $column = sanitize_key( $meta_type_column[0] . '_id' );
     163        $id_column = 'user' == $meta_type_column[0] ? 'umeta_id' : 'meta_id';
    162164
    163165        // expected_slashed ($meta_key)
    164166        $raw_meta_key = $meta_key;
     
    321323                return false;
    322324        }
    323325
    324         $type_column = sanitize_key($meta_type . '_id');
    325         $id_column = 'user' == $meta_type ? 'umeta_id' : 'meta_id';
     326        $meta_type_column = explode( ':', $meta_type );
     327        $type_column = sanitize_key( $meta_type_column[0] . '_id' );
     328        $id_column = 'user' == $meta_type_column[0] ? 'umeta_id' : 'meta_id';
    326329        // expected_slashed ($meta_key)
    327330        $meta_key = wp_unslash($meta_key);
    328331        $meta_value = wp_unslash($meta_value);
     
    576579                return false;
    577580        }
    578581
    579         $table = _get_meta_table( $meta_type );
     582        $meta_type_column = explode( ':', $meta_type );
     583        $table = _get_meta_table( $meta_type_column[0] );
    580584        if ( ! $table ) {
    581585                return false;
    582586        }
    583587
    584         $id_column = ( 'user' == $meta_type ) ? 'umeta_id' : 'meta_id';
     588        $id_column = ( 'user' == $meta_type_column[0] ) ? 'umeta_id' : 'meta_id';
    585589
    586590        $meta = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $table WHERE $id_column = %d", $meta_id ) );
    587591
     
    620624                return false;
    621625        }
    622626
    623         $table = _get_meta_table( $meta_type );
     627        $meta_type_column = explode( ':', $meta_type );
     628        $table = _get_meta_table( $meta_type_column[0] );
    624629        if ( ! $table ) {
    625630                return false;
    626631        }
    627632
    628         $column = sanitize_key($meta_type . '_id');
    629         $id_column = 'user' == $meta_type ? 'umeta_id' : 'meta_id';
     633        $column = sanitize_key( $meta_type_column[0] . '_id' );
     634        $id_column = 'user' == $meta_type_column[0] ? 'umeta_id' : 'meta_id';
    630635
    631636        // Fetch the meta and go on if it's found.
    632637        if ( $meta = get_metadata_by_mid( $meta_type, $meta_id ) ) {
     
    711716                return false;
    712717        }
    713718
    714         $table = _get_meta_table( $meta_type );
     719        $meta_type_column = explode( ':', $meta_type );
     720        $table = _get_meta_table( $meta_type_column[0] );
    715721        if ( ! $table ) {
    716722                return false;
    717723        }
    718724
    719725        // object and id columns
    720         $column = sanitize_key($meta_type . '_id');
    721         $id_column = 'user' == $meta_type ? 'umeta_id' : 'meta_id';
     726        $column = sanitize_key( $meta_type_column[0] . '_id');
     727        $id_column = 'user' == $meta_type_column[0] ? 'umeta_id' : 'meta_id';
    722728
    723729        // Fetch the meta and go on if it's found.
    724730        if ( $meta = get_metadata_by_mid( $meta_type, $meta_id ) ) {
     
    792798                return false;
    793799        }
    794800
    795         $table = _get_meta_table( $meta_type );
     801        $meta_type_column = explode( ':', $meta_type );
     802        $table = _get_meta_table( $meta_type_column[0] );
    796803        if ( ! $table ) {
    797804                return false;
    798805        }
    799806
    800         $column = sanitize_key($meta_type . '_id');
     807        $column = sanitize_key( $meta_type_column[0] . '_id' );
    801808
    802809        if ( !is_array($object_ids) ) {
    803810                $object_ids = preg_replace('|[^0-9,]|', '', $object_ids);
     
    806813
    807814        $object_ids = array_map('intval', $object_ids);
    808815
    809         $cache_key = $meta_type . '_meta';
     816        $cache_key = $meta_type_column[0] . '_meta';
    810817        $ids = array();
    811818        $cache = array();
    812819        foreach ( $object_ids as $id ) {
     
    822829
    823830        // Get meta info
    824831        $id_list = join( ',', $ids );
    825         $id_column = 'user' == $meta_type ? 'umeta_id' : 'meta_id';
     832        $id_column = 'user' == $meta_type_column[0] ? 'umeta_id' : 'meta_id';
    826833        $meta_list = $wpdb->get_results( "SELECT $column, meta_key, meta_value FROM $table WHERE $column IN ($id_list) ORDER BY $id_column ASC", ARRAY_A );
    827834
    828835        if ( !empty($meta_list) ) {
     
    883890 * @return array Associative array of `JOIN` and `WHERE` SQL.
    884891 */
    885892function get_meta_sql( $meta_query, $type, $primary_table, $primary_id_column, $context = null ) {
     893        $type = explode( ':', $type );
    886894        $meta_query_obj = new WP_Meta_Query( $meta_query );
    887         return $meta_query_obj->get_sql( $type, $primary_table, $primary_id_column, $context );
     895        return $meta_query_obj->get_sql( $type[0], $primary_table, $primary_id_column, $context );
    888896}
    889897
    890898/**
     
    900908function _get_meta_table($type) {
    901909        global $wpdb;
    902910
    903         $table_name = $type . 'meta';
     911        $type = explode( ':', $type );
     912        $table_name = $type[0] . 'meta';
    904913
    905914        if ( empty($wpdb->$table_name) )
    906915                return false;
     
    936945 * Sanitize meta value.
    937946 *
    938947 * @since 3.1.3
    939  * @since 4.6.0 Added the `$object_subtype` parameter.
    940948 *
    941949 * @param string $meta_key       Meta key.
    942950 * @param mixed  $meta_value     Meta value to sanitize.
    943951 * @param string $object_type    Type of object the meta is registered to.
    944  * @param string $object_subtype Optional. Subtype of object. Will inherit the object type by default.
    945952 *
    946953 * @return mixed Sanitized $meta_value.
    947954 */
    948 function sanitize_meta( $meta_key, $meta_value, $object_type, $object_subtype = '' ) {
    949         if ( ! empty( $object_subtype ) ) {
    950                 /**
    951                  * Filters the sanitization of a specific meta key of a specific meta type and subtype.
    952                  *
    953                  * The dynamic portions of the hook name, `$meta_type`, `$meta_subtype`,
    954                  * and `$meta_key`, refer to the metadata object type (comment, post, or user)
    955                  * the object subtype, and the meta key value, respectively.
    956                  *
    957                  * @since 4.6.0
    958                  *
    959                  * @param mixed  $meta_value      Meta value to sanitize.
    960                  * @param string $meta_key        Meta key.
    961                  * @param string $object_type     Object type.
    962                  * @param string $object_subtype  Object subtype.
    963                  */
    964                 $meta_value = apply_filters( "sanitize_{$object_type}_{$object_subtype}_meta_{$meta_key}", $meta_value, $meta_key, $object_type, $object_subtype );
    965         }
    966 
     955function sanitize_meta( $meta_key, $meta_value, $object_type ) {
    967956        /**
    968957         * Filters the sanitization of a specific meta key of a specific meta type.
    969958         *
     
    972961         * key value, respectively.
    973962         *
    974963         * @since 3.3.0
    975          * @since 4.6.0 Added the `$object_subtype` parameter.
    976964         *
    977965         * @param mixed  $meta_value      Meta value to sanitize.
    978966         * @param string $meta_key        Meta key.
    979967         * @param string $object_type     Object type.
    980          * @param string $object_subtype  Object subtype.
    981968         */
    982         return apply_filters( "sanitize_{$object_type}_meta_{$meta_key}", $meta_value, $meta_key, $object_type, $object_subtype );
     969        return apply_filters( "sanitize_{$object_type}_meta_{$meta_key}", $meta_value, $meta_key, $object_type );
    983970}
    984971
    985972/**
     
    995982 * @param array  $args {
    996983 *     Data used to describe the meta key when registered.
    997984 *
    998  *     @type string $object_subtype    A subtype; e.g. if the object type is "post", the post type.
    999985 *     @type string $type              The type of data associated with this meta key.
    1000986 *     @type string $description       A description of the data attached to this meta key.
    1001987 *     @type bool   $single            Whether the meta key has one value per object, or an array of values per object.
     
    1009995 *                       Registering a meta key with distinct sanitize and auth callbacks will fire those
    1010996 *                       callbacks, but will not add to the global registry as it requires a subtype.
    1011997 */
    1012 function register_meta( $object_type, $meta_key, $args, $deprecated = null ) {
     998function register_meta( $object_type, $meta_key, $args = array(), $deprecated = null ) {
    1013999        global $wp_meta_keys;
    10141000
    10151001        if ( ! is_array( $wp_meta_keys ) ) {
     
    10211007        }
    10221008
    10231009        $defaults = array(
    1024                 'object_subtype'    => '',
    10251010                'type'              => 'string',
    10261011                'description'       => '',
    10271012                'single'            => false,
     
    10631048         */
    10641049        $args = apply_filters( 'register_meta_args', $args, $defaults, $object_type, $meta_key );
    10651050
    1066         // Object subtype is required if using the args style of registration
    1067         if ( ! $has_old_sanitize_cb && ! $has_old_auth_cb && empty( $args['object_subtype'] ) ) {
    1068                 return new WP_Error( 'register_meta_failed', __( 'Meta must be registered against an object subtype.' ) );
     1051        // Check for a valid (WP) CURIE string.
     1052        $object_type = trim( $object_type, ':' );
     1053
     1054        // New object type style cannot be used with old function signature.
     1055        if ( strpos( $object_type, ':' ) && ( $has_old_auth_cb || $has_old_sanitize_cb ) ) {
     1056                // error.
     1057                return false;
    10691058        }
    10701059
    1071         // If `auth_callback` is not provided, fall back to `is_protected_meta()`.
     1060        /**
     1061         * If `auth_callback` is not provided, fall back to `is_protected_meta()`.
     1062         *
     1063         * To maintain back-compat, this should be processed with only the base object
     1064         * type and not CURIE syntax.
     1065         */
    10721066        if ( empty( $args['auth_callback'] ) ) {
    1073                 if ( is_protected_meta( $meta_key, $object_type ) ) {
     1067                $object_type_protected = explode( ':', $object_type );
     1068                if ( is_protected_meta( $meta_key, $object_type_protected[0] ) ) {
    10741069                        $args['auth_callback'] = '__return_false';
    10751070                } else {
    10761071                        $args['auth_callback'] = '__return_true';
     
    10771072                }
    10781073        }
    10791074
    1080         $object_subtype = '';
    1081 
    1082         if ( ! empty( $args['object_subtype'] ) ) {
    1083                 $object_subtype = $args['object_subtype'];
     1075        // Provide a fallback for new object type styles if using new function signature.
     1076        if ( ! $has_old_auth_cb && ! $has_old_sanitize_cb && ! strpos( $object_type, ':' ) ) {
     1077                if ( 'term' === $object_type ) {
     1078                        $object_type = 'term:category';
     1079                } else {
     1080                        $object_type = $object_type . ':' . $object_type;
     1081                }
    10841082        }
    10851083
    1086         // Back-compat: old sanitize and auth callbacks are applied to all of an object type.
    1087         if ( $has_old_sanitize_cb && is_callable( $args['sanitize_callback'] ) ) {
    1088                 add_filter( "sanitize_{$object_type}_meta_{$meta_key}", $args['sanitize_callback'], 10, 4 );
     1084        if ( is_callable( $args['sanitize_callback'] ) ) {
     1085                add_filter( "sanitize_{$object_type}_meta_{$meta_key}", $args['sanitize_callback'], 10, 3 );
    10891086        }
    10901087
    1091         if ( $has_old_auth_cb && is_callable( $args['auth_callback'] ) ) {
     1088        if ( is_callable( $args['auth_callback'] ) ) {
    10921089                add_filter( "auth_{$object_type}_meta_{$meta_key}", $args['auth_callback'], 10, 6 );
    10931090        }
    10941091
    1095         if ( ! $has_old_auth_cb && ! $has_old_sanitize_cb) {
    1096                 if ( is_callable( $args['sanitize_callback'] ) ) {
    1097                         add_filter( "sanitize_{$object_type}_{$object_subtype}_meta_{$meta_key}", $args['sanitize_callback'], 10, 4 );
    1098                 }
    1099 
    1100                 if ( is_callable( $args['auth_callback'] ) ) {
    1101                         add_filter( "auth_{$object_type}_{$object_subtype}_meta_{$meta_key}", $args['auth_callback'], 10, 6 );
    1102                 }
    1103         }
    1104 
    11051092        // Global registry only contains meta keys registered in the new way with a subtype.
    1106         if ( ! empty( $object_subtype ) ) {
    1107                 $wp_meta_keys[ $object_type ][ $object_subtype ][ $meta_key ] = $args;
     1093        if ( strpos( $object_type, ':' ) ) {
     1094                $wp_meta_keys[ $object_type ][ $meta_key ] = $args;
    11081095
    11091096                return true;
    11101097        }
     
    11181105 * @since 4.6.0
    11191106 *
    11201107 * @param string $object_type    The type of object.
    1121  * @param string $object_subtype The subtype of the object type.
    11221108 * @param string $meta_key       The meta key.
    11231109 *
    1124  * @return bool|WP_error True if the meta key is registered to the object type and subtype. False if not.
     1110 * @return bool|WP_error True if the meta key is registered to the object type. False if not.
    11251111 *                       WP_Error if an invalid object type is passed.
    11261112 */
    1127 function registered_meta_key_exists( $object_type, $object_subtype, $meta_key ) {
     1113function registered_meta_key_exists( $object_type, $meta_key ) {
    11281114        global $wp_meta_keys;
    11291115
    11301116        if ( ! is_array( $wp_meta_keys ) ) {
     
    11401126                return false;
    11411127        }
    11421128
    1143         if ( ! isset( $wp_meta_keys[ $object_type ][ $object_subtype ] ) ) {
    1144                 return false;
    1145         }
    1146 
    1147         if ( isset( $wp_meta_keys[ $object_type ][ $object_subtype ][ $meta_key ] ) ) {
     1129        if ( isset( $wp_meta_keys[ $object_type ][ $meta_key ] ) ) {
    11481130                return true;
    11491131        }
    11501132
     
    11571139 * @since 4.6.0
    11581140 *
    11591141 * @param string $object_type    The type of object.
    1160  * @param string $object_subtype The subtype of the object type.
    11611142 * @param string $meta_key       The meta key.
    11621143 *
    11631144 * @return bool|WP_Error True if successful. WP_Error if the meta key is invalid.
    11641145 */
    1165 function unregister_meta_key( $object_type, $object_subtype, $meta_key ) {
     1146function unregister_meta_key( $object_type, $meta_key ) {
    11661147        global $wp_meta_keys;
    11671148
    1168         if ( ! registered_meta_key_exists( $object_type, $object_subtype, $meta_key ) ) {
     1149        if ( ! registered_meta_key_exists( $object_type, $meta_key ) ) {
    11691150                return new WP_Error( 'invalid_meta_key', __( 'Invalid meta key' ) );
    11701151        }
    11711152
    1172         $args = $wp_meta_keys[ $object_type ][ $object_subtype ][ $meta_key ];
     1153        $args = $wp_meta_keys[ $object_type ][ $meta_key ];
    11731154
    11741155        if ( isset( $args['sanitize_callback'] ) && is_callable( $args['sanitize_callback'] ) ) {
    1175                 remove_filter( "sanitize_{$object_type}_{$object_subtype}_meta_{$meta_key}", $args['sanitize_callback'] );
     1156                remove_filter( "sanitize_{$object_type}_meta_{$meta_key}", $args['sanitize_callback'] );
    11761157        }
    11771158
    11781159        if ( isset( $args['auth_callback'] ) && is_callable( $args['auth_callback'] ) ) {
    1179                 remove_filter( "auth_{$object_type}_{$object_subtype}_meta_{$meta_key}", $args['auth_callback'] );
     1160                remove_filter( "auth_{$object_type}_meta_{$meta_key}", $args['auth_callback'] );
    11801161        }
    11811162
    1182         unset( $wp_meta_keys[ $object_type ][ $object_subtype ][ $meta_key ] );
     1163        unset( $wp_meta_keys[ $object_type ][ $meta_key ] );
    11831164
    11841165        // Do some clean up
    1185         if ( empty( $wp_meta_keys[ $object_type ][ $object_subtype ] ) ) {
    1186                 unset( $wp_meta_keys[ $object_type ][ $object_subtype ] );
    1187         }
    1188 
    11891166        if ( empty( $wp_meta_keys[ $object_type ] ) ) {
    11901167                unset( $wp_meta_keys[ $object_type ] );
    11911168        }
     
    11941171}
    11951172
    11961173/**
    1197  * Retrieves a list of registered meta keys for an object type and optionally subtype.
     1174 * Retrieves a list of registered meta keys for an object type.
    11981175 *
    11991176 * @since 4.6.0
    12001177 *
    1201  * @param string $object_type    The type of object. Post, comment, user, term.
    1202  * @param string $object_subtype Optional. A subtype of the object (e.g. custom post type).
     1178 * @param string $object_type The type of object. Post, comment, user, term.
    12031179 *
    12041180 * @return array List of registered meta keys.
    12051181 */
    1206 function get_registered_meta_keys( $object_type, $object_subtype = '' ) {
     1182function get_registered_meta_keys( $object_type ) {
    12071183        global $wp_meta_keys;
    12081184
    12091185        if ( ! isset( $wp_meta_keys[ $object_type ] ) ) {
     
    12101186                return array();
    12111187        }
    12121188
    1213         if ( empty( $object_subtype ) && isset( $wp_meta_keys[ $object_type ] ) ) {
    1214                 return $wp_meta_keys[ $object_type ];
    1215         }
    1216 
    1217         if ( ! isset( $wp_meta_keys[ $object_type ][ $object_subtype ] ) ) {
    1218                 return array();
    1219         }
    1220 
    1221         return $wp_meta_keys[ $object_type ][ $object_subtype ];
     1189        return $wp_meta_keys[ $object_type ];
    12221190}
    12231191
    12241192/**
     
    12271195 * @since 4.6.0
    12281196 *
    12291197 * @param string $object_type    Type of object to request metadata for. (e.g. comment, post, term, user)
    1230  * @param string $object_subtype The subtype of the object's type to request metadata for. (e.g. custom post type)
    12311198 * @param int    $object_id      ID of the object the metadata is for.
    12321199 * @param string $meta_key       Optional. Registered metadata key. If not specified, retrieve all registered
    12331200 *                               metadata for the specified object.
     
    12341201 *
    12351202 * @return mixed|WP_Error
    12361203 */
    1237 function get_registered_metadata( $object_type, $object_subtype, $object_id, $meta_key = '' ) {
     1204function get_registered_metadata( $object_type, $object_id, $meta_key = '' ) {
    12381205        global $wp_meta_keys;
    12391206
    12401207        if ( ! is_array( $wp_meta_keys ) ) {
     
    12461213        }
    12471214
    12481215        if ( ! empty( $meta_key ) ) {
    1249                 if ( ! registered_meta_key_exists( $object_type, $object_subtype, $meta_key ) ) {
     1216                if ( ! registered_meta_key_exists( $object_type, $meta_key ) ) {
    12501217                        return new WP_Error( 'invalid_meta_key', __( 'Invalid meta key. Not registered.' ) );
    12511218                }
    1252                 $meta_keys = get_registered_meta_keys( $object_type, $object_subtype );
     1219                $meta_keys = get_registered_meta_keys( $object_type );
    12531220                $meta_key_data = $meta_keys[ $meta_key ];
    12541221
    12551222                $data = get_metadata( $object_type, $object_id, $meta_key, $meta_key_data['single'] );
     
    12591226
    12601227        $data = get_metadata( $object_type, $object_id );
    12611228
    1262         $meta_keys = get_registered_meta_keys( $object_type, $object_subtype );
     1229        $meta_keys = get_registered_meta_keys( $object_type );
    12631230        $registered_data = array();
    12641231
    12651232        // Someday, array_filter()
  • tests/phpunit/tests/meta/registerMeta.php

     
    2828                return $meta_key . ' old sanitized';
    2929        }
    3030
    31         public function _new_sanitize_meta_cb( $meta_value, $meta_key, $object_type, $object_subtype ) {
     31        public function _new_sanitize_meta_cb( $meta_value, $meta_key, $object_type ) {
    3232                return $meta_key . ' new sanitized';
    3333        }
    3434
     
    6969        }
    7070
    7171        public function test_register_meta_with_valid_object_type_and_object_subtype_returns_true() {
    72                 $result = register_meta( 'post', 'flight_number', array( 'object_subtype' => 'post' ) );
    73                 unregister_meta_key( 'post', 'post', 'flight_number' );
     72                $result = register_meta( 'post:post', 'flight_number' );
     73                unregister_meta_key( 'post:post', 'flight_number' );
    7474
    7575                $this->assertTrue( $result );
    7676        }
     
    7878        public function test_register_meta_with_post_object_type_and_subtype_populates_wp_meta_keys() {
    7979                global $wp_meta_keys;
    8080
    81                 register_meta( 'post', 'flight_number', array( 'object_subtype' => 'post' ) );
     81                register_meta( 'post:post', 'flight_number' );
    8282                $actual = $wp_meta_keys;
    83                 unregister_meta_key( 'post', 'post', 'flight_number' );
     83                unregister_meta_key( 'post:post', 'flight_number' );
    8484
    8585                $expected = array(
    86                         'post' => array(
    87                                 'post' => array(
    88                                         'flight_number' => array(
    89                                                 'object_subtype' => 'post',
    90                                                 'type' => 'string',
    91                                                 'description' => '',
    92                                                 'single' => false,
    93                                                 'sanitize_callback' => null,
    94                                                 'auth_callback' => '__return_true',
    95                                                 'show_in_rest' => false,
    96                                         ),
     86                        'post:post' => array(
     87                                'flight_number' => array(
     88                                        'type' => 'string',
     89                                        'description' => '',
     90                                        'single' => false,
     91                                        'sanitize_callback' => null,
     92                                        'auth_callback' => '__return_true',
     93                                        'show_in_rest' => false,
    9794                                ),
    9895                        ),
    9996                );
     
    104101        public function test_register_meta_with_post_object_type_and_unregistered_subtype_populates_wp_meta_keys() {
    105102                global $wp_meta_keys;
    106103
    107                 register_meta( 'post', 'flight_number', array( 'object_subtype' => 'not_a_post_type' ) );
     104                register_meta( 'post:not_a_post_type', 'flight_number' );
    108105                $actual = $wp_meta_keys;
    109                 unregister_meta_key( 'post', 'not_a_post_type', 'flight_number' );
     106                unregister_meta_key( 'post:not_a_post_type', 'flight_number' );
    110107
    111108                $expected = array(
    112                         'post' => array(
    113                                 'not_a_post_type' => array(
    114                                         'flight_number' => array(
    115                                                 'object_subtype' => 'not_a_post_type',
    116                                                 'type' => 'string',
    117                                                 'description' => '',
    118                                                 'single' => false,
    119                                                 'sanitize_callback' => null,
    120                                                 'auth_callback' => '__return_true',
    121                                                 'show_in_rest' => false,
    122                                         ),
     109                        'post:not_a_post_type' => array(
     110                                'flight_number' => array(
     111                                        'type' => 'string',
     112                                        'description' => '',
     113                                        'single' => false,
     114                                        'sanitize_callback' => null,
     115                                        'auth_callback' => '__return_true',
     116                                        'show_in_rest' => false,
    123117                                ),
    124118                        ),
    125119                );
     
    129123
    130124        public function test_register_meta_with_term_object_type_and_category_subtype_populates_wp_meta_keys() {
    131125                global $wp_meta_keys;
    132                 register_meta( 'term', 'category_icon', array( 'object_subtype' => 'category' ) );
     126                register_meta( 'term:category', 'category_icon' );
    133127                $actual = $wp_meta_keys;
    134                 unregister_meta_key( 'term', 'category', 'category_icon' );
     128                unregister_meta_key( 'term:category', 'category_icon' );
    135129
    136130                $expected = array(
    137                         'term' => array(
    138                                 'category' => array(
    139                                         'category_icon' => array(
    140                                                 'object_subtype' => 'category',
    141                                                 'type' => 'string',
    142                                                 'description' => '',
    143                                                 'single' => false,
    144                                                 'sanitize_callback' => null,
    145                                                 'auth_callback' => '__return_true',
    146                                                 'show_in_rest' => false,
    147                                         ),
     131                        'term:category' => array(
     132                                'category_icon' => array(
     133                                        'type' => 'string',
     134                                        'description' => '',
     135                                        'single' => false,
     136                                        'sanitize_callback' => null,
     137                                        'auth_callback' => '__return_true',
     138                                        'show_in_rest' => false,
    148139                                ),
    149140                        ),
    150141                );
     
    154145
    155146        public function test_register_meta_with_comment_object_type_and_subtype_populates_wp_meta_keys() {
    156147                global $wp_meta_keys;
    157                 register_meta( 'comment', 'comment_rating', array( 'object_subtype' => 'comment' ) );
     148                register_meta( 'comment:comment', 'comment_rating' );
    158149                $actual = $wp_meta_keys;
    159                 unregister_meta_key( 'comment', 'comment', 'comment_rating' );
     150                unregister_meta_key( 'comment:comment', 'comment_rating' );
    160151
    161152                $expected = array(
    162                         'comment' => array(
    163                                 'comment' => array(
    164                                         'comment_rating' => array(
    165                                                 'object_subtype' => 'comment',
    166                                                 'type' => 'string',
    167                                                 'description' => '',
    168                                                 'single' => false,
    169                                                 'sanitize_callback' => null,
    170                                                 'auth_callback' => '__return_true',
    171                                                 'show_in_rest' => false,
    172                                         ),
     153                        'comment:comment' => array(
     154                                'comment_rating' => array(
     155                                        'type' => 'string',
     156                                        'description' => '',
     157                                        'single' => false,
     158                                        'sanitize_callback' => null,
     159                                        'auth_callback' => '__return_true',
     160                                        'show_in_rest' => false,
    173161                                ),
    174162                        ),
    175163                );
     
    200188
    201189        public function test_register_meta_with_deprecated_sanitize_callback_parameter_passes_through_filter() {
    202190                register_meta( 'post', 'old_sanitized_key', array( $this, '_old_sanitize_meta_cb' ) );
    203                 $meta = sanitize_meta( 'old_sanitized_key', 'unsanitized', 'post', 'post' );
     191                $meta = sanitize_meta( 'old_sanitized_key', 'unsanitized', 'post' );
    204192
    205193                remove_filter( 'sanitize_post_meta_flight_number', array( $this, '_old_sanitize_meta_cb') );
    206194                remove_filter( 'auth_post_meta_flight_number', '__return_true');
     
    210198
    211199        public function test_register_meta_with_current_sanitize_callback_populates_wp_meta_keys() {
    212200                global $wp_meta_keys;
    213                 register_meta( 'post', 'flight_number', array( 'object_subtype' => 'post', 'sanitize_callback' => array( $this, '_new_sanitize_meta_cb' ) ) );
     201                register_meta( 'post:post', 'flight_number', array( 'sanitize_callback' => array( $this, '_new_sanitize_meta_cb' ) ) );
    214202                $actual = $wp_meta_keys;
    215                 unregister_meta_key( 'post', 'post', 'flight_number' );
     203                unregister_meta_key( 'post:post', 'flight_number' );
    216204
    217205                $expected = array(
    218                         'post' => array(
    219                                 'post' => array(
    220                                         'flight_number' => array(
    221                                                 'object_subtype' => 'post',
    222                                                 'type' => 'string',
    223                                                 'description' => '',
    224                                                 'single' => false,
    225                                                 'sanitize_callback' => array( $this, '_new_sanitize_meta_cb' ),
    226                                                 'auth_callback' => '__return_true',
    227                                                 'show_in_rest' => false,
    228                                         ),
     206                        'post:post' => array(
     207                                'flight_number' => array(
     208                                        'type' => 'string',
     209                                        'description' => '',
     210                                        'single' => false,
     211                                        'sanitize_callback' => array( $this, '_new_sanitize_meta_cb' ),
     212                                        'auth_callback' => '__return_true',
     213                                        'show_in_rest' => false,
    229214                                ),
    230215                        ),
    231216                );
     
    233218        }
    234219
    235220        public function test_register_meta_with_current_sanitize_callback_returns_true() {
    236                 $result = register_meta( 'post', 'flight_number', array( 'object_subtype' => 'post', 'sanitize_callback' => array( $this, '_new_sanitize_meta_cb' ) ) );
    237                 unregister_meta_key( 'post', 'post', 'flight_number' );
     221                $result = register_meta( 'post:post', 'flight_number', array( 'sanitize_callback' => array( $this, '_new_sanitize_meta_cb' ) ) );
     222                unregister_meta_key( 'post:post', 'flight_number' );
    238223
    239224                $this->assertTrue( $result );
    240225        }
    241226
    242227        public function test_register_meta_with_new_sanitize_callback_parameter() {
    243                 register_meta( 'post', 'new_sanitized_key', array( 'object_subtype' => 'post', 'sanitize_callback' => array( $this, '_new_sanitize_meta_cb' ) ) );
    244                 $meta = sanitize_meta( 'new_sanitized_key', 'unsanitized', 'post', 'post' );
     228                register_meta( 'post:post', 'new_sanitized_key', array( 'sanitize_callback' => array( $this, '_new_sanitize_meta_cb' ) ) );
     229                $meta = sanitize_meta( 'new_sanitized_key', 'unsanitized', 'post:post' );
    245230
    246                 unregister_meta_key( 'post', 'post', 'new_sanitized_key' );
     231                unregister_meta_key( 'post:post', 'new_sanitized_key' );
    247232
    248233                $this->assertEquals( 'new_sanitized_key new sanitized', $meta );
    249234        }
    250235
    251236        public function test_register_meta_unregistered_meta_key_removes_sanitize_filter() {
    252                 register_meta( 'post', 'new_sanitized_key', array( 'object_subtype' => 'post', 'sanitize_callback' => array( $this, '_new_sanitize_meta_cb' ) ) );
    253                 unregister_meta_key( 'post', 'post', 'new_sanitized_key' );
     237                register_meta( 'post:post', 'new_sanitized_key', array( 'sanitize_callback' => array( $this, '_new_sanitize_meta_cb' ) ) );
     238                unregister_meta_key( 'post:post', 'new_sanitized_key' );
    254239
    255                 $has_filter = has_filter( 'sanitize_post_post_meta_new_sanitized_key', array( $this, '_new_sanitize_meta_cb' ) );
     240                $has_filter = has_filter( 'sanitize_post:post_meta_new_sanitized_key', array( $this, '_new_sanitize_meta_cb' ) );
    256241
    257242                $this->assertFalse( $has_filter );
    258243        }
    259244
    260245        public function test_register_meta_unregistered_meta_key_removes_auth_filter() {
    261                 register_meta( 'post', 'new_auth_key', array( 'object_subtype' => 'post', 'auth_callback' => array( $this, '_new_auth_meta_cb' ) ) );
    262                 unregister_meta_key( 'post', 'post', 'new_auth_key' );
     246                register_meta( 'post:post', 'new_auth_key', array( 'auth_callback' => array( $this, '_new_auth_meta_cb' ) ) );
     247                unregister_meta_key( 'post:post', 'new_auth_key' );
    263248
    264                 $has_filter = has_filter( 'auth_post_post_meta_new_auth_key', array( $this, '_new_auth_meta_cb' ) );
     249                $has_filter = has_filter( 'auth_post:post_meta_new_auth_key', array( $this, '_new_auth_meta_cb' ) );
    265250
    266251                $this->assertFalse( $has_filter );
    267252        }
     
    268253
    269254        public function test_unregister_meta_key_clears_key_from_wp_meta_keys() {
    270255                global $wp_meta_keys;
    271                 register_meta( 'post', 'registered_key', array( 'object_subtype' => 'post' ) );
    272                 unregister_meta_key( 'post', 'post', 'registered_key' );
     256                register_meta( 'post:post', 'registered_key' );
     257                unregister_meta_key( 'post:post', 'registered_key' );
    273258
    274259                $this->assertEquals( array(), $wp_meta_keys );
    275260        }
    276261
    277262        public function test_unregister_meta_key_with_invalid_key_returns_wp_error() {
    278                 $this->assertWPError( unregister_meta_key( 'post', 'post', 'not_a_registered_key' ) );
     263                $this->assertWPError( unregister_meta_key( 'post:post', 'not_a_registered_key' ) );
    279264        }
    280265
    281266        public function test_get_registered_meta_keys() {
    282                 register_meta( 'post', 'registered_key1', array( 'object_subtype' => 'post' ) );
    283                 register_meta( 'post', 'registered_key2', array( 'object_subtype' => 'post' ) );
     267                register_meta( 'post:post', 'registered_key1' );
     268                register_meta( 'post:post', 'registered_key2' );
    284269
    285                 $meta_keys = get_registered_meta_keys( 'post', 'post' );
     270                $meta_keys = get_registered_meta_keys( 'post:post' );
    286271
    287                 unregister_meta_key( 'post', 'post', 'registered_key1' );
    288                 unregister_meta_key( 'post', 'post', 'registered_key2' );
     272                unregister_meta_key( 'post:post', 'registered_key1' );
     273                unregister_meta_key( 'post:post', 'registered_key2' );
    289274
    290275                $this->assertArrayHasKey( 'registered_key1', $meta_keys );
    291276                $this->assertArrayHasKey( 'registered_key2', $meta_keys );
     
    292277        }
    293278
    294279        public function test_get_registered_meta_keys_with_subtype_without_registered_keys_is_empty() {
    295                 register_meta( 'post', 'registered_key1', array( 'object_subtype' => 'post' ) );
    296                 register_meta( 'post', 'registered_key2', array( 'object_subtype' => 'post' ) );
     280                register_meta( 'post:post', 'registered_key1' );
     281                register_meta( 'post:post', 'registered_key2' );
    297282
    298                 $meta_keys = get_registered_meta_keys( 'post', 'page' );
     283                $meta_keys = get_registered_meta_keys( 'post:page' );
    299284
    300                 unregister_meta_key( 'post', 'post', 'registered_key1' );
    301                 unregister_meta_key( 'post', 'post', 'registered_key2' );
     285                unregister_meta_key( 'post:post', 'registered_key1' );
     286                unregister_meta_key( 'post:post', 'registered_key2' );
    302287
    303288                $this->assertEmpty( $meta_keys );
    304289        }
    305290
    306291        public function test_get_registered_meta_keys_with_invalid_type_is_empty() {
    307                 register_meta( 'post', 'registered_key1', array( 'object_subtype' => 'post' ) );
    308                 register_meta( 'post', 'registered_key2', array( 'object_subtype' => 'post' ) );
     292                register_meta( 'post:post', 'registered_key1' );
     293                register_meta( 'post:post', 'registered_key2' );
    309294
    310295                $meta_keys = get_registered_meta_keys( 'invalid-type' );
    311296
    312                 unregister_meta_key( 'post', 'post', 'registered_key1' );
    313                 unregister_meta_key( 'post', 'post', 'registered_key2' );
     297                unregister_meta_key( 'post:post', 'registered_key1' );
     298                unregister_meta_key( 'post:post', 'registered_key2' );
    314299
    315300                $this->assertEmpty( $meta_keys );
    316301        }
    317302
    318         public function test_get_registered_meta_keys_has_count() {
    319                 register_meta( 'post', 'registered_key1', array( 'object_subtype' => 'post' ) );
    320                 register_meta( 'post', 'registered_key2', array( 'object_subtype' => 'page' ) );
     303        public function test_get_registered_meta_keys_with_only_base_type_has_0_count() {
     304                register_meta( 'post:post', 'registered_key1' );
     305                register_meta( 'post:page', 'registered_key2' );
    321306
    322307                $meta_keys = get_registered_meta_keys( 'post' );
    323308
    324                 unregister_meta_key( 'post', 'post', 'registered_key1' );
    325                 unregister_meta_key( 'post', 'page', 'registered_key2' );
     309                unregister_meta_key( 'post:post', 'registered_key1' );
     310                unregister_meta_key( 'post:page', 'registered_key2' );
    326311
    327                 $this->assertCount( 2, $meta_keys );
     312                $this->assertCount( 0, $meta_keys );
    328313        }
    329314
    330315        public function test_get_registered_meta_keys_description_arg() {
    331                 register_meta( 'post', 'registered_key1', array( 'object_subtype' => 'post', 'description' => 'I\'m just a field, take a good look at me' ) );
     316                register_meta( 'post:post', 'registered_key1', array( 'description' => 'I\'m just a field, take a good look at me' ) );
    332317
    333                 $meta_keys = get_registered_meta_keys( 'post', 'post' );
     318                $meta_keys = get_registered_meta_keys( 'post:post' );
    334319
    335                 unregister_meta_key( 'post', 'post', 'registered_key1' );
     320                unregister_meta_key( 'post:post', 'registered_key1' );
    336321
    337322                $this->assertEquals( 'I\'m just a field, take a good look at me', $meta_keys['registered_key1']['description'] );
    338323        }
    339324
    340325        public function test_get_registered_meta_keys_invalid_arg() {
    341                 register_meta( 'post', 'registered_key1', array( 'object_subtype' => 'post', 'invalid_arg' => 'invalid' ) );
     326                register_meta( 'post:post', 'registered_key1', array( 'invalid_arg' => 'invalid' ) );
    342327
    343                 $meta_keys = get_registered_meta_keys( 'post', 'post' );
     328                $meta_keys = get_registered_meta_keys( 'post:post' );
    344329
    345                 unregister_meta_key( 'post', 'post', 'registered_key1' );
     330                unregister_meta_key( 'post:post', 'registered_key1' );
    346331
    347332                $this->assertArrayNotHasKey( 'invalid_arg', $meta_keys['registered_key1'] );
    348333        }
    349334
    350335        public function test_get_registered_metadata() {
    351                 register_meta( 'post', 'flight_number', array( 'object_subtype' => 'post' ) );
     336                register_meta( 'post:post', 'flight_number' );
    352337                add_post_meta( self::$post_id, 'flight_number', 'Oceanic 815' );
    353338
    354                 $meta = get_registered_metadata( 'post', 'post', self::$post_id );
     339                $meta = get_registered_metadata( 'post:post', self::$post_id );
    355340
    356                 unregister_meta_key( 'post', 'post', 'flight_number' );
     341                unregister_meta_key( 'post:post', 'flight_number' );
    357342
    358343                $this->assertEquals( 'Oceanic 815', $meta['flight_number'][0] );
    359344        }
    360345
    361346        public function test_get_registered_metadata_by_key() {
    362                 register_meta( 'post', 'flight_number', array( 'object_subtype' => 'post' ) );
     347                register_meta( 'post:post', 'flight_number' );
    363348                add_post_meta( self::$post_id, 'flight_number', 'Oceanic 815' );
    364349
    365                 $meta = get_registered_metadata( 'post', 'post', self::$post_id, 'flight_number' );
     350                $meta = get_registered_metadata( 'post:post', self::$post_id, 'flight_number' );
    366351
    367                 unregister_meta_key( 'post', 'post', 'flight_number' );
     352                unregister_meta_key( 'post:post', 'flight_number' );
    368353
    369354                $this->assertEquals( 'Oceanic 815', $meta[0] );
    370355        }
    371356
    372357        public function test_get_registered_metadata_by_key_single() {
    373                 register_meta( 'post', 'flight_number', array( 'object_subtype' => 'post', 'single' => true ) );
     358                register_meta( 'post:post', 'flight_number', array( 'single' => true ) );
    374359                add_post_meta( self::$post_id, 'flight_number', 'Oceanic 815' );
    375360
    376                 $meta = get_registered_metadata( 'post', 'post', self::$post_id, 'flight_number' );
     361                $meta = get_registered_metadata( 'post:post', self::$post_id, 'flight_number' );
    377362
    378                 unregister_meta_key( 'post', 'post', 'flight_number' );
     363                unregister_meta_key( 'post:post', 'flight_number' );
    379364
    380365                $this->assertEquals( 'Oceanic 815', $meta );
    381366        }
    382367
    383368        public function test_get_registered_metadata_by_invalid_key() {
    384                 register_meta( 'post', 'flight_number', array( 'object_subtype' => 'post' ) );
     369                register_meta( 'post:post', 'flight_number' );
    385370                add_post_meta( self::$post_id, 'flight_number', 'Oceanic 815' );
    386371
    387                 $meta = get_registered_metadata( 'post', 'post', self::$post_id, 'flight_pilot' );
     372                $meta = get_registered_metadata( 'post:post', self::$post_id, 'flight_pilot' );
    388373
    389                 unregister_meta_key( 'post', 'post', 'flight_number' );
     374                unregister_meta_key( 'post:post', 'flight_number' );
    390375
    391376                $this->assertWPError( $meta );
    392377        }
    393378
    394379        public function test_get_registered_metadata_invalid_object_type() {
    395                 register_meta( 'post', 'flight_number', array( 'object_subtype' => 'post' ) );
     380                register_meta( 'post:post', 'flight_number' );
    396381                add_post_meta( self::$post_id, 'flight_number', 'Oceanic 815' );
    397382
    398                 $meta = get_registered_metadata( 'invalid-type', 'invalid-subtype', self::$post_id );
     383                $meta = get_registered_metadata( 'invalid-type:invalid-subtype', self::$post_id );
    399384
    400                 unregister_meta_key( 'post', 'post', 'flight_number' );
     385                unregister_meta_key( 'post:post', 'flight_number' );
    401386
    402387                $this->assertWPError( $meta );
    403388        }
    404389
    405390        public function test_get_registered_metadata_invalid() {
    406                 $meta = get_registered_metadata( 'invalid-type', 'invalid-subtype', self::$post_id );
     391                $meta = get_registered_metadata( 'invalid-type:invalid-subtype', self::$post_id );
    407392
    408393                $this->assertWPError( $meta );
    409394        }