From 73b92df912f25d1edcf968cb847922ca3c7dd796 Mon Sep 17 00:00:00 2001 From: Gary Pendergast Date: Sun, 22 Mar 2015 23:16:28 +0000 Subject: [PATCH] Emoji: When we're replacing emoji with ``s in email, we can only do that if the Content-Type is text/html - otherwise, they'll show up in the email as the HTML string. Fixes #31720 Built from https://develop.svn.wordpress.org/trunk@31860 git-svn-id: http://core.svn.wordpress.org/trunk@31839 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- wp-includes/formatting.php | 54 +++++++++++++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/wp-includes/formatting.php b/wp-includes/formatting.php index fbcde5630b..4c229b7796 100644 --- a/wp-includes/formatting.php +++ b/wp-includes/formatting.php @@ -4244,8 +4244,60 @@ function wp_staticize_emoji( $text ) { * @return array The email data array, with emoji in the message staticized. */ function _wp_staticize_emoji_for_email( $mail ) { - if ( isset( $mail['message'] ) ) { + if ( ! isset( $mail['message'] ) ) { + return $mail; + } + + /* + * We can only transform the emoji into images if it's a text/html email. + * To do that, here's a cut down version of the same process that happens + * in wp_mail() - get the Content-Type from the headers, if there is one, + * then pass it through the wp_mail_content_type filter, in case a plugin + * is handling changing the Content-Type. + */ + $headers = array(); + if ( isset( $mail['headers'] ) ) { + if ( is_array( $mail['headers'] ) ) { + $headers = $mail['headers']; + } else { + $headers = explode( "\n", str_replace( "\r\n", "\n", $mail['headers'] ) ); + } + } + + foreach ( $headers as $header ) { + if ( strpos($header, ':') === false ) { + continue; + } + + // Explode them out + list( $name, $content ) = explode( ':', trim( $header ), 2 ); + + // Cleanup crew + $name = trim( $name ); + $content = trim( $content ); + + if ( 'content-type' === strtolower( $name ) ) { + if ( strpos( $content, ';' ) !== false ) { + list( $type, $charset ) = explode( ';', $content ); + $content_type = trim( $type ); + } else { + $content_type = trim( $content ); + } + break; + } + } + + // Set Content-Type if we don't have a content-type from the input headers + if ( ! isset( $content_type ) ) { + $content_type = 'text/plain'; + } + + /** This filter is documented in wp-includes/pluggable.php */ + $content_type = apply_filters( 'wp_mail_content_type', $content_type ); + + if ( 'text/html' === $content_type ) { $mail['message'] = wp_staticize_emoji( $mail['message'], true ); } + return $mail; }