diff --git a/src/wp-includes/post.php b/src/wp-includes/post.php
index b6ca7c24d3..9b7aa898e2 100644
--- a/src/wp-includes/post.php
+++ b/src/wp-includes/post.php
@@ -2112,6 +2112,7 @@ function is_post_type_viewable( $post_type ) {
  * For all others, the 'publicly_queryable' value will be used.
  *
  * @since 5.7.0
+ * @since 5.9.0 Added `is_post_status_viewable` hook to filter the result.
  *
  * @param string|stdClass $post_status Post status name or object.
  * @return bool Whether the post status should be considered viewable.
@@ -2132,7 +2133,24 @@ function is_post_status_viewable( $post_status ) {
 		return false;
 	}
 
-	return $post_status->publicly_queryable || ( $post_status->_builtin && $post_status->public );
+	$is_viewable = $post_status->publicly_queryable || ( $post_status->_builtin && $post_status->public );
+
+	/**
+	 * Filters whether a post status is considered "viewable".
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param bool     $is_viewable Whether the post status is "viewable".
+	 * @param stdClass $post_status Post status object.
+	 */
+	$is_viewable = apply_filters( 'is_post_status_viewable', $is_viewable, $post_status );
+
+	// Make sure the filtered value is a boolean type before returning it.
+	if ( ! is_bool( $is_viewable ) {
+		return false;
+	}
+
+	return $is_viewable;
 }
 
 /**
