Adicionar URL externa para substituir a foto de Perfil padrão (Gravatar) no WordPress

Ivon Filho

Procurando desenvolvedor freelancer para seu projeto?

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);
Rolar para cima