Outils pour utilisateurs

Outils du site


php:cache_gravatar

Cache local de Gravatars

Code PHP pour faire un cache de Gravatar. Utilité ? Éviter que Gravatar puisse tracer les internautes, que le site soit bousillé si Gravatar est injoignable, … Les commentaires sont en anglais.

get.php
<?php 
/*
How to use it:
call it from your website like this:
http://www.yoursite.com/some_folder_for_gravatar_caching/get.php?g={md5_from_email}
*/
$expire = time() -604800 ;  // default: 604800 (7 days)
$size = 65;
 
if(isset($_GET['s'])) {
	switch ($_GET['s']) {
		case 0:
			$size = 32; break;
		case 1:
			$size = 120; break;
		default:
			$size = 65;
	}
}
 
if (isset($_GET['g'])) {   // g given ? if yes...
	if (strlen($_GET['g']) !== 32) { header("HTTP/1.0 404 Not Found");die; }
	$hash = preg_replace("/[^a-f0-9]/", "", $_GET['g'] ); 
 	if (strlen($hash) != 32) { header("HTTP/1.0 404 Not Found");die; }  
 
	$newfile = $hash.'_'.$size.'.png';
	$file = 'http://gravatar.com/avatar/'.$hash.'?s='.$size.'&d=mm&r=x';  
	if(file_exists($newfile) && filemtime($newfile) < $expire) {
		unlink($newfile);
	}
	if (file_exists($newfile)) {
	}
	else {
		copy($file, $newfile);
		$imagecheck = getimagesize($newfile);
		if ($imagecheck['mime']!=='image/png')  {
			imagepng(imagecreatefromjpeg($newfile),$newfile.'2');
			unlink($newfile);
			rename($newfile.'2', $newfile);
		}
	}
	header('Content-Type: image/png');
	header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($newfile)).' GMT');
   header('Content-Length: ' . filesize($newfile));
   header('Cache-Control: public, max-age=86400');
   readfile($newfile);
	exit;
}
 
else {
	$seconds_old = 2592000; // 30 days
	$dirhandle = opendir('.');
	while($fileclean = readdir($dirhandle)) {
		if( $fileclean != "." && $fileclean != ".." && $fileclean != "index.php" ) {
			if(filemtime($fileclean) < (time()-$seconds_old) ) {
				unlink($fileclean);
			}
		}
	}
	header('Location: /');
	exit;
}
 
?>

Pour passer les avatars Wordpress, envoyez ce fichier dans le dossier des extensions et activez-le (après avoir crée le dossier “gravatars” dans wp-content et y avoir placé le “get.php” ci-dessus):

gravatar.php
<?php
add_filter('get_avatar', 'be_gravatar_filter', 10, 5);
function be_gravatar_filter($avatar, $id_or_email, $size, $default, $alt) {
$email = 'a@b.c';
if ( is_numeric($id_or_email) ) {
$id = (int) $id_or_email;
$user = get_userdata($id);
if ( $user )
	$email = $user->user_email;
	} elseif ( is_object($id_or_email) ) {
		// No avatar for pingbacks or trackbacks
		$allowed_comment_types = apply_filters( 'get_avatar_comment_types', array( 'comment' ) );
		if ( ! empty( $id_or_email->comment_type ) && ! in_array( $id_or_email->comment_type, (array) $allowed_comment_types ) )
			return false;
 
		if ( !empty($id_or_email->user_id) ) {
			$id = (int) $id_or_email->user_id;
			$user = get_userdata($id);
			if ( $user)
				$email = $user->user_email;
		} elseif ( !empty($id_or_email->comment_author_email) ) {
			$email = $id_or_email->comment_author_email;
		}
	} else {
		$email = $id_or_email;
	}
 
	if ( empty($default) ) {
		$avatar_default = get_option('avatar_default');
		if ( empty($avatar_default) )
			$default = 'mystery';
		else
			$default = $avatar_default;
	}
 
 
 
 
	if ( !empty($email) )
		$email_hash = md5( strtolower( $email ) );
$return = '<a href="https://secure.gravatar.com/avatar/'.$email_hash.'?d=monsterid&amp;r=G&amp;s=500"><img class="gravatar" src="'.site_url('/').'wp-content/gravatars/get.php?g='.$email_hash.'" alt="'.$alt.'"></a>';
return $return;
}
?>

OPTIONNEL: vous pouvez placer le script suivant dans votre dossier de gravatars, il crée une galerie en supprimant les gravatars trop anciens:

index.php
<?php 
// delete gravatars older than 30 days
$seconds_old = 2592000; 
$dirhandle = opendir('.');
while($fileclean = readdir($dirhandle)) {
 if( $fileclean != "." && $fileclean != ".." && $fileclean != "index.php" && $fileclean != "zavatars.html" && $fileclean != "get.php" ) {
  if(filemtime($fileclean) < (time()-$seconds_old) ) {
   unlink($fileclean);
  }
 }
}
 
/*cache*/
$cache = 'zavatars.html';
$expire = time() -60000 ;  // galery cached for 16 hours
$expire_gravatar = time() -10 ;
 if(file_exists($cache) && filemtime($cache) > $expire) { readfile($cache); }
else
{ ob_start(); 
?>
<!DOCTYPE html>
<head><meta charset="UTF-8">
<title>[Gravatars]</title>
<style type="text/css">
<!--
body { font-size:14px;margin-left:20px;margin-top:20px;font-family:monospace; }
a { font-weight:bold;text-decoration:none;}
-->
</style>
</head>
<body>
Listing généré: <?php echo date("H:i:s");?> (valide ~16 heures)<br><br>
<?php
$directory = "./";
$files = glob($directory . "*");
foreach($files as $file)
{ 
	if (preg_match("/.html/i", $file)) { }
	else if (preg_match("/.php/i", $file)) { }
	else {echo '<a href="https://secure.gravatar.com/avatar/'.substr($file, 2, -4).'?d=monsterid&amp;r=G&amp;s=500"><img alt="" src="'.$file.'"></a>'."\n"; }
}
?>
</body></html>
<?php
$tampon = ob_get_contents();
ob_end_clean();
file_put_contents($cache, $tampon); 
echo $tampon; } ?>
php/cache_gravatar.txt · Dernière modification : 2015-07-04 09:05 de mitsu