修復WordPress4.2帶來的表情提交后不顯示問題
編輯:狂族晨曦 來源:建站分享,WordPress技巧 日期:2015-09-16 閱讀: 2,887 次 2 條評論 » 百度已收錄
本站的主題是我自己一步一步做的,每個功能都是慢慢研究出來的,不停的增加著各種想要實現的功能。但是在制作主題時候,由于技術原因,很多功能暫時無法實現,就暫時的放下了。最近,想要將以前沒能實現的評論表情功能完善了,但卻還是出現了問題。
問題的表現為:表情可以點開,但是在提交之后,顯示出來的是一個“😛”(方塊),情況如下:


關于表情代碼如何添加,其實很簡單,總共需要3點,自定義的表情圖片、smiley.php文件、在comments.php文件中調用smiley.php的代碼就完成了,具體的方法網上很多,我就不再累述了。
今天主要解決的是上文提到的問題。對于這個問題搜了很久沒有搜到解決方案,最后實在WordPress吧里問的一位遇到過同樣問題并已解決的站長,這位站長在他的網站上給了我解決方案,非常感謝他。
解決方法其實是張戈博客提出的。出現評論的表情出錯,是因為 4.2 對評論表情的重構(樣式變更、名稱變更、CDN機制等)造成的,與 4.2 下的 emoji 關鍵標簽掛上了鉤,emoji 這個玩意暫時不適合天朝環境。
修復補丁
修改WordPress的程序文件比較麻煩,而且隨著WordPress的升級還會失效,所以就采取了php補丁的方式,只要集成到主題中就可以解決這些問題了!
下載的文件是patch_to_4.2.php ,文件中的代碼為以下內容,大家也可以自己創建:
<?php
/**
* 修復WordPress升級4.2帶來的各種問題 By 張戈博客
* 修復說明:
* ①、部分主題出現大量404請求
* ②、修復表情路徑異常問題
* ③、后續遇到問題將繼續更新
* */
remove_action( 'wp_head','print_emoji_detection_script',7); //解決4.2版本部分主題大量404請求問題
remove_action('admin_print_scripts', 'print_emoji_detection_script'); //解決后臺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( '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', 'convert_smilies_diy', 20); //自定義表情相關鉤子
add_action( 'the_content', 'convert_smilies_diy' ); //自定義表情相關鉤子
add_action( 'the_excerpt', 'convert_smilies_diy' ); //自定義表情相關鉤子
add_action( 'init', 'smilies_init_old', 5 ); //自定義表情鉤子
//原函數 smilies_init 位于wp-includes/functions.php
function smilies_init_old() {
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';
}
//原函數 convert_smilies 位于wp-includes/formatting.php
function convert_smilies_diy( $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, 'translate_smiley_diy', $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;
}
//原函數 translate_smiley 位于wp-includes/formatting.php
function translate_smiley_diy( $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;
}
/**
* Filter the Smiley image URL before it's used in the image element.
*
* @since 2.9.0
*
* @param string $smiley_url URL for the smiley image.
* @param string $img Filename for the smiley image.
* @param string $site_url Site URL, as returned by site_url().
*/
//請注意!已將表情路徑定義到主題目錄下的 images/smilies 文件夾
$src_url = apply_filters( 'smilies_src', get_bloginfo('template_directory').'/images/smilies/'.$img, $img, site_url() );
return sprintf( '<img src="%s" alt="%s" class="wp-smiley" style="/*height: 1em; max-height: 1em;*/" />', esc_url( $src_url ), esc_attr( $smiley ) );
}
?>
將下載的文件解壓,并查看代碼倒數幾排中(“//請注意!已將表情路徑定義到主題目錄下的 images/smilies 文件夾”下)的表情路徑和你主題所用表情是否對應,若不對應請自行根據實際情況修改 /images/smilies 指向你的表情文件夾即可(若沒有表情文件,請從本文下載并上傳到主題目錄亦可)。
然后上傳到主題目錄,修改主題目錄下的 functions.php,在最后一個?>之前新增如下調用代碼即可:
//4.2 修復補丁,請注意 patch_to_4.2.php 路徑是否正確。
include("patch_to_4.2.php");
保存后,去前臺刷新應該就一切正常了,親測可用。
本文鏈接地址:http://www.cnidcc.cn/xfwpdldbqtjhbxswt.html , 轉載請保留本說明!
相關文章
從今以后:
這方法試試了,感謝分享,謝謝!
從今以后:
感謝分享

川公網安備 51011202000104號