0%

正威網路行銷工作室,專注於基隆、台北與全台客製化網頁設計,提供專業 RWD 響應式、SEO 搜尋引擎優化、品牌形象設計與網站維護託管服務。

搜尋文章
聯絡資訊
地址基隆市仁二路 220 號 5 樓
追蹤我們

WordPress 表情符號 emoji:留言加表情按鈕、要不要關掉 emoji 腳本

WordPress 表情符號 emoji:留言加表情按鈕、要不要關掉 emoji 腳本 封面

十幾年前的部落格流行在留言框旁邊放一排表情小圖,按一下就插入一個笑臉。現在手機鍵盤就有 emoji,WordPress 的文章和留言也都能直接用 😀👍🎉。

這篇整理三件事:

  1. 確認網站存得了 emoji(舊網站要注意)。
  2. 在留言框上方加一排常用的表情按鈕,電腦上留言也方便。
  3. 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,轉之前一定要先備份。

在留言框上方加一排表情按鈕

手機留言直接用鍵盤就好;電腦上很多人不知道怎麼叫出表情面板,在留言框上方放一排常用的表情,按一下就插入:

PHP
// 留言框上方加一排常用的表情符號,按一下就插入到游標的位置
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 年)以前就架好的網站,可以在「設定 → 寫作」關掉這個轉換;之後才架的網站,後台沒有這個選項,不想轉換就加這一行:

PHP
// 不要把 :) 這類符號轉成表情
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 在舊手機、舊電腦上可能顯示成方框。

PHP
// 關掉 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 轉圖片不受影響。

延伸閱讀

正威網路行銷是 25 年經驗的基隆網頁設計工作室,網站管家年費包含系統、外掛與安全性更新和每日備份,台北與全台客戶也歡迎來聊聊。

分享這篇文章

返回文章列表更多「Wordpress代碼教學」文章

發表留言

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

讓我們一起打造
您的專屬網站!