Eliminar el soporte de Gravatar.com para WordPress y Simple Local Avatars
Actualmente estoy usando Simple Local Avatars en varios de mis blogs, permitiendo a los usuarios subir sus propios avatares personalizados.
Por lo que sé, Simple Local Avatars usa get_avatar
para verificar si se seleccionó un avatar personalizado, si no, recurre a Gravatar.com.
¿Sería posible deshabilitar la parte de Gravatar.com de alguna manera, eliminando Gravatar.com completamente y mostrando solo alguna imagen alojada localmente cuando no se selecciona un avatar personalizado?
Espero que esté bien publicar esto aquí, pero este sería el archivo de Simple Local Avatars:
<?php
/*
Plugin Name: Simple Local Avatars
Plugin URI: http://www.get10up.com/plugins/simple-local-avatars-wordpress/
Description: Agrega un campo de subida de avatar a los perfiles de usuario si el usuario actual tiene permisos de medios. Genera los tamaños solicitados bajo demanda como Gravatar. Simple y ligero.
Version: 1.2.3
Author: Jake Goldman (10up), Oomph Inc
Author URI: http://www.get10up.com
*/
// agregar campo a perfiles de usuario
class simple_local_avatars {
function simple_local_avatars() {
add_filter('get_avatar', array($this, 'get_avatar'), 10, 5);
add_action('admin_init', array($this, 'admin_init'));
add_action('show_user_profile', array($this, 'edit_user_profile'));
add_action('edit_user_profile', array($this, 'edit_user_profile'));
add_action('personal_options_update', array($this, 'edit_user_profile_update'));
add_action('edit_user_profile_update', array($this, 'edit_user_profile_update'));
add_filter('avatar_defaults', array($this, 'avatar_defaults'));
}
function get_avatar($avatar = '', $id_or_email, $size = '96', $default = '', $alt = false) {
if (is_numeric($id_or_email))
$user_id = (int) $id_or_email;
elseif (is_string($id_or_email)) {
if ($user = get_user_by_email($id_or_email))
$user_id = $user->ID;
} elseif (is_object($id_or_email) && !empty($id_or_email->user_id))
$user_id = (int) $id_or_email->user_id;
if (!empty($user_id))
$local_avatars = get_user_meta($user_id, 'simple_local_avatar', true);
if (!isset($local_avatars) || empty($local_avatars) || !isset($local_avatars['full'])) {
if (!empty($avatar)) // si es llamado por el filtro
return $avatar;
remove_filter('get_avatar', 'get_simple_local_avatar');
$avatar = get_avatar($id_or_email, $size, $default);
add_filter('get_avatar', 'get_simple_local_avatar', 10, 5);
return $avatar;
}
if (!is_numeric($size)) // asegurar tamaño válido
$size = '96';
if (empty($alt))
$alt = get_the_author_meta('display_name', $user_id);
// generar un nuevo tamaño
if (empty($local_avatars[$size])) {
$upload_path = wp_upload_dir();
$avatar_full_path = str_replace($upload_path['baseurl'], $upload_path['basedir'], $local_avatars['full']);
$image_sized = image_resize($avatar_full_path, $size, $size, true);
if (is_wp_error($image_sized)) // manejar caso cuando original es >= a la imagen original (o falta de capacidad de redimensionar)
$local_avatars[$size] = $local_avatars['full'];
else
$local_avatars[$size] = str_replace($upload_path['basedir'], $upload_path['baseurl'], $image_sized);
update_user_meta($user_id, 'simple_local_avatar', $local_avatars);
} elseif (substr($local_avatars[$size], 0, 4) != 'http')
$local_avatars[$size] = site_url($local_avatars[$size]);
$author_class = is_author($user_id) ? ' current-author' : '';
$avatar = "<img alt='" . esc_attr($alt) . "' src='" . $local_avatars[$size] . "' class='avatar avatar-{$size}{$author_class} photo' height='{$size}' width='{$size}' />";
return $avatar;
}
function admin_init() {
load_plugin_textdomain('simple-local-avatars', false, dirname(plugin_basename(__FILE__)) . '/localization/');
register_setting('discussion', 'simple_local_avatars_caps', array($this, 'sanitize_options'));
add_settings_field('simple-local-avatars-caps', __('Permisos para Avatares Locales', 'simple-local-avatars'), array($this, 'avatar_settings_field'), 'discussion', 'avatars');
}
function sanitize_options($input) {
$new_input['simple_local_avatars_caps'] = empty($input['simple_local_avatars_caps']) ? 0 : 1;
return $new_input;
}
function avatar_settings_field($args) {
$options = get_option('simple_local_avatars_caps');
echo '
<label for="simple_local_avatars_caps">
<input type="checkbox" name="simple_local_avatars_caps" id="simple_local_avatars_caps" value="1" ' . @checked($options['simple_local_avatars_caps'], 1, false) . ' />
' . __('Solo permitir que usuarios con capacidad de subir archivos carguen avatares locales (Autores y superiores)', 'simple-local-avatars') . '
</label>
';
}
function edit_user_profile($profileuser) {
?>
<h3><?php _e('Avatar', 'simple-local-avatars'); ?></h3>
<table class="form-table">
<tr>
<th><label for="simple-local-avatar"><?php _e('Subir Avatar', 'simple-local-avatars'); ?></label></th>
<td style="width: 50px;" valign="top">
<?php echo get_avatar($profileuser->ID); ?>
</td>
<td>
<?php
$options = get_option('simple_local_avatars_caps');
if (empty($options['simple_local_avatars_caps']) || current_user_can('upload_files')) {
do_action('simple_local_avatar_notices');
wp_nonce_field('simple_local_avatar_nonce', '_simple_local_avatar_nonce', false);
?>
<input type="file" name="simple-local-avatar" id="simple-local-avatar" /><br />
<?php
if (empty($profileuser->simple_local_avatar))
echo '<span class="description">' . __('No hay un avatar local configurado. Usa el campo de subida para agregar un avatar local.', 'simple-local-avatars') . '</span>';
else
echo '
<input type="checkbox" name="simple-local-avatar-erase" value="1" /> ' . __('Eliminar avatar local', 'simple-local-avatars') . '<br />
<span class="description">' . __('Reemplaza el avatar local subiendo uno nuevo, o elimínalo (volviendo a gravatar) marcando la opción de eliminar.', 'simple-local-avatars') . '</span>
';
} else {
if (empty($profileuser->simple_local_avatar))
echo '<span class="description">' . __('No hay un avatar local configurado. Configura tu avatar en Gravatar.com.', 'simple-local-avatars') . '</span>';
else
echo '<span class="description">' . __('No tienes permisos de gestión de medios. Para cambiar tu avatar local, contacta al administrador del blog.', 'simple-local-avatars') . '</span>';
}
?>
</td>
</tr>
</table>
<script type="text/javascript">
var form = document.getElementById('your-profile');
form.encoding = 'multipart/form-data';
form.setAttribute('enctype', 'multipart/form-data');
</script>
<?php
}
function edit_user_profile_update($user_id) {
if (!wp_verify_nonce($_POST['_simple_local_avatar_nonce'], 'simple_local_avatar_nonce')) //seguridad
return;
if (!empty($_FILES['simple-local-avatar']['name'])) {
$mimes = array(
'jpg|jpeg|jpe' => 'image/jpeg',
'gif' => 'image/gif',
'png' => 'image/png',
'bmp' => 'image/bmp',
'tif|tiff' => 'image/tiff'
);
$avatar = wp_handle_upload($_FILES['simple-local-avatar'], array('mimes' => $mimes, 'test_form' => false));
if (empty($avatar['file'])) // manejar errores
{
switch ($avatar['error']) {
case 'File type does not meet security guidelines. Try another.':
add_action('user_profile_update_errors', create_function('$a', '$a->add("avatar_error",__("Por favor sube un archivo de imagen válido para el avatar.","simple-local-avatars"));'));
break;
default:
add_action('user_profile_update_errors', create_function('$a', '$a->add("avatar_error","<strong>".__("Hubo un error al subir el avatar:","simple-local-avatars")."</strong> ' . esc_attr($avatar['error']) . '");'));
}
return;
}
$this->avatar_delete($user_id); // eliminar imágenes antiguas si fue exitoso
update_user_meta($user_id, 'simple_local_avatar', array('full' => $avatar['url'])); // guardar información del usuario (sobrescribiendo antigua)
} elseif (isset($_POST['simple-local-avatar-erase']) && $_POST['simple-local-avatar-erase'] == 1)
$this->avatar_delete($user_id);
}
// remover el hook get_avatar personalizado para la lista de avatares predeterminados en options-discussion.php
function avatar_defaults($avatar_defaults) {
remove_action('get_avatar', array($this, 'get_avatar'));
return $avatar_defaults;
}
// eliminar avatares basados en user_id
function avatar_delete($user_id) {
$old_avatars = get_user_meta($user_id, 'simple_local_avatar', true);
$upload_path = wp_upload_dir();
if (is_array($old_avatars)) {
foreach ($old_avatars as $old_avatar) {
$old_avatar_path = str_replace($upload_path['baseurl'], $upload_path['basedir'], $old_avatar);
@unlink($old_avatar_path);
}
}
delete_user_meta($user_id, 'simple_local_avatar');
}
}
$simple_local_avatars = new simple_local_avatars;
if (!function_exists('get_simple_local_avatar')):
/*
* más eficiente llamar al avatar local directamente en el tema y evitar la configuración de gravatar
*
* @param int|string|object $id_or_email Un ID de usuario, dirección de email u objeto de comentario
* @param int $size Tamaño de la imagen del avatar
* @param string $default URL de una imagen predeterminada si no hay avatar disponible
* @param string $alt Texto alternativo para usar en la etiqueta de imagen. Por defecto vacío
* @return string etiqueta <img> para el avatar del usuario
*/
function get_simple_local_avatar($id_or_email, $size = '96', $default = '', $alt = false) {
global $simple_local_avatars;
return $simple_local_avatars->get_avatar('', $id_or_email, $size, $default, $alt);
}
endif;
// al desinstalar, remover el campo personalizado de los usuarios y eliminar los avatares locales
register_uninstall_hook(__FILE__, 'simple_local_avatars_uninstall');
function simple_local_avatars_uninstall() {
$simple_local_avatars = new simple_local_avatars;
$users = get_users_of_blog();
foreach ($users as $user)
$simple_local_avatars->avatar_delete($user->user_id);
delete_option('simple_local_avatars_caps');
}
Si buscas una solución súper ligera y no te importa meterte un poco en código, añade esto en tu functions.php
:
function __default_local_avatar()
{
// esto asume que default_avatar.png está en wp-content/themes/tema-activo/images
return get_bloginfo('template_directory') . '/images/default_avatar.png';
}
add_filter( 'pre_option_avatar_default', '__default_local_avatar' );
Alternativamente, si quieres algo más completo, con la capacidad de gestionar todo desde el administrador, echa un vistazo a Añadir nuevo avatar predeterminado.
ACTUALIZACIÓN: Escribí un plugin rápido para usar junto con Simple Local Avatars.
<?php
/**
* Plugin Name: Desactivar avatares predeterminados
* Plugin URI: http://wordpress.stackexchange.com/questions/17413
* Description: Para usar junto con <a href="http://www.get10up.com/plugins/simple-local-avatars-wordpress/">Simple Local Avatars</a>, desactivando todos los avatares predeterminados y recurriendo a una única imagen. Usa el filtro <code>local_default_avatar</code> para establecer la ruta de la imagen.
* Version: 1.0
* Author: TheDeadMedic
* Author URI: http://wordpress.stackexchange.com/users/1685/thedeadmedic
*/
if ( !function_exists( 'get_avatar' ) ) :
/**
* Recupera el avatar para un usuario que proporcionó un ID de usuario o dirección de email.
*
* @since 2.5
* @param int|string|object $id_or_email Un ID de usuario, dirección de email u objeto de comentario
* @param int $size Tamaño de la imagen del avatar
* @param string $default URL de una imagen predeterminada si no hay avatar disponible
* @param string $alt Texto alternativo para usar en la etiqueta de imagen. Por defecto vacío
* @return string Etiqueta <img> para el avatar del usuario
*/
function get_avatar( $id_or_email, $size = '96', $default = '', $alt = false ) {
if ( ! get_option('show_avatars') )
return false;
static $default_url; // usa variables estáticas para un poco de caché
if ( !isset( $default_url ) )
$default_url = apply_filters( 'local_default_avatar', get_template_directory_uri() . '/images/default_avatar.png' );
if ( false === $alt)
$safe_alt = '';
else
$safe_alt = esc_attr( $alt );
if ( !is_numeric( $size ) )
$size = '96';
$avatar = "<img alt='{$safe_alt}' src='{$default_url}' class='avatar avatar-{$size} photo avatar-default' height='{$size}' width='{$size}' />";
return apply_filters( 'get_avatar', $avatar, $id_or_email, $size, $default, $alt );
}
endif;
function __limit_default_avatars_setting( $default )
{
return 'local_default';
}
add_filter( 'pre_option_avatar_default', '__limit_default_avatars_setting' );
if ( is_admin() ) :
function __limit_default_avatars( $defaults )
{
return array( 'local_default' => get_bloginfo( 'name' ) . ' Predeterminado' );
}
add_filter( 'avatar_defaults', '__limit_default_avatars' );
endif;
?>
La descripción del plugin debería ser autoexplicativa, pero esencialmente el avatar predeterminado es http://ruta-del-tema-wordpress/images/default_avatar.png
, que se puede filtrar en el functions.php
de tu tema si existe en otro lugar:
function __my_theme_default_avatar( $url )
{
return 'http://alguna/parte/otra-imagen.jpg';
}
add_filter( 'local_default_avatar', '__my_theme_default_avatar' );

