diff --git a/wp-includes/shortcodes.php b/wp-includes/shortcodes.php
index 057fad7..beba16f 100644
--- a/wp-includes/shortcodes.php
+++ b/wp-includes/shortcodes.php
@@ -228,6 +228,36 @@ function do_shortcode( $content, $ignore_html = false ) {
 }
 
 /**
+ * Executes a single shortcode with given attributes.
+ *
+ * This function is not meant for use with nested shortcodes. For that, use do_shortcode().
+ *
+ * @since 4.4.0
+ *
+ * @global array $shortcode_tags Shortcode tags.
+ *
+ * @param string $tag     Name of a registered shortcode.
+ * @param array  $atts    Optional. Attributes to pass to the shortcode hook. Default empty array.
+ * @param string $content Optional. Content to use inside the shortcode tag. Default null (self-closing).
+ * @return string|WP_Error Shortcode content, or WP_Error instance if invalid.
+ */
+function do_single_shortcode( $tag, $atts = array(), $content = null ) {
+	global $shortcode_tags;
+
+	if ( empty( $shortcode_tags[ $tag ] ) ) {
+		return new WP_Error( 'shortcode_invalid_tag', sprintf( __( 'Shortcode %s is not registered' ), $tag ), $tag );
+	}
+
+	$callback = $shortcode_tags[ $tag ];
+
+	if ( ! is_callable( $callback ) ) {
+		return new WP_Error( 'shortcode_invalid_callback', sprintf( __( 'Shortcode %s does not have a valid registered callback.' ), $tag ), $tag );
+	}
+
+	return call_user_func( $callback, $atts, $content, $tag );
+}
+
+/**
  * Retrieve the shortcode regular expression for searching.
  *
  * The regular expression combines the shortcode tags in the regular expression
