WordPress.org

Make WordPress Core

Ticket #44238: 44238.2.diff

File 44238.2.diff, 9.2 KB (added by spacedmonkey, 2 years ago)
  • src/wp-admin/includes/ajax-actions.php

     
    707707                wp_die( 1 );
    708708        }
    709709
    710         if ( is_protected_meta( $meta->meta_key, 'post' ) || ! current_user_can( 'delete_post_meta', $meta->post_id, $meta->meta_key ) ) {
     710        $object_subtype = get_object_subtype( 'post', $meta->post_id );
     711        if ( is_protected_meta( $meta->meta_key, 'post', $object_subtype ) || ! current_user_can( 'delete_post_meta', $meta->post_id, $meta->meta_key ) ) {
    711712                wp_die( -1 );
    712713        }
    713714        if ( delete_meta( $meta->meta_id ) ) {
     
    14391440                if ( ! $meta = get_metadata_by_mid( 'post', $mid ) ) {
    14401441                        wp_die( 0 ); // if meta doesn't exist
    14411442                }
    1442                 if ( is_protected_meta( $meta->meta_key, 'post' ) || is_protected_meta( $key, 'post' ) ||
     1443
     1444                $object_subtype = get_object_subtype( 'post', $meta->post_id );
     1445                if ( is_protected_meta( $meta->meta_key, 'post', $object_subtype ) || is_protected_meta( $key, 'post', $object_subtype ) ||
    14431446                        ! current_user_can( 'edit_post_meta', $meta->post_id, $meta->meta_key ) ||
    14441447                        ! current_user_can( 'edit_post_meta', $meta->post_id, $key ) ) {
    14451448                        wp_die( -1 );
  • src/wp-admin/includes/meta-boxes.php

     
    724724<div id="ajax-response"></div>
    725725<?php
    726726$metadata = has_meta( $post->ID );
     727$object_subtype = get_object_subtype( 'post', $post->ID );
    727728foreach ( $metadata as $key => $value ) {
    728         if ( is_protected_meta( $metadata[ $key ]['meta_key'], 'post' ) || ! current_user_can( 'edit_post_meta', $post->ID, $metadata[ $key ]['meta_key'] ) ) {
     729        if ( is_protected_meta( $metadata[ $key ]['meta_key'], 'post', $object_subtype ) || ! current_user_can( 'edit_post_meta', $post->ID, $metadata[ $key ]['meta_key'] ) ) {
    729730                unset( $metadata[ $key ] );
    730731        }
    731732}
  • src/wp-admin/includes/post.php

     
    313313                wp_update_attachment_metadata( $post_ID, $id3data );
    314314        }
    315315
     316        $object_subtype = get_object_subtype( 'post', $post_ID );
    316317        // Meta Stuff
    317318        if ( isset( $post_data['meta'] ) && $post_data['meta'] ) {
    318319                foreach ( $post_data['meta'] as $key => $value ) {
     
    322323                        if ( $meta->post_id != $post_ID ) {
    323324                                continue;
    324325                        }
    325                         if ( is_protected_meta( $meta->meta_key, 'post' ) || ! current_user_can( 'edit_post_meta', $post_ID, $meta->meta_key ) ) {
     326                        if ( is_protected_meta( $meta->meta_key, 'post', $object_subtype ) || ! current_user_can( 'edit_post_meta', $post_ID, $meta->meta_key ) ) {
    326327                                continue;
    327328                        }
    328                         if ( is_protected_meta( $value['key'], 'post' ) || ! current_user_can( 'edit_post_meta', $post_ID, $value['key'] ) ) {
     329                        if ( is_protected_meta( $value['key'], 'post', $object_subtype ) || ! current_user_can( 'edit_post_meta', $post_ID, $value['key'] ) ) {
    329330                                continue;
    330331                        }
    331332                        update_meta( $key, $value['key'], $value['value'] );
     
    340341                        if ( $meta->post_id != $post_ID ) {
    341342                                continue;
    342343                        }
    343                         if ( is_protected_meta( $meta->meta_key, 'post' ) || ! current_user_can( 'delete_post_meta', $post_ID, $meta->meta_key ) ) {
     344                        if ( is_protected_meta( $meta->meta_key, 'post', $object_subtype ) || ! current_user_can( 'delete_post_meta', $post_ID, $meta->meta_key ) ) {
    344345                                continue;
    345346                        }
    346347                        delete_meta( $key );
     
    878879                if ( $metakeyinput ) {
    879880                        $metakey = $metakeyinput; // default
    880881                }
    881 
    882                 if ( is_protected_meta( $metakey, 'post' ) || ! current_user_can( 'add_post_meta', $post_ID, $metakey ) ) {
     882                $object_subtype = get_object_subtype( 'post', $post_ID );
     883                if ( is_protected_meta( $metakey, 'post', $object_subtype ) || ! current_user_can( 'add_post_meta', $post_ID, $metakey ) ) {
    883884                        return false;
    884885                }
    885886
  • src/wp-admin/includes/template.php

     
    582582function _list_meta_row( $entry, &$count ) {
    583583        static $update_nonce = '';
    584584
    585         if ( is_protected_meta( $entry['meta_key'], 'post' ) ) {
     585        $object_subtype = get_object_subtype( 'post', $entry['post_id'] );
     586        if ( is_protected_meta( $entry['meta_key'], 'post', $object_subtype ) ) {
    586587                return '';
    587588        }
    588589
  • src/wp-includes/capabilities.php

     
    375375                                if ( ! $allowed ) {
    376376                                        $caps[] = $cap;
    377377                                }
    378                         } elseif ( $meta_key && is_protected_meta( $meta_key, $object_type ) ) {
     378                        } elseif ( $meta_key && is_protected_meta( $meta_key, $object_type, $object_subtype ) ) {
    379379                                $caps[] = $cap;
    380380                        }
    381381                        break;
  • src/wp-includes/meta.php

     
    944944 * Determines whether a meta key is considered protected.
    945945 *
    946946 * @since 3.1.3
     947 * @since x.x.x  Add $object_sub_type
    947948 *
    948949 * @param string      $meta_key  Meta key.
    949950 * @param string|null $meta_type Optional. Type of object metadata is for (e.g., comment, post, or user).
     951 * @param string      $object_subtype Optional. Object sub type is for (e.g., post or page).
    950952 * @return bool Whether the meta key is considered protected.
    951953 */
    952 function is_protected_meta( $meta_key, $meta_type = null ) {
     954function is_protected_meta( $meta_key, $meta_type = null, $object_subtype = '' ) {
    953955        $protected = ( '_' == $meta_key[0] );
    954956
     957        if ( ! empty( $meta_type ) ) {
     958                /**
     959                 * Filters whether a meta key is considered protected.
     960                 *
     961                 * @since x.x.x
     962                 *
     963                 * @param bool $protected Whether the key is considered protected.
     964                 * @param string $meta_key Meta key.
     965                 * @param string|null $meta_type Type of object metadata is for (e.g., comment, post, or user).
     966                 * @param string $object_subtype Optional. Object sub type is for (e.g., post or page).
     967                 */
     968                $protected = apply_filters( "protected_{$meta_type}_meta_{$meta_key}", $protected, $meta_key, $meta_type, $object_subtype );
     969                if ( ! empty( $object_subtype ) ) {
     970                        /**
     971                         * Filters whether a meta key is considered protected.
     972                         *
     973                         * @since x.x.x
     974                         *
     975                         * @param bool $protected Whether the key is considered protected.
     976                         * @param string $meta_key Meta key.
     977                         * @param string|null $meta_type Type of object metadata is for (e.g., comment, post, or user).
     978                         * @param string $object_subtype Optional. Object sub type is for (e.g., post or page).
     979                         */
     980                        $protected = apply_filters( "protected_{$meta_type}_meta_{$meta_key}_for_{$object_subtype}", $protected, $meta_key, $meta_type, $object_subtype );
     981                }
     982        }
     983
    955984        /**
    956985         * Filters whether a meta key is considered protected.
    957986         *
     
    961990         * @param string      $meta_key  Meta key.
    962991         * @param string|null $meta_type Type of object metadata is for (e.g., comment, post, or user).
    963992         */
    964         return apply_filters( 'is_protected_meta', $protected, $meta_key, $meta_type );
     993        return apply_filters( 'is_protected_meta', $protected, $meta_key, $meta_type, $object_subtype );
    965994}
    966995
    967996/**
     
    10261055                $wp_meta_keys = array();
    10271056        }
    10281057
     1058        $protected = ( '_' == $meta_key[0] );
    10291059        $defaults = array(
    10301060                'type'              => 'string',
    10311061                'description'       => '',
    10321062                'single'            => false,
     1063                'protected'         => $protected,
    10331064                'sanitize_callback' => null,
    10341065                'auth_callback'     => null,
    10351066                'show_in_rest'      => false,
     
    10671098        $args = apply_filters( 'register_meta_args', $args, $defaults, $object_type, $meta_key );
    10681099        $args = wp_parse_args( $args, $defaults );
    10691100
     1101        if ( empty( $args['protected'] ) ) {
     1102                $protected_callback = '__return_false';
     1103        } else {
     1104                $protected_callback = '__return_true';
     1105        }
     1106
     1107        if ( ! empty( $object_subtype ) ) {
     1108                add_filter( "protected_{$meta_type}_meta_{$meta_key}_for_{$object_subtype}", $protected_callback, 10, 1 );
     1109        } else {
     1110                add_filter( "protected_{$meta_type}_meta_{$meta_key}", $protected_callback, 10, 1 );
     1111        }
     1112
    10701113        // If `auth_callback` is not provided, fall back to `is_protected_meta()`.
    10711114        if ( empty( $args['auth_callback'] ) ) {
    1072                 if ( is_protected_meta( $meta_key, $object_type ) ) {
     1115                if ( is_protected_meta( $meta_key, $object_type, $object_subtype ) ) {
    10731116                        $args['auth_callback'] = '__return_false';
    10741117                } else {
    10751118                        $args['auth_callback'] = '__return_true';
  • src/wp-includes/post-template.php

     
    10651065function the_meta() {
    10661066        if ( $keys = get_post_custom_keys() ) {
    10671067                $li_html = '';
     1068                $post_id = get_the_ID();
     1069                $object_subtype = get_object_subtype( 'post', $post_id );
    10681070                foreach ( (array) $keys as $key ) {
    10691071                        $keyt = trim( $key );
    1070                         if ( is_protected_meta( $keyt, 'post' ) ) {
     1072                        if ( is_protected_meta( $keyt, 'post', $object_subtype ) ) {
    10711073                                continue;
    10721074                        }
    10731075