WordPress 作者資訊欄顯示個人頭像時,預設會透過 Gravatar 載入外部圖片。若你希望作者 Bio 使用本地頭像、無需依賴 Gravatar,本文比較外掛、子主題自訂碼與靜態預設三種做法,並以 Blocksy 子主題實作示範。
目錄
為什麼要取代 Gravatar?
- 隱私:頭像與 Email 綁定,會對外請求 Gravatar
- 第三方依賴:Gravatar 故障或被封鎖時,頭像無法顯示
- 品牌一致性:無法統一使用自家設計的預設頭像
- 效能:多一次外部 DNS/HTTP 請求
如果答案是肯定的,那麼這裡確實提供了解決方案。首先,您必須決定一個核心設計目標:您希望實作的是 「每個用戶自行上傳的照片」(← 強烈建議採用此方法),還是僅使用一個 「靜態/預設的頭像圖片」?
三種做法比較(簡表:外掛 / 自訂碼 / 靜態預設)
| 比較項目 | A:外掛 | B:自訂碼 | C:靜態預設 |
|---|---|---|---|
| 做法 | 安裝本地頭像外掛 | 子主題自訂碼 | 全站預設圖或 Bio 硬編碼 |
| 技術門檻 | 低 | 中~高 | 低 |
| 每位作者不同頭像 | ✅ | ✅ | ❌ |
| Blocksy 作者資訊欄 | ✅ | ✅(本站實作) | ⚠️ |
| 優點 | 最快上線 | 可控、少依賴 | 最簡單、最一致 |
| 缺點 | 依賴外掛 | 需開發測試 | 無個人化 |
| 適合 | 短期/非技術團隊 | 長期維護(推薦) | 單一作者/品牌站 |
選項 A: 本地頭像外掛
如果您希望快速實作功能,而不涉及複雜的代碼編寫和資料庫操作,這是最佳的選擇。
做法非常直接:安裝一個專用的「本地頭像外掛」。通過此外掛,用戶可以在他們的個人設定頁面中上傳一張代表自己的頭像圖。之後,在所有調用 get_avatar() 函數的地方,都會優先使用這張由用戶主動上傳的圖片。
推薦的外掛範例:
- Simple Local Avatars
- WP User Avatar (此功能組經常被品牌化為 ProfilePress)
優點: 通常無需修改任何網站主題(Theme)的主體代碼,部署流程極快。
缺點: 功能的穩定性和深度依賴於外掛本身的設計和維護。
選項 B : 子主題自定碼(推薦)
如果追求最高程度的客製化、最佳性能,且不希望依賴任何第三方插件功能,那麼手動編寫程式碼是唯一的出路。此方法的核心思想是:「將上傳頭像資料儲存在本地資料庫,然後強制覆蓋 原有的頭像生成機制。」
原理:
- 儲存機制 (Storage): 由於核心的 WordPress 沒有內建「上傳」欄位,您必須手動編寫代碼將用戶上傳的圖片的 附件 ID (Attachment ID),儲存到
user meta中(例如命名為local_avatar_id)。 - 覆蓋機制 (Override): 接著,您需要利用一個名為
pre_get_avatar_data的過濾器(Filter)。當 WordPress 即將輸出頭像資料時,您會在這個時間點「攔截」執行流程,強制修改傳入的參數,讓它使用我們自定義儲存的圖片 URL。
範例代碼結構 (建議放置在子主題 functions.php 或專屬外掛):
add_filter('pre_get_avatar_data', function($args, $id_or_email) {
$user = false;
if (is_numeric($id_or_email)) {
$user = get_user_by('id', (int) $id_or_email);
} elseif ($id_or_email instanceof WP_User) {
$user = $id_or_email;
} elseif (is_object($id_or_email) && !empty($id_or_email->user_id)) {
$user = get_user_by('id', (int) $id_or_email->user_id);
} elseif (is_string($id_or_email)) {
$user = get_user_by('email', $id_or_email);
}
if (!$user) return $args;
$attachment_id = (int) get_user_meta($user->ID, 'local_avatar_id', true);
if (!$attachment_id) return $args;
$size = !empty($args['size']) ? (int) $args['size'] : 96;
$url = wp_get_attachment_image_url($attachment_id, [$size, $size]);
if (!$url) return $args;
$args['url'] = $url;
$args['found_avatar'] = true;
return $args;
}, 10, 2);Code language: PHP (php)
只要上述代碼成功載入,之後在 Bio Template 中使用 echo get_avatar(get_the_author_meta(‘ID’), 96); 時,它就會自動優先調用本地上傳的圖片,從而繞開 Gravatar 的機制。
優點: 不依賴任何第三方插件功能,上傳頭像資料儲存在本地資料庫。
缺點: 必須手動編寫代碼。
選項 C : 靜態預設頭像
如果您根本不需要實現用戶主動上傳的功能(只是需要一個視覺上統一、穩定的作者形象),那麼可以使用這個方案。這也是最簡單的實作方式,因為它不涉及複雜的上傳管理機制。
您可以透過以下兩種方法之一:
- 自定義預設值 (Custom Default): 透過
avatar_defaults設定一個系統級別的默認頭像圖片。 - 硬編碼 (Hardcoding): 直接將一張固定圖片的 URL 或 ID,寫入到您的 Bio Template 的代碼中。
適用場景: 網站內容穩定、作者形象不需頻繁更新或個人化的場景。
選項一:使用 avatar_defaults 設定自定義預設值
WordPress 允許開發者透過掛鉤(hook)到 avatar_defaults 過濾器 (filter),將您自己的圖片加入可供選擇的默認頭像列表。這能讓您的主題在系統級別增加一個選項。
function my_custom_default_avatar($avatar_defaults) {
// 定義本地圖片路徑
$myavatar = get_stylesheet_directory_uri() . '/images/default-bio.png';
// 將自定義頭像加入預設陣列
$avatar_defaults[$myavatar] = "自定義個人頭像";
return $avatar_defaults;
}
add_filter('avatar_defaults', 'my_custom_default_avatar');
// 【操作指南】
// 請將您的圖片 (default-bio.png) 放置在主題的 /images/ 資料夾內。Code language: PHP (php)
執行以上代碼後,請前往網站管理介面 (Dashboard) → 「設定」→「討論」→ 「預設 頭像」(Default Avatar)。您將會看到一個名為「自定義個人頭像」的新選項可供選擇。
這段機制兼容 get_avatar() 函數的調用,因此只要網站任何地方通常需要顯示頭像圖時,如果用戶未上傳本地照片,就會自動以您的預設圖片取代。
選項二:在作者資訊模板(Author Bio)中硬編碼圖像 (Hardcode)
如果您完全不想要依賴用戶個人上傳的機制,也不想參考 Gravatar 的流程,您可以直接跳過 get_avatar() 函數,直接在您的作者生平模板(Author Bio Template)中使用靜態圖片標籤輸出。
<div class="author-bio">
<img src="<?php echo get_stylesheet_directory_uri(); ?>/images/default-bio.png"
alt="Author bio picture" class="bio-avatar" />
<p><?php the_author_meta('description'); ?></p>
</div>Code language: PHP (php)
這完全繞過了原有的頭像系統運作機制。
除非您自行增加判斷不同用戶權限(Roles)或 ID 的邏輯,否則所有作者的頭像介紹都會顯示這張相同圖片。
選擇建議:
- 選擇方案一: 如果您的目標是維持與頭像系統的兼容性(即那些呼叫
get_avatar()的外掛或主題仍需正常運作)。 - 選擇方案二: 如果您追求完全的控制權,並且不關心 Gravatar 或單一用戶的個人化設定。
優點: 最簡單的實作方式
缺點: 只有一張固定圖片
如何在作者資訊欄顯示頭像(get_avatar_url() + Blocksy author box
在 Blocksy 中,單篇文章底部的作者資訊欄(Author Box)由主題函式 blocksy_author_box() 輸出。頭像並非在模板裡直接寫死 <img src="...">,而是透過 blocksy_get_avatar_url() 取得作者頭像網址,再渲染成 .author-box 區塊內的圖片。
Blocksy 內部最終會呼叫 WordPress 核心的 get_avatar_url()(見 官方文件)。而 get_avatar_url() 會走 get_avatar_data() 流程,因此在子主題掛上的 pre_get_avatar_data 過濾器(見 官方文件)同樣會生效——不必修改 Blocksy 的 author box 模板,作者資訊欄就會自動改用 local_avatar_id 對應的本地上傳圖片。
也就是說:本文選項 B 的實作,影響的不只是 get_avatar(),也包含 Blocksy 作者區塊、留言頭像等所有透過 WordPress 頭像 API 取圖的位置。
啟用 Blocksy 作者資訊欄
光有本地頭像程式碼,還要在主題裡開啟 Author Box,文章頁才會顯示作者資訊欄:
- 後台 (Dashboard) → 外觀 (Appearance) → 自訂(Customizer)
- 進入 Single Post(或對應文章類型的單篇設定)
- 找到 Author Box,將開關設為 啟用
- 可調整 Box Type、作者名稱標籤(H5 等)、社群連結、文章數量等選項
- 發佈自訂設定後,開啟任一文章頁檢查文末是否出現
.author-box區塊
若某篇文章不想顯示作者區塊,可在該文的 Blocksy 文章選項中將 disable author box 設為停用(主題會依文章 meta 覆寫全域設定)。
作者簡介與頭像從哪裡來
作者資訊欄通常包含兩部分,來源不同:
- 頭像:由頭像 API 解析。選項 B 實作後,請到 使用者 (Users)→ 個人資料 (Profile),在「Local avatar」欄位上傳圖片並儲存。
- 簡介文字:來自使用者個人資料的 個人說明(Biographical Info),Blocksy 會輸出到
.author-box-bio。
建議每位作者都補齊「個人說明」與本地頭像,否則作者資訊欄可能只有名稱、沒有簡介,或仍顯示預設頭像。
資料流程(選項 B + Blocksy):
使用者上傳頭像 → 存入 local_avatar_id(user meta)→ 文章頁呼叫 blocksy_author_box() → blocksy_get_avatar_url() → get_avatar_url() → pre_get_avatar_data 回傳本地附件 URL → 作者資訊欄顯示本地上傳頭像。
本站實作(blocksy-child)

我們在子主題 functions.php 中實作了完整流程:
- 使用者個人資料頁新增「Local avatar」上傳欄位(WP Media Library)
- 以
local_avatar_id存入 user meta - 透過
pre_get_avatar_data覆寫頭像 URL
因此 作者資訊欄、留言區等所有呼叫 get_avatar() 的位置都會自動使用本地上傳圖片。


進階:以 filter 覆寫 Author Box 頭像
Blocksy 另提供過濾器 blocksy:single:author_box:author-avatar-url,可在不改核心模板的情況下強制指定作者區塊頭像 URL;一般情況下使用 pre_get_avatar_data 已足夠,無需額外掛此 filter。
顯示異常時檢查
- Customizer 是否已啟用 Author Box(預設為關閉)
- 該篇文章是否勾選停用 author box
- 作者是否已在個人資料上傳 Local avatar 並儲存
- 子主題
functions.php是否已載入pre_get_avatar_data程式碼 - 快取外掛(如 Apache Cache, LiteSpeed Cache)是否清除後再預覽
常見問題(FAQ)
Q:WordPress作者資訊欄會自動顯示本地頭像嗎?
A:會。只要主題或外掛透過 get_avatar() 輸出頭像,pre_get_avatar_data 覆寫後就會顯示本地上傳圖片,無需改 Blocksy 模板。
Q:一定要裝外掛嗎?
A:不必。若你能修改子主題,選項 B(自訂碼)效能更好、依賴更少,也更容易版本控管。
Q:停用 Gravatar 後,沒上傳頭像的用戶會怎樣?
A:若未設定 local_avatar_id,WordPress 仍會回退到預設頭像(可能是 Gravatar 或主題預設圖)。可搭配選項 C 的 avatar_defaults 統一預設樣式。
結論
要在 WordPress 作者資訊欄顯示個人頭像、同時無需依賴 Gravatar,可依需求選擇三種做法:外掛最快、子主題自訂碼最可控、靜態預設頭像最簡單。若你使用 Blocksy 並能維護子主題,建議採用 local_avatar_id 搭配 pre_get_avatar_data 覆寫 get_avatar()——作者 Bio、留言區與其他呼叫頭像的位置都會自動改用本地上傳圖片,無須改主題模板。上線前請確認每位作者都已上傳頭像,或設定一致的預設圖