WordPress.org

Make WordPress Core

Ticket #38323: 38323.4.diff

File 38323.4.diff, 14.5 KB (added by flixos90, 3 years ago)
  • src/wp-includes/capabilities.php

     
    259259                list( $_, $object_type, $_ ) = explode( '_', $cap );
    260260                $object_id = (int) $args[0];
    261261
    262                 switch ( $object_type ) {
    263                         case 'post':
    264                                 $post = get_post( $object_id );
    265                                 if ( ! $post ) {
    266                                         break;
    267                                 }
    268 
    269                                 $sub_type = get_post_type( $post );
    270                                 break;
    271 
    272                         case 'comment':
    273                                 $comment = get_comment( $object_id );
    274                                 if ( ! $comment ) {
    275                                         break;
    276                                 }
    277 
    278                                 $sub_type = empty( $comment->comment_type ) ? 'comment' : $comment->comment_type;
    279                                 break;
    280 
    281                         case 'term':
    282                                 $term = get_term( $object_id );
    283                                 if ( ! $term instanceof WP_Term ) {
    284                                         break;
    285                                 }
    286 
    287                                 $sub_type = $term->taxonomy;
    288                                 break;
    289 
    290                         case 'user':
    291                                 $user = get_user_by( 'id', $object_id );
    292                                 if ( ! $user ) {
    293                                         break;
    294                                 }
    295 
    296                                 $sub_type = 'user';
    297                                 break;
    298                 }
     262                $sub_type = get_object_subtype( $object_type, $object_id );
    299263
    300264                if ( empty( $sub_type ) ) {
    301265                        $caps[] = 'do_not_allow';
  • 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.
     
    640644                        return false;
    641645                }
    642646
     647                $meta_subtype = get_object_subtype( $meta_type, $object_id );
     648
    643649                // Sanitize the meta
    644650                $_meta_value = $meta_value;
    645                 $meta_value = sanitize_meta( $meta_key, $meta_value, $meta_type );
     651                $meta_value = sanitize_meta( $meta_key, $meta_value, $meta_type, $meta_subtype );
    646652                $meta_value = maybe_serialize( $meta_value );
    647653
    648654                // Format the data query arguments.
     
    935941 * Sanitize meta value.
    936942 *
    937943 * @since 3.1.3
     944 * @since 5.0.0 The `$object_subtype` parameter was added.
    938945 *
    939946 * @param string $meta_key       Meta key.
    940947 * @param mixed  $meta_value     Meta value to sanitize.
     
    942949 *
    943950 * @return mixed Sanitized $meta_value.
    944951 */
    945 function sanitize_meta( $meta_key, $meta_value, $object_type ) {
     952function sanitize_meta( $meta_key, $meta_value, $object_type, $object_subtype = '' ) {
     953        if ( ! empty( $object_subtype ) ) {
     954                /**
     955                 * Filters the sanitization of a specific meta key of a specific meta type and subtype.
     956                 *
     957                 * The dynamic portions of the hook name, `$object_type`, `$object_subtype`
     958                 * and `$meta_key`, refer to the metadata object type (comment, post, term or user),
     959                 * the object subtype and the meta key value, respectively.
     960                 *
     961                 * @since 5.0.0
     962                 *
     963                 * @param mixed  $meta_value     Meta value to sanitize.
     964                 * @param string $meta_key       Meta key.
     965                 * @param string $object_type    Object type.
     966                 * @param string $object_subtype Object subtype.
     967                 */
     968                $meta_value = apply_filters( "sanitize_{$object_type}_{$object_subtype}_meta_{$meta_key}", $meta_value, $meta_key, $object_type, $object_subtype );
     969        }
     970
    946971        /**
    947972         * Filters the sanitization of a specific meta key of a specific meta type.
    948973         *
     
    966991 * @since 4.6.0 {@link https://core.trac.wordpress.org/ticket/35658 Modified
    967992 *              to support an array of data to attach to registered meta keys}. Previous arguments for
    968993 *              `$sanitize_callback` and `$auth_callback` have been folded into this array.
     994 * @since 5.0.0 The `$object_subtype` argument was added to the arguments array.
    969995 *
    970996 * @param string $object_type    Type of object this meta is registered to.
    971997 * @param string $meta_key       Meta key to register.
    972998 * @param array  $args {
    973999 *     Data used to describe the meta key when registered.
    9741000 *
     1001 *     @type string $object_subtype    A subtype; e.g. if the object type is "post", the post type. If left empty,
     1002 *                                     the meta key will be registered on the entire object type. Default empty.
    9751003 *     @type string $type              The type of data associated with this meta key.
    9761004 *                                     Valid values are 'string', 'boolean', 'integer', and 'number'.
    9771005 *     @type string $description       A description of the data attached to this meta key.
     
    9941022        }
    9951023
    9961024        $defaults = array(
     1025                'object_subtype'    => '',
    9971026                'type'              => 'string',
    9981027                'description'       => '',
    9991028                'single'            => false,
     
    10341063        $args = apply_filters( 'register_meta_args', $args, $defaults, $object_type, $meta_key );
    10351064        $args = wp_parse_args( $args, $defaults );
    10361065
     1066        $object_subtype = ! empty( $args['object_subtype'] ) ? $args['object_subtype'] : '';
     1067
    10371068        // If `auth_callback` is not provided, fall back to `is_protected_meta()`.
    10381069        if ( empty( $args['auth_callback'] ) ) {
    10391070                if ( is_protected_meta( $meta_key, $object_type ) ) {
     
    10451076
    10461077        // Back-compat: old sanitize and auth callbacks are applied to all of an object type.
    10471078        if ( is_callable( $args['sanitize_callback'] ) ) {
    1048                 add_filter( "sanitize_{$object_type}_meta_{$meta_key}", $args['sanitize_callback'], 10, 3 );
     1079                if ( ! empty( $object_subtype ) ) {
     1080                        add_filter( "sanitize_{$object_type}_{$object_subtype}_meta_{$meta_key}", $args['sanitize_callback'], 10, 4 );
     1081                } else {
     1082                        add_filter( "sanitize_{$object_type}_meta_{$meta_key}", $args['sanitize_callback'], 10, 3 );
     1083                }
    10491084        }
    10501085
    10511086        if ( is_callable( $args['auth_callback'] ) ) {
    1052                 add_filter( "auth_{$object_type}_meta_{$meta_key}", $args['auth_callback'], 10, 6 );
     1087                if ( ! empty( $object_subtype ) ) {
     1088                        add_filter( "auth_{$object_type}_{$object_subtype}_meta_{$meta_key}", $args['auth_callback'], 10, 6 );
     1089                } else {
     1090                        add_filter( "auth_{$object_type}_meta_{$meta_key}", $args['auth_callback'], 10, 6 );
     1091                }
    10531092        }
    10541093
    10551094        // Global registry only contains meta keys registered with the array of arguments added in 4.6.0.
    10561095        if ( ! $has_old_auth_cb && ! $has_old_sanitize_cb ) {
    1057                 $wp_meta_keys[ $object_type ][ $meta_key ] = $args;
     1096                $wp_meta_keys[ $object_type ][ $object_subtype ][ $meta_key ] = $args;
    10581097
    10591098                return true;
    10601099        }
     
    10661105 * Checks if a meta key is registered.
    10671106 *
    10681107 * @since 4.6.0
     1108 * @since 5.0.0 The `$object_subtype` parameter was added.
    10691109 *
    10701110 * @param string $object_type    The type of object.
    10711111 * @param string $meta_key       The meta key.
     1112 * @param string $object_subtype Optional. The subtype of the object type.
    10721113 *
    10731114 * @return bool True if the meta key is registered to the object type. False if not.
    10741115 */
    1075 function registered_meta_key_exists( $object_type, $meta_key ) {
     1116function registered_meta_key_exists( $object_type, $meta_key, $object_subtype = '' ) {
    10761117        global $wp_meta_keys;
    10771118
    10781119        if ( ! is_array( $wp_meta_keys ) ) {
     
    10831124                return false;
    10841125        }
    10851126
    1086         if ( isset( $wp_meta_keys[ $object_type ][ $meta_key ] ) ) {
     1127        if ( ! isset( $wp_meta_keys[ $object_type ][ $object_subtype ] ) ) {
     1128                return false;
     1129        }
     1130
     1131        if ( isset( $wp_meta_keys[ $object_type ][ $object_subtype ][ $meta_key ] ) ) {
    10871132                return true;
    10881133        }
    10891134
     
    10941139 * Unregisters a meta key from the list of registered keys.
    10951140 *
    10961141 * @since 4.6.0
     1142 * @since 5.0.0 The `$object_subtype` parameter was added.
    10971143 *
    1098  * @param string $object_type The type of object.
    1099  * @param string $meta_key    The meta key.
     1144 * @param string $object_type    The type of object.
     1145 * @param string $meta_key       The meta key.
     1146 * @param string $object_subtype Optional. The subtype of the object type.
    11001147 * @return bool True if successful. False if the meta key was not registered.
    11011148 */
    1102 function unregister_meta_key( $object_type, $meta_key ) {
     1149function unregister_meta_key( $object_type, $meta_key, $object_subtype = '' ) {
    11031150        global $wp_meta_keys;
    11041151
    1105         if ( ! registered_meta_key_exists( $object_type, $meta_key ) ) {
     1152        if ( ! registered_meta_key_exists( $object_type, $meta_key, $object_subtype ) ) {
    11061153                return false;
    11071154        }
    11081155
    1109         $args = $wp_meta_keys[ $object_type ][ $meta_key ];
     1156        $args = $wp_meta_keys[ $object_type ][ $object_subtype ][ $meta_key ];
    11101157
    11111158        if ( isset( $args['sanitize_callback'] ) && is_callable( $args['sanitize_callback'] ) ) {
    1112                 remove_filter( "sanitize_{$object_type}_meta_{$meta_key}", $args['sanitize_callback'] );
     1159                if ( ! empty( $object_subtype ) ) {
     1160                        remove_filter( "sanitize_{$object_type}_{$object_subtype}_meta_{$meta_key}", $args['sanitize_callback'] );
     1161                } else {
     1162                        remove_filter( "sanitize_{$object_type}_meta_{$meta_key}", $args['sanitize_callback'] );
     1163                }
    11131164        }
    11141165
    11151166        if ( isset( $args['auth_callback'] ) && is_callable( $args['auth_callback'] ) ) {
    1116                 remove_filter( "auth_{$object_type}_meta_{$meta_key}", $args['auth_callback'] );
     1167                if ( ! empty( $object_subtype ) ) {
     1168                        remove_filter( "auth_{$object_type}_{$object_subtype}_meta_{$meta_key}", $args['auth_callback'] );
     1169                } else {
     1170                        remove_filter( "auth_{$object_type}_meta_{$meta_key}", $args['auth_callback'] );
     1171                }
    11171172        }
    11181173
    1119         unset( $wp_meta_keys[ $object_type ][ $meta_key ] );
     1174        unset( $wp_meta_keys[ $object_type ][ $object_subtype ][ $meta_key ] );
    11201175
    11211176        // Do some clean up
     1177        if ( empty( $wp_meta_keys[ $object_type ][ $object_subtype ] ) ) {
     1178                unset( $wp_meta_keys[ $object_type ][ $object_subtype ] );
     1179        }
    11221180        if ( empty( $wp_meta_keys[ $object_type ] ) ) {
    11231181                unset( $wp_meta_keys[ $object_type ] );
    11241182        }
     
    11301188 * Retrieves a list of registered meta keys for an object type.
    11311189 *
    11321190 * @since 4.6.0
     1191 * @since 5.0.0 The `$object_subtype` parameter was added.
    11331192 *
    1134  * @param string $object_type The type of object. Post, comment, user, term.
     1193 * @param string $object_type    The type of object. Post, comment, user, term.
     1194 * @param string $object_subtype Optional. The subtype of the object type.
    11351195 * @return array List of registered meta keys.
    11361196 */
    1137 function get_registered_meta_keys( $object_type ) {
     1197function get_registered_meta_keys( $object_type, $object_subtype = '' ) {
    11381198        global $wp_meta_keys;
    11391199
    1140         if ( ! is_array( $wp_meta_keys ) || ! isset( $wp_meta_keys[ $object_type ] ) ) {
     1200        if ( ! is_array( $wp_meta_keys ) || ! isset( $wp_meta_keys[ $object_type ] ) || ! isset( $wp_meta_keys[ $object_type ][ $object_subtype ] ) ) {
    11411201                return array();
    11421202        }
    11431203
    1144         return $wp_meta_keys[ $object_type ];
     1204        return $wp_meta_keys[ $object_type ][ $object_subtype ];
    11451205}
    11461206
    11471207/**
    11481208 * Retrieves registered metadata for a specified object.
    11491209 *
     1210 * The results include both meta that is registered specifically for the
     1211 * object's subtype and meta that is registered for the entire object type.
     1212 *
    11501213 * @since 4.6.0
    11511214 *
    11521215 * @param string $object_type Type of object to request metadata for. (e.g. comment, post, term, user)
     
    11571220 *               and values for an object ID if not.
    11581221 */
    11591222function get_registered_metadata( $object_type, $object_id, $meta_key = '' ) {
     1223        $object_subtype = get_object_subtype( $object_type, $object_id );
     1224
    11601225        if ( ! empty( $meta_key ) ) {
    1161                 if ( ! registered_meta_key_exists( $object_type, $meta_key ) ) {
     1226                if ( ! empty( $object_subtype ) ) {
     1227                        if ( ! registered_meta_key_exists( $object_type, $meta_key, $object_subtype ) ) {
     1228                                $object_subtype = '';
     1229                        }
     1230                }
     1231
     1232                if ( ! registered_meta_key_exists( $object_type, $meta_key, $object_subtype ) ) {
    11621233                        return false;
    11631234                }
    1164                 $meta_keys = get_registered_meta_keys( $object_type );
     1235
     1236                $meta_keys = get_registered_meta_keys( $object_type, $object_subtype );
    11651237                $meta_key_data = $meta_keys[ $meta_key ];
    11661238
    11671239                $data = get_metadata( $object_type, $object_id, $meta_key, $meta_key_data['single'] );
     
    11711243
    11721244        $data = get_metadata( $object_type, $object_id );
    11731245
    1174         $meta_keys = get_registered_meta_keys( $object_type );
     1246        $meta_keys = get_registered_meta_keys( $object_type, '' );
    11751247        $registered_data = array();
    11761248
    11771249        // Someday, array_filter()
     
    11811253                }
    11821254        }
    11831255
     1256        if ( ! empty( $object_subtype ) ) {
     1257                $meta_keys = get_registered_meta_keys( $object_type, $object_subtype );
     1258
     1259                foreach ( $meta_keys as $k => $v ) {
     1260                        if ( isset( $data[ $k ] ) ) {
     1261                                $registered_data[ $k ] = $data[ $k ];
     1262                        }
     1263                }
     1264        }
     1265
    11841266        return $registered_data;
    11851267}
    11861268
     
    12091291
    12101292        return $args;
    12111293}
     1294
     1295/**
     1296 * Returns the object subtype for a given object ID of a specific type.
     1297 *
     1298 * @since 5.0.0
     1299 *
     1300 * @param string $object_type Type of object to request metadata for. (e.g. comment, post, term, user)
     1301 * @param int    $object_id   ID of the object to retrieve its subtype.
     1302 * @return string The object subtype or an empty string if unspecified subtype.
     1303 */
     1304function get_object_subtype( $object_type, $object_id ) {
     1305        $object_id = (int) $object_type;
     1306        $object_subtype = '';
     1307
     1308        switch ( $object_type ) {
     1309                case 'post':
     1310                        $post = get_post( $object_id );
     1311                        if ( ! $post ) {
     1312                                break;
     1313                        }
     1314
     1315                        $object_subtype = get_post_type( $post );
     1316                        break;
     1317
     1318                case 'comment':
     1319                        $comment = get_comment( $object_id );
     1320                        if ( ! $comment ) {
     1321                                break;
     1322                        }
     1323
     1324                        $object_subtype = empty( $comment->comment_type ) ? 'comment' : $comment->comment_type;
     1325                        break;
     1326
     1327                case 'term':
     1328                        $term = get_term( $object_id );
     1329                        if ( ! $term instanceof WP_Term ) {
     1330                                break;
     1331                        }
     1332
     1333                        $object_subtype = $term->taxonomy;
     1334                        break;
     1335
     1336                case 'user':
     1337                        $user = get_user_by( 'id', $object_id );
     1338                        if ( ! $user ) {
     1339                                break;
     1340                        }
     1341
     1342                        $object_subtype = 'user';
     1343                        break;
     1344                default:
     1345
     1346                        /**
     1347                         * Filters the object subtype identifier for a non standard object type.
     1348                         *
     1349                         * The dynamic portion of the hook, `$object_type`, refers to the object
     1350                         * type (post, comment, term, or user).
     1351                         *
     1352                         * @since 5.0.0
     1353                         *
     1354                         * @param string $object_subtype Empty string to override.
     1355                         * @param int    $object_id      ID of the object to get the subtype for.
     1356                         */
     1357                        $object_subtype = apply_filters( "get_object_subtype_{$object_type}", $object_subtype, $object_id );
     1358        }
     1359
     1360        return $object_subtype;
     1361}