
十幾年前的部落格流行在留言框旁邊放一排表情小圖,按一下就插入一個笑臉。現在手機鍵盤就有 emoji,WordPress 的文章和留言也都能直接用 😀👍🎉。
這篇整理三件事:
- 確認網站存得了 emoji(舊網站要注意)。
- 在留言框上方加一排常用的表情按鈕,電腦上留言也方便。
- WordPress 內建的 emoji 腳本在做什麼、要不要關掉。
怎麼打 emoji
- 手機:鍵盤上的笑臉圖示。
- Windows:按「Windows 鍵 + 句點(.)」叫出表情面板。
- Mac:按「Control + Command + 空白鍵」。
文章標題、內文、留言都可以用。
先確認資料庫存得了 emoji
emoji 在電腦裡比一般中文字多佔一個位元組,資料庫要用 utf8mb4 這種字元集才存得下。2015 年以後新架的 WordPress 幾乎都是 utf8mb4;很舊的網站可能還是 utf8。
到後台「工具 → 網站狀態 → 網站資訊」,展開「資料庫」,看「資料庫字元集」:
- utf8mb4:沒問題。
- utf8 或 utf8mb3:WordPress 會這樣處理(看 WordPress 原始碼確認的):
- 文章的標題、內文、摘要:emoji 會被轉成 HTML 編碼再存,網頁上還是看得到。
- 留言:存進資料庫失敗時,WordPress 會把存不下的字元拿掉再存一次,留言裡的 emoji 就不見了。
字元集是 utf8 的網站,請主機商或負責維護的人協助轉成 utf8mb4,轉之前一定要先備份。
在留言框上方加一排表情按鈕
手機留言直接用鍵盤就好;電腦上很多人不知道怎麼叫出表情面板,在留言框上方放一排常用的表情,按一下就插入:
// 留言框上方加一排常用的表情符號,按一下就插入到游標的位置
add_filter( 'comment_form_field_comment', function ( $field ) {
$emojis = array( '😀', '😂', '😍', '👍', '🙏', '🎉', '😮', '😢' );
$bar = '<p class="zw-emoji-bar">';
foreach ( $emojis as $emoji ) {
$bar .= '<button type="button" data-emoji="' . esc_attr( $emoji ) . '" aria-label="插入 ' . esc_attr( $emoji ) . '">' . $emoji . '</button>';
}
return $bar . '</p>' . $field;
} );
add_action( 'wp_footer', function () {
if ( ! is_singular() || ! comments_open() ) {
return;
}
?>
<style>
.zw-emoji-bar { display: flex; flex-wrap: wrap; gap: 4px; margin: 0 0 8px; }
/* 佈景主題常替按鈕加底色、大小,這裡用 !important 蓋回來 */
.zw-emoji-bar button {
background: none !important; color: inherit !important; box-shadow: none !important;
border: 1px solid transparent !important; border-radius: 8px !important;
padding: 5px !important; min-width: 0 !important; min-height: 0 !important; width: auto !important;
font-size: 20px !important; line-height: 1 !important; cursor: pointer;
}
.zw-emoji-bar button:hover { border-color: #ccc !important; }
.zw-emoji-bar button:focus-visible { outline: 2px solid currentColor; outline-offset: 1px; }
</style>
<script>
document.addEventListener( 'click', function ( e ) {
var button = e.target.closest( '.zw-emoji-bar button' );
var box = document.getElementById( 'comment' );
if ( ! button || ! box ) {
return;
}
box.setRangeText( button.dataset.emoji, box.selectionStart, box.selectionEnd, 'end' );
box.focus();
} );
</script>
<?php
} );每一段在做什麼
comment_form_field_comment是 WordPress 輸出留言框時的篩選器,把按鈕列接在留言框前面。區塊佈景主題的「留言表單」區塊和傳統佈景主題的comment_form()都會經過它。$emojis換成你想放的表情,8 個在手機上剛好排成一排。- 按鈕的
type="button":按了不會送出留言。 - JavaScript 用
setRangeText()把表情插在游標的位置,有選取文字就取代選取的部分,插完游標移到表情後面,可以繼續打字。 - CSS 的
!important:佈景主題常會替所有按鈕加底色、加大尺寸。測試時 Twenty Twenty-One 就把表情按鈕變成一個個深色方塊,加上!important才蓋得回來。 - 只在開放留言的文章、頁面才輸出 CSS 和 JavaScript,其他頁面不會多載入。
測試結果
在 Twenty Twenty-Five、Twenty Twenty-One 用手機寬度(390 像素)測試:8 個表情排成一排;留言框先打「謝謝分享」,游標放在「謝謝」後面按 👍,再把游標移到最後按 🎉,結果是「謝謝👍分享🎉」,按完游標回到留言框。實際送出含 emoji 的留言,後台看到的內容和輸入的一樣。
舊式表情 :) 會被換掉
留言或文章裡打 :)、:-P 這類符號,WordPress 顯示時會自動換成 emoji:測試時留言打「很實用 👍🎉 :)」,網頁上顯示成「很實用 👍🎉 🙂」,資料庫裡存的還是原本的 :)。
WordPress 4.3(2015 年)以前就架好的網站,可以在「設定 → 寫作」關掉這個轉換;之後才架的網站,後台沒有這個選項,不想轉換就加這一行:
// 不要把 :) 這類符號轉成表情
add_filter( 'option_use_smilies', '__return_false' );WordPress 的 emoji 腳本在做什麼
WordPress 每一頁的 <head> 都會放一段 emoji 的程式碼。它會先測試瀏覽器能不能正確顯示最新版本的 emoji:
- 可以:什麼都不做,emoji 由手機或電腦自己的字型顯示。
- 不行:再下載
wp-emoji-release.min.js,把頁面上的 emoji 換成 WordPress 官方網站(s.w.org)提供的 SVG 圖片,每種 emoji 一張。
我們量到的結果:
- 這段程式碼每頁約 3.7 KB(前台、後台都有)。
- 在 Windows 的 Chrome 打開一篇有 3 種 emoji 的文章,瀏覽器沒通過最新版 emoji 的測試,所以多下載了
wp-emoji-release.min.js和 3 張 SVG 圖片,頁面上的 emoji 都變成圖片。
另外,WordPress 在 RSS 和寄出的 Email 裡,也會把 emoji 換成圖片,讓收信軟體、RSS 閱讀器都看得到,這和下面的腳本是分開的。
要不要關掉 emoji 腳本
可以考慮關掉的情況:網站很少用 emoji、想讓每頁少一段程式碼、不希望訪客的瀏覽器去連 s.w.org 下載圖片。
關掉之後:emoji 照樣顯示,只是改用訪客自己系統的 emoji 樣式(Windows、iPhone、Android 長得不一樣);很新的 emoji 在舊手機、舊電腦上可能顯示成方框。
// 關掉 WordPress 的 emoji 偵測腳本和樣式(網站前台)
add_action( 'init', function () {
remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
remove_action( 'wp_enqueue_scripts', 'wp_enqueue_emoji_styles' );
remove_action( 'wp_print_styles', 'print_emoji_styles' ); // 舊版留下的同一段樣式,也要拿掉
remove_action( 'embed_head', 'print_emoji_detection_script' );
remove_action( 'enqueue_embed_scripts', 'wp_enqueue_emoji_styles' );
} );
// 後台也關掉(後台的設定比 init 晚載入,所以用 admin_init)
add_action( 'admin_init', function () {
remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
remove_action( 'admin_enqueue_scripts', 'wp_enqueue_emoji_styles' );
remove_action( 'admin_print_styles', 'print_emoji_styles' );
} );
// 傳統編輯器(TinyMCE)裡的 emoji 外掛
add_filter( 'tiny_mce_plugins', function ( $plugins ) {
return array_diff( $plugins, array( 'wpemoji' ) );
} );- 前台的偵測腳本、樣式,在
init拿掉。 - 後台要用
admin_init:後台這兩個設定是在init之後才加上去的,放在init拿不掉,這是看原始碼才發現的細節。 print_emoji_styles是舊版留下的同一段樣式。只拿掉新的wp_enqueue_emoji_styles,舊的還會印出來,測試時就是這樣多了 312 位元組。tiny_mce_plugins拿掉傳統編輯器裡的 emoji 外掛;用區塊編輯器的網站可以不加,加了也沒影響。
測試結果:加上後前台、後台的 emoji 程式碼都是 0;Windows 的 Chrome 不再下載任何 emoji 檔案,文章裡的 😀 由系統字型顯示;區塊編輯器打開文章正常,沒有錯誤訊息。RSS 和 Email 裡的 emoji 轉圖片不受影響。
延伸閱讀
- WordPress 防垃圾留言總整理:外掛、留言設定、蜜罐與字數限制
- WordPress 留言審核通過自動寄信通知留言者(含回覆通知程式碼)
- WordPress 網站加速完整攻略:測速、主機、快取、圖片、外掛與資料庫清理
正威網路行銷是 25 年經驗的基隆網頁設計工作室,網站管家年費包含系統、外掛與安全性更新和每日備份,台北與全台客戶也歡迎來聊聊。







發表留言
還沒有人留言,歡迎第一個分享你的想法或問題。留言經審核後才會顯示,Email 不會公開。