Casi :) Esto establece un nuevo avatar predeterminado, en lugar de, por ejemplo, el hombre misterioso. ¿Sería posible desactivar completamente el soporte para Gravatar también, y simplemente poder elegir entre el tuyo y Simple Local Avatars?

He reemplazado con éxito todos los avatares de gravatar.com con mi propia imagen de avatar alojada localmente añadiendo esto al archivo function.php
de mi tema:
define('DEFAULT_AVATAR_URL', get_template_directory_uri() . '/images/user.png');
function no_gravatars( $avatar ) {
return preg_replace( "/http.*?gravatar\.com[^\']*/", DEFAULT_AVATAR_URL, $avatar );
}
add_filter( 'get_avatar', 'no_gravatars' );
Esto asume que tienes un avatar local predeterminado llamado user.png
en el subdirectorio images
de tu tema.
En el panel de administración de configuración de discusión
, asegúrate de que la opción "Mostrar avatares" esté marcada.
No he probado esto con Simple Local Avatars, pero funciona perfectamente con Basic User Avatars (que es un fork ligero de Simple Local Avatars).
CONSEJO: Si estás diseñando tu propio avatar predeterminado, recomiendo hacerlo de 300x300 píxeles para que se vea bien en pantallas "retina" cuando WordPress lo muestre a "150x150". Luego puedes reducir significativamente el tamaño del archivo comprimiéndolo en tinyPNG.com.

Extensión a la pregunta original: En caso de que desees omitir/reemplazar la nota "Puedes cambiar tu foto de perfil en Gravatar" en la página de perfil de Wordpress, añade esto al functions.php de tu tema activo:
/**
* Deshabilita la nota de Gravatar en la configuración de perfil de WP
*/
function replace_wp_gravatar_note()
{
// eliminar:
return null;
// reemplazar:
// return 'Puedes cambiar tu foto de perfil <a href="' . get_site_url(null, 'user', 'https') . '">aquí</a>.';
}
add_filter( 'user_profile_picture_description', 'replace_wp_gravatar_note' );

Eliminar avatares por completo. Coloca este código en el archivo functions.php de tu tema en uso.
add_action( 'init', 'qmas_remove_avatars' );
if (!function_exists('qmas_remove_avatars')) {
function qmas_remove_avatars() {
add_filter( 'bp_core_fetch_avatar', function () { return ''; } );
add_filter( 'get_avatar', function () { return ''; } );
add_filter( 'bp_get_signup_avatar', function () { return ''; } );
}
}

Reemplaza la etiqueta IMG con una cadena vacía. También devuelve una cadena vacía en la URL del avatar. Dejando la asignación predeterminada de WordPress
