WordPress Version: 5.2
/**
* Convert emoji to a static img element.
*
* @since 4.2.0
*
* @param string $text The content to encode.
* @return string The encoded content.
*/
function wp_staticize_emoji($text)
{
if (false === strpos($text, '&#x')) {
if (function_exists('mb_check_encoding') && mb_check_encoding($text, 'ASCII') || !preg_match('/[^\x00-\x7F]/', $text)) {
// The text doesn't contain anything that might be emoji, so we can return early.
return $text;
} else {
$encoded_text = wp_encode_emoji($text);
if ($encoded_text === $text) {
return $encoded_text;
}
$text = $encoded_text;
}
}
$emoji = _wp_emoji_list('entities');
// Quickly narrow down the list of emoji that might be in the text and need replacing.
$possible_emoji = array();
$compat = version_compare(phpversion(), '5.4', '<');
foreach ($emoji as $emojum) {
if (false !== strpos($text, $emojum)) {
if ($compat) {
$possible_emoji[$emojum] = html_entity_decode($emojum, ENT_COMPAT, 'UTF-8');
} else {
$possible_emoji[$emojum] = html_entity_decode($emojum);
}
}
}
if (!$possible_emoji) {
return $text;
}
/** This filter is documented in wp-includes/formatting.php */
$cdn_url = apply_filters('emoji_url', 'https://s.w.org/images/core/emoji/12.0.0-1/72x72/');
/** This filter is documented in wp-includes/formatting.php */
$ext = apply_filters('emoji_ext', '.png');
$output = '';
/*
* HTML loop taken from smiley function, which was taken from texturize function.
* It'll never be consolidated.
*
* First, capture the tags as well as in between.
*/
$textarr = preg_split('/(<.*>)/U', $text, -1, PREG_SPLIT_DELIM_CAPTURE);
$stop = count($textarr);
// Ignore processing of specific tags.
$tags_to_ignore = 'code|pre|style|script|textarea';
$ignore_block_element = '';
for ($i = 0; $i < $stop; $i++) {
$content = $textarr[$i];
// If we're in an ignore block, wait until we find its closing tag.
if ('' == $ignore_block_element && preg_match('/^<(' . $tags_to_ignore . ')>/', $content, $matches)) {
$ignore_block_element = $matches[1];
}
// If it's not a tag and not in ignore block.
if ('' == $ignore_block_element && strlen($content) > 0 && '<' != $content[0] && false !== strpos($content, '&#x')) {
foreach ($possible_emoji as $emojum => $emoji_char) {
if (false === strpos($content, $emojum)) {
continue;
}
$file = str_replace(';&#x', '-', $emojum);
$file = str_replace(array('&#x', ';'), '', $file);
$entity = sprintf('<img src="%s" alt="%s" class="wp-smiley" style="height: 1em; max-height: 1em;" />', $cdn_url . $file . $ext, $emoji_char);
$content = str_replace($emojum, $entity, $content);
}
}
// Did we exit ignore block.
if ('' != $ignore_block_element && '</' . $ignore_block_element . '>' == $content) {
$ignore_block_element = '';
}
$output .= $content;
}
// Finally, remove any stray U+FE0F characters
$output = str_replace('️', '', $output);
return $output;
}