升级4.2之后使用了Emoji表情,原有自定义表情快捷符号无法再转换为表情图片gif,所以需要禁用emoji,然而禁用之后虽然原有表情可以显示,但表情变小了,一查原来是wp-includes/formatting.php
文件里面给wp-smiley加载了多余的样式height: 1em ...
,下面有两种方法可以一并解决这些问题,这样不管wp怎么升级都不会受到影响了:
方法一
前台和后台都禁用emoji表情的css和js的加载,使用相应的钩子过滤掉。然后再用钩子改写wp-includes/formatting.php
文件里面的两个系统函数以修正css即可。下面代码加入主题functions.php
文件中
/** * 修复WordPress升级4.2自定义表情的各种问题 */ remove_action( 'wp_head','print_emoji_detection_script',7); //解决4.2版本部分主题大量404请求问题 remove_action( 'init', 'smilies_init', 5); //移除4.2版本表情钩子 remove_action( 'wp_print_styles', 'print_emoji_styles' ); //移除4.2版本前台表情样式钩子 remove_action( 'admin_print_styles', 'print_emoji_styles'); //移除4.2版本后台表情样式钩子 remove_action('admin_print_scripts', 'print_emoji_detection_script'); //移除4.2版本后台表情加载脚本 s.w.org 连不上修复 remove_action( 'the_content_feed', 'wp_staticize_emoji'); //移除4.2 emoji相关钩子 remove_action( 'comment_text_rss', 'wp_staticize_emoji'); //移除4.2 emoji相关钩子 remove_action( 'comment_text', 'convert_smilies', 20 ); //移除4.2 表情相关钩子 remove_action( 'the_content', 'convert_smilies' ); //移除4.2 表情相关钩子 remove_action( 'the_excerpt', 'convert_smilies' ); //移除4.2 表情相关钩子 add_action( 'comment_text', 'inlo_convert_smilies', 20); //自定义表情相关钩子 add_action( 'the_content', 'inlo_convert_smilies' ); //自定义表情相关钩子 add_action( 'the_excerpt', 'inlo_convert_smilies' ); //自定义表情相关钩子 add_action( 'init', 'inlo_smilies_init', 5 ); //自定义表情钩子 //原函数 smilies_init 位于wp-includes/functions.php function inlo_smilies_init() { global $wpsmiliestrans, $wp_smiliessearch; // don't bother setting up smilies if they are disabled if ( !get_option( 'use_smilies' ) ) return; if ( !isset( $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', // This one transformation breaks regular text with frequency. // '8)' => 'icon_cool.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', ); } if (count($wpsmiliestrans) == 0) { return; } /* * NOTE: we sort the smilies in reverse key order. This is to make sure * we match the longest possible smilie (:???: vs :?) as the regular * expression used below is first-match */ krsort($wpsmiliestrans); $spaces = wp_spaces_regexp(); // Begin first "subpattern" $wp_smiliessearch = '/(?<=' . $spaces . '|^)'; $subchar = ''; foreach ( (array) $wpsmiliestrans as $smiley => $img ) { $firstchar = substr($smiley, 0, 1); $rest = substr($smiley, 1); // new subpattern? if ($firstchar != $subchar) { if ($subchar != '') { $wp_smiliessearch .= ')(?=' . $spaces . '|$)'; // End previous "subpattern" $wp_smiliessearch .= '|(?<=' . $spaces . '|^)'; // Begin another "subpattern" } $subchar = $firstchar; $wp_smiliessearch .= preg_quote($firstchar, '/') . '(?:'; } else { $wp_smiliessearch .= '|'; } $wp_smiliessearch .= preg_quote($rest, '/'); } $wp_smiliessearch .= ')(?=' . $spaces . '|$)/m'; } /** * 原函数 translate_smiley 位于wp-includes/formatting.php */ function inlo_translate_smiley( $matches ) { global $wpsmiliestrans; if ( count( $matches ) == 0 ) return ''; $smiley = trim( reset( $matches ) ); $img = $wpsmiliestrans[ $smiley ]; $matches = array(); $ext = preg_match( '/\.([^.]+)$/', $img, $matches ) ? strtolower( $matches[1] ) : false; $image_exts = array( 'jpg', 'jpeg', 'jpe', 'gif', 'png' ); // Don't convert smilies that aren't images - they're probably emoji. if ( ! in_array( $ext, $image_exts ) ) { return $img; } // 以下表情路径修改为主题下的表情所在路径 $src_url = apply_filters( 'smilies_src', get_bloginfo('template_directory').'/img/smilies/'.$img, $img, site_url() ); return sprintf( '<img src="%s" alt="%s" class="wp-smiley" />', esc_url( $src_url ), esc_attr( $smiley ) ); } /** * 原函数 convert_smilies 位于wp-includes/formatting.php */ function inlo_convert_smilies( $text ) { global $wp_smiliessearch; $output = ''; if ( get_option( 'use_smilies' ) && ! empty( $wp_smiliessearch ) ) { // HTML loop taken from texturize function, could possible be consolidated $textarr = preg_split( '/(<.*>)/U', $text, -1, PREG_SPLIT_DELIM_CAPTURE ); // capture the tags as well as in between $stop = count( $textarr );// loop stuff // Ignore proessing 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] ) { $content = preg_replace_callback( $wp_smiliessearch, 'inlo_translate_smiley', $content ); } // did we exit ignore block if ( '' != $ignore_block_element && '</' . $ignore_block_element . '>' == $content ) { $ignore_block_element = ''; } $output .= $content; } } else { // return default text. $output = $text; } return $output; }
这样就OK了,不过要注意的是,INLOSPEED主题的评论回调函数内使用了convert_smilies
函数,上面的代码已经重写了这个函数,重新定义为 inlo_convert_smilies
函数,所以要在输出评论列表的回调函数内将convert_smilies(get_comment_text())
改为inlo_convert_smilies(get_comment_text())
即可。
方法二
只禁用前台与后台的相关emoji表情加载脚本,样式禁用不了,表情还是很小,我们可以通过修改主题的css来改变。加入以下代码至主题的functions.php
内
/** * 修复WordPress升级4.2自定义表情的各种问题 */ function disable_emoji($plugins) { if (is_array($plugins)) { return array_diff($plugins, array( 'wpemoji' )); } else { return array(); } } //取当前主题下img\smilies\下表情图片路径 function custom_smilie_src($old, $img) { return get_stylesheet_directory_uri() . '/img/smilies/' . $img; } 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_filter('smilies_src', 'custom_smilie_src', 10, 2); } add_action('init', 'init_fixsmilie', 5);
然后在主题的Style.css内添加样式
.wp-smiley{max-height: 100% !important;height: 100% !important;}
再稍微调整一下相对位置即可。
相比之下,方法二更好,代码更少。
本站文章除注明转载/出处外,均为本站原创或翻译。若要转载但请务必注明出处,尊重他人劳动成果。
转载请注明出处链接 : https://www.inlojv.com/4900.html