为头像做所有繁重工作的功能是get_avatar
. 这是一个pluggable function, 这意味着您可以用插件替换它。Get avatar还有一个方便的过滤器,您可以使用它以编程方式覆盖内容。因此,有几个选择:(1)完全替换get_avatar
这可能会产生意外的副作用,并破坏评论中的头像,(2)为作者头像设置自己的功能,(3)过滤get_avatar
为作者而写,为其他人而写。
无论哪种方式,它都是从向用户配置文件添加一个字段开始的,这样您就可以指定一个头像来完成此操作。
让我们从将所有内容包装到一个类开始。
<?php
WPSE67312_Avatars::init();
class WPSE67312_Avatars
{
// we\'ll need a nonce key
const NONCE = \'wpse67312_nonce\';
// The meta key where the avatar URL is stored.
const META_KEY = \'wpse67312_avatar\';
/***** Singleton pattern to add hooks and such *****/
private static $ins = null;
public static function init()
{
add_action(\'plugins_loaded\', array(__CLASS__, \'instance\'));
}
public static function instance()
{
is_null(self::$ins) && self::$ins = new self;
return self::$ins;
}
}
你需要加入
show_user_profile
和
edit_user_profile
. 第一个在您自己的配置文件中显示字段(作者也可以看到该字段),并且
edit_user_profile
当您编辑其他用户时,将显示该字段。
这还添加了一个小助手函数来获取用户化身url。不言而喻:坚持nonce, 添加标题,并回显字段。
<?php
class WPSE67312_Avatars
{
// snip snip
/**
* Helper to fetch avatar urls.
*
* @param int $user_id The user ID for which to fetch the avatar
* @uses get_user_meta To fetch the avatar URL.
* @return string The avatar url
*/
public static function get_avatar($user_id)
{
return get_user_meta($user_id, self::META_KEY, true);
}
/**
* Constructor. Where all the real actions get added.
*
* @uses add_action
* @uses add_filter
* @return void
*/
protected function __construct()
{
add_action(\'edit_user_profile\', array($this, \'field\'));
add_action(\'show_user_profile\', array($this, \'field\'));
}
public function field($user)
{
// Might want to hide this from authors?
// if(!current_user_can(\'manage_options\'))
// return;
wp_nonce_field(self::NONCE . $user->ID, self::NONCE, false);
echo \'<h4>\', esc_html__(\'Avatar URL\', \'wpse\'), \'</h4>\';
printf(
\'<input type="text" class="regular-text" id="%1$s" name="%1$s" value="%2$s" />\',
esc_attr(self::META_KEY),
esc_attr(self::get_avatar($user->ID))
);
}
}
然而,添加字段实际上并不能保存它。你需要加入
edit_user_profile_update
(保存您自己以外的配置文件时激发)和
person_options_update
(保存自己的配置文件时激发)。在挂钩函数中,我们检查nonce,检查以确保当前用户可以编辑数据,并使用
update_user_meta
或使用删除它
delete_user_meta
.
<?php
class WPSE67312_Avatars
{
// snip snip
/**
* Constructor. Where all the real actions get added.
*
* @uses add_action
* @uses add_filter
* @return void
*/
protected function __construct()
{
add_action(\'edit_user_profile\', array($this, \'field\'));
add_action(\'show_user_profile\', array($this, \'field\'));
add_action(\'edit_user_profile_update\', array($this, \'save\'));
add_action(\'personal_options_update\', array($this, \'save\'));
}
// snip snip
public function save($user_id)
{
if(
!isset($_POST[self::NONCE]) ||
!wp_verify_nonce($_POST[self::NONCE], self::NONCE . $user_id)
) return; // nonce is no good, bail
if(!current_user_can(\'edit_user\', $user_id))
return; // current user can\'t edit this user, bail
if(!empty($_POST[self::META_KEY]))
{
// we have data! save it!
update_user_meta(
$user_id,
self::META_KEY,
esc_url_raw($_POST[self::META_KEY])
);
}
else
{
// empty field, delete the old value
delete_user_meta($user_id, self::META_KEY);
}
}
}
您可以直接在模板中使用上述内容(循环中的某个地方):
<?php
if($avt = WPSEWPSE67312_Avatars::get_avatar(get_the_author_meta(\'ID\')))
{
printf(
\'<img src="%1s$" alt="%2$s" title="%4$s" />\',
esc_url($avt),
esc_attr(get_the_author_meta(\'display_name\'))
);
}
这有点乱。或者我们可以尝试用
get_avatar
:
<?php
class WPSE67312_Avatars
{
// snip snip
/**
* Constructor. Where all the real actions get added.
*
* @uses add_action
* @uses add_filter
* @return void
*/
protected function __construct()
{
add_action(\'edit_user_profile\', array($this, \'field\'));
add_action(\'show_user_profile\', array($this, \'field\'));
add_action(\'edit_user_profile_update\', array($this, \'save\'));
add_action(\'personal_options_update\', array($this, \'save\'));
add_filter(\'get_avatar\', array($this, \'filter_avatar\'), 10, 5);
}
// snip snip
public function filter_avatar($avatar, $id_or_email, $size, $default, $alt)
{
// do the dance to get a user
$id = false;
if(is_numeric($id_or_email))
{
$id = $id_or_email;
}
elseif(is_object($id_or_email))
{
if(!empty($id_or_email->user_id))
$id = $id_or_email->user_id; // comment
}
elseif($user = get_user_by(\'email\', $id_or_email))
{
$id = $user->ID;
}
if($id && ($avt = self::get_avatar($id)))
{
$avatar = sprintf(
\'<img src="%1$s" alt="%2$s" title="%2$s" width="%3$s" />\',
esc_url($avt),
esc_attr($alt),
esc_attr($size)
);
}
return $avatar;
}
}
理论上,上述内容应该让普通的化身保持独立,并在它们可用时使用您的自定义化身。它可能需要比我所能做的更多的测试。
这些都是,wrapped in a plugin.