这是个老问题了。不过一直没有写过注意事项,这两天在更新Yuao主题的时候给整懵了。下面详细说一下。

方法一

首先表情短代码文本替换为主题自定义的表情图片需要修改$wpsmiliestrans这个全局数组,该数组位于源代码wp-include/functions.phpsmilies_init()函数里。这个数组决定了短代码与图片路径的对应关系。
如果实在不知道如何修改自定义表情,可以用最笨的方法。先修改短代码对应的表情图片路径。例如:添加下面的代码至主题的functions.php

/**
 * 修复WordPress升级4.2自定义表情的各种问题
 *	param array $plugins
 *
 */
function disable_emoji($plugins) {
	if (is_array($plugins)) {
		return array_diff($plugins, array(
		'wpemoji'
		));
	} else {
		return array();
	}
}
// 默认表情短代码文本与表情图片路径的对应关系(可自定义修改)
function init_fixsmilie() {
	global $wpsmiliestrans;

	$wpsmiliestrans = array(
	':mrgreen:' => 'icon_mrgreen.gif',
	':neutral:' => 'icon_neutral.gif',
	':twisted:' => 'icon_twisted.gif',
	':arrow:' => 'icon_arrow.gif',
	':shock:' => 'icon_eek.gif',
	':smile:' => 'icon_smile.gif',
	':???:' => 'icon_confused.gif',
	':cool:' => 'icon_cool.gif',
	':evil:' => 'icon_evil.gif',
	':grin:' => 'icon_biggrin.gif',
	':idea:' => 'icon_idea.gif',
	':oops:' => 'icon_redface.gif',
	':razz:' => 'icon_razz.gif',
	':roll:' => 'icon_rolleyes.gif',
	':wink:' => 'icon_wink.gif',
	':cry:' => 'icon_cry.gif',
	':eek:' => 'icon_surprised.gif',
	':lol:' => 'icon_lol.gif',
	':mad:' => 'icon_mad.gif',
	':sad:' => 'icon_sad.gif',
	
	'8-)' => 'icon_cool.gif',
	'8-O' => 'icon_eek.gif',
	':-(' => 'icon_sad.gif',
	':-)' => 'icon_smile.gif',
	':-?' => 'icon_confused.gif',
	':-D' => 'icon_biggrin.gif',
	':-P' => 'icon_razz.gif',
	':-o' => 'icon_surprised.gif',
	':-x' => 'icon_mad.gif',
	':-|' => 'icon_neutral.gif',
	';-)' => 'icon_wink.gif',
	'8O' => 'icon_eek.gif',
	':(' => 'icon_sad.gif',
	':)' => 'icon_smile.gif',
	':?' => 'icon_confused.gif',
	':D' => 'icon_biggrin.gif',
	':P' => 'icon_razz.gif',
	':o' => 'icon_surprised.gif',
	':x' => 'icon_mad.gif',
	':|' => 'icon_neutral.gif',
	';)' => 'icon_wink.gif',
	':!:' => 'icon_exclaim.gif',
	':?:' => 'icon_question.gif',
	);
	// 移除WordPress4.2版本更新所带来的Emoji钩子同时挂上主题自带的表情路径
	remove_action('wp_head', 'print_emoji_detection_script', 7);
	remove_action('admin_print_scripts', 'print_emoji_detection_script');
	remove_action('wp_print_styles', 'print_emoji_styles');
	remove_action('admin_print_styles', 'print_emoji_styles');
	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('tiny_mce_plugins', 'disable_emoji');
}

add_action('init', 'init_fixsmilie', 5); 

这段代码分成两部分,init_fixsmilie()这个函数的前半部分才是是主要的,也就是里面数组的键表示表情短代码,键值表示对应的表情图片路径。注意键值是路径而不是图片名。这里只是没有将绝对路径写出来。
绝对路径需要通过下面的代码进行替换,如果不替换,输出的就是 https://www.inlojv.com/wp-includes/images/smilies/icon_mrgreen.gif 这样的路径了。

/**
 * Expression path transformation - 表情路径替换
 * 将 https://www.inlojv.com/wp-includes/images/smilies/ 替换为 https://www.inlojv.com/wp-content/theme/xxx/img/
 * @ since rainbow v1.0.1
 */
add_filter ( 'smilies_src', 'inlojv_custom_smilies', 10, 2 );
function inlojv_custom_smilies($img_src, $img) {
	return get_stylesheet_directory_uri () . '/img/' . $img;
}

最后确保表情转换的前提:

//确保表情符号可转变为对应表情图片,在 /wp-admin/options.php 中可设置
update_option('use_smilies',1); 

至于如何输出短代码,点击短代码显示在评论文本框里,需要一些js技巧,以前的文章有介绍 —— 戳这里

方法二

这个方法不依赖wp本身的$wpsmiliestrans,而是利用comment_text过滤器的方式替换评论内容,将短代码用str_replace的方式替换为表情图片。这需要自己定义一个类似$wpsmiliestrans的数组。用forech的方式逐一替换短代码。这是一个思路,具体方法就不展开来说了。