diff --git a/wp-admin/includes/misc.php b/wp-admin/includes/misc.php
index 34ced18df5..24cd26d661 100644
--- a/wp-admin/includes/misc.php
+++ b/wp-admin/includes/misc.php
@@ -1642,3 +1642,131 @@ function wp_check_php_version() {
return $response;
}
+
+/**
+ * Creates and returns the markup for an admin notice.
+ *
+ * @since 6.4.0
+ *
+ * @param string $message The message.
+ * @param array $args {
+ * Optional. An array of arguments for the admin notice. Default empty array.
+ *
+ * @type string $type Optional. The type of admin notice.
+ * For example, 'error', 'success', 'warning', 'info'.
+ * Default empty string.
+ * @type bool $dismissible Optional. Whether the admin notice is dismissible. Default false.
+ * @type string $id Optional. The value of the admin notice's ID attribute. Default empty string.
+ * @type string[] $additional_classes Optional. A string array of class names. Default empty array.
+ * @type bool $paragraph_wrap Optional. Whether to wrap the message in paragraph tags. Default true.
+ * }
+ * @return string The markup for an admin notice.
+ */
+function wp_get_admin_notice( $message, $args = array() ) {
+ $defaults = array(
+ 'type' => '',
+ 'dismissible' => false,
+ 'id' => '',
+ 'additional_classes' => array(),
+ 'paragraph_wrap' => true,
+ );
+
+ $args = wp_parse_args( $args, $defaults );
+
+ /**
+ * Filters the arguments for an admin notice.
+ *
+ * @since 6.4.0
+ *
+ * @param array $args The arguments for the admin notice.
+ * @param string $message The message for the admin notice.
+ */
+ $args = apply_filters( 'wp_admin_notice_args', $args, $message );
+ $id = '';
+ $classes = 'notice';
+
+ if ( is_string( $args['id'] ) ) {
+ $trimmed_id = trim( $args['id'] );
+
+ if ( '' !== $trimmed_id ) {
+ $id = 'id="' . $trimmed_id . '" ';
+ }
+ }
+
+ if ( is_string( $args['type'] ) ) {
+ $type = trim( $args['type'] );
+
+ if ( str_contains( $type, ' ' ) ) {
+ _doing_it_wrong(
+ __FUNCTION__,
+ sprintf(
+ /* translators: %s: The "type" key. */
+ __( 'The %s key must be a string without spaces.' ),
+ 'type
'
+ ),
+ '6.4.0'
+ );
+ }
+
+ if ( '' !== $type ) {
+ $classes .= ' notice-' . $type;
+ }
+ }
+
+ if ( true === $args['dismissible'] ) {
+ $classes .= ' is-dismissible';
+ }
+
+ if ( is_array( $args['additional_classes'] ) && ! empty( $args['additional_classes'] ) ) {
+ $classes .= ' ' . implode( ' ', $args['additional_classes'] );
+ }
+
+ if ( false !== $args['paragraph_wrap'] ) {
+ $message = "
$message
"; + } + + $markup = sprintf( '