近期終於把 LINE 登入外掛的頭像功能整合進去,現在只要使用登入就會自動取得 LINE 帳號的頭像作為網站個人帳號的顯示圖片。
一開始本來是想用 WordPress 內建的 Gravatar 來做,但由於使用者的頭像圖檔全都是放在 Gravatar 上面,資料庫只有紀錄預設的頭像設定而沒有存放圖檔,而 Gravatar 要透過 API 上傳頭像必須要經過 WP 後台的授權才能取得 API Key 來進行修改,但這樣就沒辦法放在商業外掛裡面來做了,如果要請每一位購買的顧客去申請 Gravatar API 這難度有點高…
如果你有特定網站要整合 Gravatar API,他們有提供 PHP SDK:https://www.phpclasses.org/browse/file/28639.html
Gravtar 這條路行不通只能換條路走,查 Codex 發現到這個勾點:pre_get_avatar_data
它會在 get_avatar()
取得圖片網址前觸發,因此我就可以把它替換成 LINE 的頭像網址,基本上用 LINE 的 CDN 網址就能結案了,比較棘手的是後台的顯示,個人頁的顯示還好判斷,而我卡在列表頁:
本以為可以跟文章列表一樣,只要替換 column 輸出的內容即可,但是使用者列表是用 manage_users_custom_column
,看原始碼的寫法它只能新增欄位,無法去修改既有欄位的資料,還在想說是否要把原生欄位移掉,然後去新增一個自己的來顯示正確的頭像,看 Nextend Social Plugin 的寫法它還是有把頭像拉回來存,看來還是要比照辦理了。
覺得麻煩的當下,重新看了文件,意外發現勾點 pre_get_avatar_data
的第二個參數就是 user 相關的資料,至於具體會是什麼就要看實作這個勾點的人傳什麼進去,有以下六種類型:
- user ID
- Gravatar MD5 hash
- user email
- WP_User object
- WP_Post object
- WP_Comment object
因此要各別處理以取得正確的 user_id。除了 Gravatar MD5 hash 以外,我找不到該如何用它找回 user id 的方法,而我看 Nextend Social Plugin 也沒處理,之後遇到再說了。
程式碼實作如下:
<?php
/**
* 替換頭像網址
*/
add_filter( 'pre_get_avatar_data', 'replace_avatar_url',10, 2 );
public function replace_avatar_url( $args, $id_or_email ) {
if ( $id_or_email instanceof WP_User ) {
$user_id = $id_or_email->ID;
} elseif ( $id_or_email instanceof WP_Post ) {
$user_id = $id_or_email->post_author;
} elseif ( $id_or_email instanceof WP_Comment ) {
$user_id = $id_or_email->user_id;
} elseif ( strpos( $id_or_email, '@' ) !== false ) {
$user_id = get_user_by( 'email', $id_or_email )->ID;
} else {
$user_id = $id_or_email;
}
// LINE 頭像網址欄位
if ( get_field( 'line_user_avatar', 'user_' . $user_id ) ) {
$args['url'] = get_field( 'line_user_avatar', 'user_' . $user_id );
}
return $args;
}