zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

WordPress 如何存储和显示 Emoji 以及如何优化

存储WordPress 如何 优化 显示 以及 emoji
2023-06-13 09:18:30 时间

首先说明一下 Emoji 是文字,而不是图标,所以 Emoji 字符是 Unicode 字符集中一部分,特定形象的 Emoji 表情符号对应到特定的 Unicode 字节。

Emoji 存储需要四个字节

使用 Emoji 最大的问题是数据库存储不了,出错或者出现乱码,这是因为MySQL 的 UTF-8 字符集是存储不了 emoji 表情,因为 MySQL 中的 UTF-8 只用 3 个字节存储,所以存储不了表情,其实 MySQL 的 UTF-8 其实是 utf8mb3 的别名。

如果我们要存储 Emoji 表情,那么需要支持完整的 UTF-8 字符集,就是需要使用 4 个字节来存储字符,这个字符集名字叫 utf8mb4。

WordPress 如何存储和显示 Emoji

针对 Emoji,WordPress 在存储和显示这两方面做了处理,

WordPress 为了都能存储 Emoji,使用函数 wp_encode_emoji 函数将 Emoji 转换成 HTML 实体来存储,这样就不用担心数据库不支持 utf8mb4。

WordPress 为了都能显示 Emoji,使用函数 wp_staticize_emoji 函数将 Emoji 转换成图片显示,这样就不用担一些比较老旧的浏览器不显示 Emoji。

优化 WordPress Emoji 的处理

但是随着技术的发展,现在绝大部分服务器的 MySQL 数据库(5.5版本之后)都支持 utf8mb4 编码格式,所以无需将 Emoji 转换成 HTML 实体进行存储了,直接存储速度更快,节省了实体转换的时间消耗。

另外 WordPress 用于显示的 Emoji 的图片都是放在 http://s.w.org/images/core/emoji/ 资源下,令人尴尬的是,http://s.w.org/ 这个域名在国内访问不了的,这个功能反而成为了拖慢博客显示的原因了。

现在几乎所有的浏览器都能够显示 Emoji 了,所以我们完全可以禁用 WordPress 对 Emoji 的处理功能,比较简单,我已经整理好了,在当前主题的 functions.php 文件中添加如下代码即可:

remove_action('admin_print_scripts',	'print_emoji_detection_script');
remove_action('admin_print_styles',	'print_emoji_styles');

remove_action('wp_head',		'print_emoji_detection_script',	7);
remove_action('wp_print_styles',	'print_emoji_styles');

remove_action('embed_head',		'print_emoji_detection_script');

remove_filter('the_content_feed',	'wp_staticize_emoji');
remove_filter('comment_text_rss',	'wp_staticize_emoji');
remove_filter('wp_mail',		'wp_staticize_emoji_for_email');

add_filter( 'emoji_svg_url',		'__return_false' );