Index: src/wp-admin/includes/ajax-actions.php
===================================================================
--- src/wp-admin/includes/ajax-actions.php	(revision 43344)
+++ src/wp-admin/includes/ajax-actions.php	(working copy)
@@ -707,7 +707,8 @@
 		wp_die( 1 );
 	}
 
-	if ( is_protected_meta( $meta->meta_key, 'post' ) || ! current_user_can( 'delete_post_meta', $meta->post_id, $meta->meta_key ) ) {
+	$object_subtype = get_object_subtype( 'post', $meta->post_id );
+	if ( is_protected_meta( $meta->meta_key, 'post', $object_subtype ) || ! current_user_can( 'delete_post_meta', $meta->post_id, $meta->meta_key ) ) {
 		wp_die( -1 );
 	}
 	if ( delete_meta( $meta->meta_id ) ) {
@@ -1439,7 +1440,9 @@
 		if ( ! $meta = get_metadata_by_mid( 'post', $mid ) ) {
 			wp_die( 0 ); // if meta doesn't exist
 		}
-		if ( is_protected_meta( $meta->meta_key, 'post' ) || is_protected_meta( $key, 'post' ) ||
+
+		$object_subtype = get_object_subtype( 'post', $meta->post_id );
+		if ( is_protected_meta( $meta->meta_key, 'post', $object_subtype ) || is_protected_meta( $key, 'post', $object_subtype ) ||
 			! current_user_can( 'edit_post_meta', $meta->post_id, $meta->meta_key ) ||
 			! current_user_can( 'edit_post_meta', $meta->post_id, $key ) ) {
 			wp_die( -1 );
Index: src/wp-admin/includes/meta-boxes.php
===================================================================
--- src/wp-admin/includes/meta-boxes.php	(revision 43344)
+++ src/wp-admin/includes/meta-boxes.php	(working copy)
@@ -724,8 +724,9 @@
 <div id="ajax-response"></div>
 <?php
 $metadata = has_meta( $post->ID );
+$object_subtype = get_object_subtype( 'post', $post->ID );
 foreach ( $metadata as $key => $value ) {
-	if ( is_protected_meta( $metadata[ $key ]['meta_key'], 'post' ) || ! current_user_can( 'edit_post_meta', $post->ID, $metadata[ $key ]['meta_key'] ) ) {
+	if ( is_protected_meta( $metadata[ $key ]['meta_key'], 'post', $object_subtype ) || ! current_user_can( 'edit_post_meta', $post->ID, $metadata[ $key ]['meta_key'] ) ) {
 		unset( $metadata[ $key ] );
 	}
 }
Index: src/wp-admin/includes/post.php
===================================================================
--- src/wp-admin/includes/post.php	(revision 43344)
+++ src/wp-admin/includes/post.php	(working copy)
@@ -313,6 +313,7 @@
 		wp_update_attachment_metadata( $post_ID, $id3data );
 	}
 
+	$object_subtype = get_object_subtype( 'post', $post_ID );
 	// Meta Stuff
 	if ( isset( $post_data['meta'] ) && $post_data['meta'] ) {
 		foreach ( $post_data['meta'] as $key => $value ) {
@@ -322,10 +323,10 @@
 			if ( $meta->post_id != $post_ID ) {
 				continue;
 			}
-			if ( is_protected_meta( $meta->meta_key, 'post' ) || ! current_user_can( 'edit_post_meta', $post_ID, $meta->meta_key ) ) {
+			if ( is_protected_meta( $meta->meta_key, 'post', $object_subtype ) || ! current_user_can( 'edit_post_meta', $post_ID, $meta->meta_key ) ) {
 				continue;
 			}
-			if ( is_protected_meta( $value['key'], 'post' ) || ! current_user_can( 'edit_post_meta', $post_ID, $value['key'] ) ) {
+			if ( is_protected_meta( $value['key'], 'post', $object_subtype ) || ! current_user_can( 'edit_post_meta', $post_ID, $value['key'] ) ) {
 				continue;
 			}
 			update_meta( $key, $value['key'], $value['value'] );
@@ -340,7 +341,7 @@
 			if ( $meta->post_id != $post_ID ) {
 				continue;
 			}
-			if ( is_protected_meta( $meta->meta_key, 'post' ) || ! current_user_can( 'delete_post_meta', $post_ID, $meta->meta_key ) ) {
+			if ( is_protected_meta( $meta->meta_key, 'post', $object_subtype ) || ! current_user_can( 'delete_post_meta', $post_ID, $meta->meta_key ) ) {
 				continue;
 			}
 			delete_meta( $key );
@@ -878,8 +879,8 @@
 		if ( $metakeyinput ) {
 			$metakey = $metakeyinput; // default
 		}
-
-		if ( is_protected_meta( $metakey, 'post' ) || ! current_user_can( 'add_post_meta', $post_ID, $metakey ) ) {
+		$object_subtype = get_object_subtype( 'post', $post_ID );
+		if ( is_protected_meta( $metakey, 'post', $object_subtype ) || ! current_user_can( 'add_post_meta', $post_ID, $metakey ) ) {
 			return false;
 		}
 
Index: src/wp-admin/includes/template.php
===================================================================
--- src/wp-admin/includes/template.php	(revision 43344)
+++ src/wp-admin/includes/template.php	(working copy)
@@ -582,7 +582,8 @@
 function _list_meta_row( $entry, &$count ) {
 	static $update_nonce = '';
 
-	if ( is_protected_meta( $entry['meta_key'], 'post' ) ) {
+	$object_subtype = get_object_subtype( 'post', $entry['post_id'] );
+	if ( is_protected_meta( $entry['meta_key'], 'post', $object_subtype ) ) {
 		return '';
 	}
 
Index: src/wp-includes/capabilities.php
===================================================================
--- src/wp-includes/capabilities.php	(revision 43344)
+++ src/wp-includes/capabilities.php	(working copy)
@@ -375,7 +375,7 @@
 				if ( ! $allowed ) {
 					$caps[] = $cap;
 				}
-			} elseif ( $meta_key && is_protected_meta( $meta_key, $object_type ) ) {
+			} elseif ( $meta_key && is_protected_meta( $meta_key, $object_type, $object_subtype ) ) {
 				$caps[] = $cap;
 			}
 			break;
Index: src/wp-includes/meta.php
===================================================================
--- src/wp-includes/meta.php	(revision 43344)
+++ src/wp-includes/meta.php	(working copy)
@@ -944,14 +944,43 @@
  * Determines whether a meta key is considered protected.
  *
  * @since 3.1.3
+ * @since x.x.x  Add $object_sub_type
  *
  * @param string      $meta_key  Meta key.
  * @param string|null $meta_type Optional. Type of object metadata is for (e.g., comment, post, or user).
+ * @param string      $object_subtype Optional. Object sub type is for (e.g., post or page).
  * @return bool Whether the meta key is considered protected.
  */
-function is_protected_meta( $meta_key, $meta_type = null ) {
+function is_protected_meta( $meta_key, $meta_type = null, $object_subtype = '' ) {
 	$protected = ( '_' == $meta_key[0] );
 
+	if ( ! empty( $meta_type ) ) {
+		/**
+		 * Filters whether a meta key is considered protected.
+		 *
+		 * @since x.x.x
+		 *
+		 * @param bool $protected Whether the key is considered protected.
+		 * @param string $meta_key Meta key.
+		 * @param string|null $meta_type Type of object metadata is for (e.g., comment, post, or user).
+		 * @param string $object_subtype Optional. Object sub type is for (e.g., post or page).
+		 */
+		$protected = apply_filters( "protected_{$meta_type}_meta_{$meta_key}", $protected, $meta_key, $meta_type, $object_subtype );
+		if ( ! empty( $object_subtype ) ) {
+			/**
+			 * Filters whether a meta key is considered protected.
+			 *
+			 * @since x.x.x
+			 *
+			 * @param bool $protected Whether the key is considered protected.
+			 * @param string $meta_key Meta key.
+			 * @param string|null $meta_type Type of object metadata is for (e.g., comment, post, or user).
+			 * @param string $object_subtype Optional. Object sub type is for (e.g., post or page).
+			 */
+			$protected = apply_filters( "protected_{$meta_type}_meta_{$meta_key}_for_{$object_subtype}", $protected, $meta_key, $meta_type, $object_subtype );
+		}
+	}
+
 	/**
 	 * Filters whether a meta key is considered protected.
 	 *
@@ -961,7 +990,7 @@
 	 * @param string      $meta_key  Meta key.
 	 * @param string|null $meta_type Type of object metadata is for (e.g., comment, post, or user).
 	 */
-	return apply_filters( 'is_protected_meta', $protected, $meta_key, $meta_type );
+	return apply_filters( 'is_protected_meta', $protected, $meta_key, $meta_type, $object_subtype );
 }
 
 /**
@@ -1026,10 +1055,12 @@
 		$wp_meta_keys = array();
 	}
 
+	$protected = ( '_' == $meta_key[0] );
 	$defaults = array(
 		'type'              => 'string',
 		'description'       => '',
 		'single'            => false,
+		'protected'         => $protected,
 		'sanitize_callback' => null,
 		'auth_callback'     => null,
 		'show_in_rest'      => false,
@@ -1067,9 +1098,21 @@
 	$args = apply_filters( 'register_meta_args', $args, $defaults, $object_type, $meta_key );
 	$args = wp_parse_args( $args, $defaults );
 
+	if ( empty( $args['protected'] ) ) {
+		$protected_callback = '__return_false';
+	} else {
+		$protected_callback = '__return_true';
+	}
+
+	if ( ! empty( $object_subtype ) ) {
+		add_filter( "protected_{$meta_type}_meta_{$meta_key}_for_{$object_subtype}", $protected_callback, 10, 1 );
+	} else {
+		add_filter( "protected_{$meta_type}_meta_{$meta_key}", $protected_callback, 10, 1 );
+	}
+
 	// If `auth_callback` is not provided, fall back to `is_protected_meta()`.
 	if ( empty( $args['auth_callback'] ) ) {
-		if ( is_protected_meta( $meta_key, $object_type ) ) {
+		if ( is_protected_meta( $meta_key, $object_type, $object_subtype ) ) {
 			$args['auth_callback'] = '__return_false';
 		} else {
 			$args['auth_callback'] = '__return_true';
Index: src/wp-includes/post-template.php
===================================================================
--- src/wp-includes/post-template.php	(revision 43344)
+++ src/wp-includes/post-template.php	(working copy)
@@ -1065,9 +1065,11 @@
 function the_meta() {
 	if ( $keys = get_post_custom_keys() ) {
 		$li_html = '';
+		$post_id = get_the_ID();
+		$object_subtype = get_object_subtype( 'post', $post_id );
 		foreach ( (array) $keys as $key ) {
 			$keyt = trim( $key );
-			if ( is_protected_meta( $keyt, 'post' ) ) {
+			if ( is_protected_meta( $keyt, 'post', $object_subtype ) ) {
 				continue;
 			}
 
