Segue arquivo do Plugin:
<?php
/*
Plugin Name: Foto de Perfil com URL Externa Segura
Plugin URI: http://seusite.com/
Description: Permite que usuários substituam a imagem de perfil do Gravatar por uma imagem de uma URL externa, salvando-a seguramente como miniatura.
Version: 1.0
Author: Seu Nome
Author URI: http://seusite.com/
*/
// Adiciona o campo de URL de perfil em Informações de Contato
function secure_external_profile_image_add_custom_contact_method($user_contact_method) {
$user_contact_method['custom_profile_url'] = __('URL do Perfil');
return $user_contact_method;
}
add_filter('user_contactmethods', 'secure_external_profile_image_add_custom_contact_method', 10, 1);
// Salva a URL da imagem personalizada quando o perfil é atualizado
function secure_external_profile_image_save_custom_user_profile_image_field($user_id) {
if (current_user_can('edit_user', $user_id) && !empty($_POST['custom_profile_url'])) {
require_once(ABSPATH . 'wp-admin/includes/media.php');
require_once(ABSPATH . 'wp-admin/includes/file.php');
require_once(ABSPATH . 'wp-admin/includes/image.php');
$attachment_id = media_sideload_image(esc_url_raw($_POST['custom_profile_url']), 0, null, 'id');
if (!is_wp_error($attachment_id)) {
update_user_meta($user_id, 'custom_profile_image_id', $attachment_id);
}
}
}
add_action('personal_options_update', 'secure_external_profile_image_save_custom_user_profile_image_field');
add_action('edit_user_profile_update', 'secure_external_profile_image_save_custom_user_profile_image_field');
// Substitui o avatar padrão pelo personalizado
function secure_external_profile_image_custom_avatar_filter($avatar, $id_or_email, $size, $default, $alt) {
$user_id = is_numeric($id_or_email) ? (int) $id_or_email : false;
if (!$user_id && is_object($id_or_email) && isset($id_or_email->user_id)) {
$user_id = $id_or_email->user_id;
} elseif (!$user_id && is_email($id_or_email)) {
$user = get_user_by('email', $id_or_email);
$user_id = $user ? $user->ID : false;
}
if ($user_id) {
$custom_image_id = get_user_meta($user_id, 'custom_profile_image_id', true);
if (!empty($custom_image_id)) {
$avatar_url = wp_get_attachment_image_url($custom_image_id, [$size, $size]);
if ($avatar_url) {
$avatar = "<img alt='{$alt}' src='{$avatar_url}' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />";
}
}
}
return $avatar;
}
add_filter('get_avatar', 'secure_external_profile_image_custom_avatar_filter', 10, 5);
Segunda forma agora utilizando ACF:
function acf_custom_user_avatar($user_id) {
$custom_avatar_id = get_field('custom_user_avatar', 'user_' . $user_id);
if ($custom_avatar_id) {
// Se for um array, pega a URL da imagem
if (is_array($custom_avatar_id)) {
$avatar_url = $custom_avatar_id['url'];
} else {
// Assume que é um ID de anexo
$avatar_url = wp_get_attachment_url($custom_avatar_id);
}
return $avatar_url;
}
return null; // Retorna nulo se não houver avatar personalizado
}
function acf_replace_user_avatar($avatar, $id_or_email, $size, $default, $alt) {
// Determina o ID do usuário
if (is_numeric($id_or_email)) {
$user_id = (int) $id_or_email;
} elseif (is_object($id_or_email)) {
if (!empty($id_or_email->user_id)) {
$user_id = (int) $id_or_email->user_id;
}
} else {
$user = get_user_by('email', $id_or_email);
$user_id = $user ? $user->ID : null;
}
if ($user_id) {
$custom_avatar_url = acf_custom_user_avatar($user_id);
if ($custom_avatar_url) {
// Substitui o avatar padrão pelo personalizado
$avatar = "<img alt='{$alt}' src='{$custom_avatar_url}' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />";
}
}
return $avatar;
}
// Hook para substituir o avatar
add_filter('get_avatar', 'acf_replace_user_avatar', 10, 5);