WordPress.org

Make WordPress Core

Ticket #38323: 38323.diff

File 38323.diff, 13.4 KB (added by flixos90, 4 years ago)
  • src/wp-includes/meta.php

     
    4444                return false;
    4545        }
    4646
     47        $meta_subtype = get_object_subtype( $meta_type, $object_id );
     48
    4749        $column = sanitize_key($meta_type . '_id');
    4850
    4951        // expected_slashed ($meta_key)
    5052        $meta_key = wp_unslash($meta_key);
    5153        $meta_value = wp_unslash($meta_value);
    52         $meta_value = sanitize_meta( $meta_key, $meta_value, $meta_type );
     54        $meta_value = sanitize_meta( $meta_key, $meta_value, $meta_type, $meta_subtype );
    5355
    5456        /**
    5557         * Filters whether to add metadata of a specific type.
     
    157159                return false;
    158160        }
    159161
     162        $meta_subtype = get_object_subtype( $meta_type, $object_id );
     163
    160164        $column = sanitize_key($meta_type . '_id');
    161165        $id_column = 'user' == $meta_type ? 'umeta_id' : 'meta_id';
    162166
     
    165169        $meta_key = wp_unslash($meta_key);
    166170        $passed_value = $meta_value;
    167171        $meta_value = wp_unslash($meta_value);
    168         $meta_value = sanitize_meta( $meta_key, $meta_value, $meta_type );
     172        $meta_value = sanitize_meta( $meta_key, $meta_value, $meta_type, $meta_subtype );
    169173
    170174        /**
    171175         * Filters whether to update metadata of a specific type.
     
    641645                        return false;
    642646                }
    643647
     648                $meta_subtype = get_object_subtype( $meta_type, $object_id );
     649
    644650                // Sanitize the meta
    645651                $_meta_value = $meta_value;
    646                 $meta_value = sanitize_meta( $meta_key, $meta_value, $meta_type );
     652                $meta_value = sanitize_meta( $meta_key, $meta_value, $meta_type, $meta_subtype );
    647653                $meta_value = maybe_serialize( $meta_value );
    648654
    649655                // Format the data query arguments.
     
    936942 * Sanitize meta value.
    937943 *
    938944 * @since 3.1.3
     945 * @since 4.8.0 The `$object_subtype` parameter was added.
    939946 *
    940947 * @param string $meta_key       Meta key.
    941948 * @param mixed  $meta_value     Meta value to sanitize.
     
    943950 *
    944951 * @return mixed Sanitized $meta_value.
    945952 */
    946 function sanitize_meta( $meta_key, $meta_value, $object_type ) {
     953function sanitize_meta( $meta_key, $meta_value, $object_type, $object_subtype = '' ) {
     954        if ( ! empty( $object_subtype ) ) {
     955                /**
     956                 * Filters the sanitization of a specific meta key of a specific meta type and subtype.
     957                 *
     958                 * The dynamic portions of the hook name, `$object_type`, `$object_subtype`
     959                 * and `$meta_key`, refer to the metadata object type (comment, post, term or user),
     960                 * the object subtype and the meta key value, respectively.
     961                 *
     962                 * @since 4.8.0
     963                 *
     964                 * @param mixed  $meta_value     Meta value to sanitize.
     965                 * @param string $meta_key       Meta key.
     966                 * @param string $object_type    Object type.
     967                 * @param string $object_subtype Object subtype.
     968                 */
     969                $meta_value = apply_filters( "sanitize_{$object_type}_{$object_subtype}_meta_{$meta_key}", $meta_value, $meta_key, $object_type, $object_subtype );
     970        }
     971
    947972        /**
    948973         * Filters the sanitization of a specific meta key of a specific meta type.
    949974         *
     
    952977         * key value, respectively.
    953978         *
    954979         * @since 3.3.0
     980         * @since 4.8.0 Added the `$object_subtype` parameter.
    955981         *
    956          * @param mixed  $meta_value      Meta value to sanitize.
    957          * @param string $meta_key        Meta key.
    958          * @param string $object_type     Object type.
     982         * @param mixed  $meta_value     Meta value to sanitize.
     983         * @param string $meta_key       Meta key.
     984         * @param string $object_type    Object type.
     985         * @param string $object_subtype Object subtype.
    959986         */
    960         return apply_filters( "sanitize_{$object_type}_meta_{$meta_key}", $meta_value, $meta_key, $object_type );
     987        return apply_filters( "sanitize_{$object_type}_meta_{$meta_key}", $meta_value, $meta_key, $object_type, $object_subtype );
    961988}
    962989
    963990/**
     
    967994 * @since 4.6.0 {@link https://make.wordpress.org/core/2016/07/08/enhancing-register_meta-in-4-6/ Modified
    968995 *              to support an array of data to attach to registered meta keys}. Previous arguments for
    969996 *              `$sanitize_callback` and `$auth_callback` have been folded into this array.
     997 * @since 4.8.0 The `$object_subtype` argument was added to the arguments array.
    970998 *
    971999 * @param string $object_type    Type of object this meta is registered to.
    9721000 * @param string $meta_key       Meta key to register.
    9731001 * @param array  $args {
    9741002 *     Data used to describe the meta key when registered.
    9751003 *
     1004 *     @type string $object_subtype    A subtype; e.g. if the object type is "post", the post type. If left empty,
     1005 *                                     the meta key will be registered on the entire object type. Default empty.
    9761006 *     @type string $type              The type of data associated with this meta key.
    9771007 *     @type string $description       A description of the data attached to this meta key.
    9781008 *     @type bool   $single            Whether the meta key has one value per object, or an array of values per object.
     
    9941024        }
    9951025
    9961026        $defaults = array(
     1027                'object_subtype'    => '',
    9971028                'type'              => 'string',
    9981029                'description'       => '',
    9991030                'single'            => false,
     
    10341065        $args = apply_filters( 'register_meta_args', $args, $defaults, $object_type, $meta_key );
    10351066        $args = wp_parse_args( $args, $defaults );
    10361067
     1068        $object_subtype = ! empty( $args['object_subtype'] ) ? $args['object_subtype'] : '';
     1069
    10371070        // If `auth_callback` is not provided, fall back to `is_protected_meta()`.
    10381071        if ( empty( $args['auth_callback'] ) ) {
    10391072                if ( is_protected_meta( $meta_key, $object_type ) ) {
     
    10451078
    10461079        // Back-compat: old sanitize and auth callbacks are applied to all of an object type.
    10471080        if ( is_callable( $args['sanitize_callback'] ) ) {
    1048                 add_filter( "sanitize_{$object_type}_meta_{$meta_key}", $args['sanitize_callback'], 10, 3 );
     1081                if ( ! empty( $object_subtype ) ) {
     1082                        add_filter( "sanitize_{$object_type}_{$object_subtype}_meta_{$meta_key}", $args['sanitize_callback'], 10, 4 );
     1083                } else {
     1084                        add_filter( "sanitize_{$object_type}_meta_{$meta_key}", $args['sanitize_callback'], 10, 4 );
     1085                }
    10491086        }
    10501087
    10511088        if ( is_callable( $args['auth_callback'] ) ) {
    1052                 add_filter( "auth_{$object_type}_meta_{$meta_key}", $args['auth_callback'], 10, 6 );
     1089                if ( ! empty( $object_subtype ) ) {
     1090                        add_filter( "auth_{$object_type}_{$object_subtype}_meta_{$meta_key}", $args['auth_callback'], 10, 6 );
     1091                } else {
     1092                        add_filter( "auth_{$object_type}_meta_{$meta_key}", $args['auth_callback'], 10, 6 );
     1093                }
    10531094        }
    10541095
    10551096        // Global registry only contains meta keys registered with the array of arguments added in 4.6.0.
    10561097        if ( ! $has_old_auth_cb && ! $has_old_sanitize_cb ) {
    1057                 $wp_meta_keys[ $object_type ][ $meta_key ] = $args;
     1098                $wp_meta_keys[ $object_type ][ $object_subtype ][ $meta_key ] = $args;
    10581099
    10591100                return true;
    10601101        }
     
    10661107 * Checks if a meta key is registered.
    10671108 *
    10681109 * @since 4.6.0
     1110 * @since 4.8.0 The `$object_subtype` parameter was added.
    10691111 *
    10701112 * @param string $object_type    The type of object.
    10711113 * @param string $meta_key       The meta key.
     1114 * @param string $object_subtype Optional. The subtype of the object type.
    10721115 *
    10731116 * @return bool True if the meta key is registered to the object type. False if not.
    10741117 */
    1075 function registered_meta_key_exists( $object_type, $meta_key ) {
     1118function registered_meta_key_exists( $object_type, $meta_key, $object_subtype = '' ) {
    10761119        global $wp_meta_keys;
    10771120
    10781121        if ( ! is_array( $wp_meta_keys ) ) {
     
    10831126                return false;
    10841127        }
    10851128
    1086         if ( isset( $wp_meta_keys[ $object_type ][ $meta_key ] ) ) {
     1129        if ( ! isset( $wp_meta_keys[ $object_type ][ $object_subtype ] ) ) {
     1130                return false;
     1131        }
     1132
     1133        if ( isset( $wp_meta_keys[ $object_type ][ $object_subtype ][ $meta_key ] ) ) {
    10871134                return true;
    10881135        }
    10891136
     
    10941141 * Unregisters a meta key from the list of registered keys.
    10951142 *
    10961143 * @since 4.6.0
     1144 * @since 4.8.0 The `$object_subtype` parameter was added.
    10971145 *
    1098  * @param string $object_type The type of object.
    1099  * @param string $meta_key    The meta key.
     1146 * @param string $object_type    The type of object.
     1147 * @param string $meta_key       The meta key.
     1148 * @param string $object_subtype Optional. The subtype of the object type.
    11001149 * @return bool True if successful. False if the meta key was not registered.
    11011150 */
    1102 function unregister_meta_key( $object_type, $meta_key ) {
     1151function unregister_meta_key( $object_type, $meta_key, $object_subtype = '' ) {
    11031152        global $wp_meta_keys;
    11041153
    1105         if ( ! registered_meta_key_exists( $object_type, $meta_key ) ) {
     1154        if ( ! registered_meta_key_exists( $object_type, $meta_key, $object_subtype ) ) {
    11061155                return false;
    11071156        }
    11081157
    1109         $args = $wp_meta_keys[ $object_type ][ $meta_key ];
     1158        $args = $wp_meta_keys[ $object_type ][ $object_subtype ][ $meta_key ];
    11101159
    11111160        if ( isset( $args['sanitize_callback'] ) && is_callable( $args['sanitize_callback'] ) ) {
    1112                 remove_filter( "sanitize_{$object_type}_meta_{$meta_key}", $args['sanitize_callback'] );
     1161                if ( ! empty( $object_subtype ) ) {
     1162                        remove_filter( "sanitize_{$object_type}_{$object_subtype}_meta_{$meta_key}", $args['sanitize_callback'] );
     1163                } else {
     1164                        remove_filter( "sanitize_{$object_type}_meta_{$meta_key}", $args['sanitize_callback'] );
     1165                }
    11131166        }
    11141167
    11151168        if ( isset( $args['auth_callback'] ) && is_callable( $args['auth_callback'] ) ) {
    1116                 remove_filter( "auth_{$object_type}_meta_{$meta_key}", $args['auth_callback'] );
     1169                if ( ! empty( $object_subtype ) ) {
     1170                        remove_filter( "auth_{$object_type}_{$object_subtype}_meta_{$meta_key}", $args['auth_callback'] );
     1171                } else {
     1172                        remove_filter( "auth_{$object_type}_meta_{$meta_key}", $args['auth_callback'] );
     1173                }
    11171174        }
    11181175
    1119         unset( $wp_meta_keys[ $object_type ][ $meta_key ] );
     1176        unset( $wp_meta_keys[ $object_type ][ $object_subtype ][ $meta_key ] );
    11201177
    11211178        // Do some clean up
     1179        if ( empty( $wp_meta_keys[ $object_type ][ $object_subtype ] ) ) {
     1180                unset( $wp_meta_keys[ $object_type ][ $object_subtype ] );
     1181        }
    11221182        if ( empty( $wp_meta_keys[ $object_type ] ) ) {
    11231183                unset( $wp_meta_keys[ $object_type ] );
    11241184        }
     
    11301190 * Retrieves a list of registered meta keys for an object type.
    11311191 *
    11321192 * @since 4.6.0
     1193 * @since 4.8.0 The `$object_subtype` parameter was added.
    11331194 *
    1134  * @param string $object_type The type of object. Post, comment, user, term.
     1195 * @param string $object_type    The type of object. Post, comment, user, term.
     1196 * @param string $object_subtype Optional. The subtype of the object type.
    11351197 * @return array List of registered meta keys.
    11361198 */
    1137 function get_registered_meta_keys( $object_type ) {
     1199function get_registered_meta_keys( $object_type, $object_subtype = '' ) {
    11381200        global $wp_meta_keys;
    11391201
    1140         if ( ! is_array( $wp_meta_keys ) || ! isset( $wp_meta_keys[ $object_type ] ) ) {
     1202        if ( ! is_array( $wp_meta_keys ) || ! isset( $wp_meta_keys[ $object_type ] ) || ! isset( $wp_meta_keys[ $object_type ][ $object_subtype ] ) ) {
    11411203                return array();
    11421204        }
    11431205
    1144         return $wp_meta_keys[ $object_type ];
     1206        return $wp_meta_keys[ $object_type ][ $object_subtype ];
    11451207}
    11461208
    11471209/**
    11481210 * Retrieves registered metadata for a specified object.
    11491211 *
     1212 * The results include both meta that is registered specifically for the
     1213 * object's subtype and meta that is registered for the entire object type.
     1214 *
    11501215 * @since 4.6.0
    11511216 *
    11521217 * @param string $object_type Type of object to request metadata for. (e.g. comment, post, term, user)
     
    11571222 *               and values for an object ID if not.
    11581223 */
    11591224function get_registered_metadata( $object_type, $object_id, $meta_key = '' ) {
     1225        $object_subtype = get_object_subtype( $object_type, $object_id );
     1226
    11601227        if ( ! empty( $meta_key ) ) {
    1161                 if ( ! registered_meta_key_exists( $object_type, $meta_key ) ) {
     1228                if ( ! empty( $object_subtype ) ) {
     1229                        if ( ! registered_meta_key_exists( $object_type, $meta_key, $object_subtype ) ) {
     1230                                $object_subtype = '';
     1231                        }
     1232                }
     1233
     1234                if ( ! registered_meta_key_exists( $object_type, $meta_key, $object_subtype ) ) {
    11621235                        return false;
    11631236                }
    1164                 $meta_keys = get_registered_meta_keys( $object_type );
     1237
     1238                $meta_keys = get_registered_meta_keys( $object_type, $object_subtype );
    11651239                $meta_key_data = $meta_keys[ $meta_key ];
    11661240
    11671241                $data = get_metadata( $object_type, $object_id, $meta_key, $meta_key_data['single'] );
     
    11711245
    11721246        $data = get_metadata( $object_type, $object_id );
    11731247
    1174         $meta_keys = get_registered_meta_keys( $object_type );
     1248        $meta_keys = get_registered_meta_keys( $object_type, '' );
    11751249        $registered_data = array();
    11761250
    11771251        // Someday, array_filter()
     
    11811255                }
    11821256        }
    11831257
     1258        if ( ! empty( $object_subtype ) ) {
     1259                $meta_keys = get_registered_meta_keys( $object_type, $object_subtype );
     1260
     1261                foreach ( $meta_keys as $k => $v ) {
     1262                        if ( isset( $data[ $k ] ) ) {
     1263                                $registered_data[ $k ] = $data[ $k ];
     1264                        }
     1265                }
     1266        }
     1267
    11841268        return $registered_data;
    11851269}
    11861270
     
    12091293
    12101294        return $args;
    12111295}
     1296
     1297/**
     1298 * Returns the object subtype for a given object ID of a specific type.
     1299 *
     1300 * @since 4.8.0
     1301 *
     1302 * @param string $object_type Type of object to request metadata for. (e.g. comment, post, term, user)
     1303 * @param int    $object_id   ID of the object to retrieve its subtype.
     1304 * @return string The object subtype or an empty string if unspecified subtype.
     1305 */
     1306function get_object_subtype( $object_type, $object_id ) {
     1307        $object_subtype = '';
     1308
     1309        switch ( $object_type ) {
     1310                case 'post':
     1311                        $post_type = get_post_type( $object_id );
     1312                        if ( $post_type ) {
     1313                                $object_subtype = $post_type;
     1314                        }
     1315                        break;
     1316                case 'term':
     1317                        $term = get_term( $object_id );
     1318                        if ( $term ) {
     1319                                $object_subtype = $term->taxonomy;
     1320                        }
     1321                        break;
     1322                case 'comment':
     1323                        $comment = get_comment( $object_id );
     1324                        if ( $comment ) {
     1325                                $object_subtype = $comment->comment_type;
     1326                        }
     1327                        break;
     1328        }
     1329
     1330        return apply_filters( "get_object_subtype_{$object_type}", $object_subtype, $object_id );
     1331}