0Wordpress Local Gravatar Cache

Ich mag Avatare für Menschen gezeigt haben, die auf meinem Blog kommentieren. Wordpress unterstützt die Gravatar Service nativ so ermöglicht dies ist sehr einfach. Allerdings kommt es mit einer Kosten - externe Dateien aus einer anderen Domäne zugreifen fügt viele zusätzliche Ladezeit in Form von neuen DNS Lookups, neu SSL Verbindungen zu machen, usw. Wäre es nicht schön, Gravatars lokal zu haben, gespeichert und von Ihrem eigenen Server bedient. Nun, das ist, was ich schon seit einiger Zeit jetzt tun, wenn Sie möchten wissen, wie, weiter lesen…

Falls Sie sich immer noch fragen, warum Sie das tun möchten, Lassen Sie mich noch ein paar weitere Vorteile anbieten – lokal bereitgestellte Bilder können komprimiert werden, bevor sie bereitgestellt werden, Zum Beispiel werden alle meine Bilder in Webp-Versionen konvertiert, und jeder Browser, der webp unterstützt, erhält die webp-Version. Dies gilt zusätzlich zu der Reduzierung, da keine Verbindung zu einem externen Server hergestellt werden muss. Für die lokalen Ressourcen kann auch ein Caching-Header festgelegt werden, damit Browser sie zwischenspeichern. Gravatar sieht keine sehr lange Cache-Zeit vor.

Ich habe erstellt 3 benutzerdefinierte Funktionen, die stelle ich einfach in meinem Thema der functions.php. Der erste ist ein benutzerdefinierter Filter für das native WordPress get_avatar(). Der zweite Greifer Avatare von Gravatar und Google, wenn aufgerufen,, und der dritte erstellt einen täglichen Cronjob, der die Gravatare aktualisiert – falls sie geändert wurden, oder ein vorher nicht verfügbares ist jetzt verfügbar.

Sie müssen ein wenig basteln, um es mit Ihrem Thema kompatibel zu machen – ich verwende das „Knochen“-Framework, wie Sie in der sehen werden 3rd function habe ich einen Teil des bereitgestellten Codes wiederverwendet. Sie müssen auch erstellen, oder passen Sie den Pfad an, um die Gravatare zu speichern, die in meinem Fall im Themenordner im Unterpfad „/library/images/gravatars/“ gespeichert sind

/*********************************************\
* Filter get_avatar lokale Avatare verwenden nur *
\*********************************************/
Funktion bones_gravatar($Benutzerbild, $id_or_email, $Größe, $Default, $alt)
{
$root_path = get_template_directory_uri() . '/ Bibliothek / images / Gravatars /';
$root_path_local = get_template_directory() . '/ Bibliothek / images / Gravatars /';
$gravatar_path = $ root_path . 'Default_avatar';
$gravatar_path_hidpi = ‚data-Gravatar-HiDPI ="‘. $ Root_path . ‚Default_avatar-hidpi.png"';

//shamelessly reuse original code to get the e-mail address

$email = '';
wenn ( is_numeric($id_or_email) )
{
$id = (int) $id_or_email;
$user = get_userdata($die);
wenn ( $Benutzer ) $E-Mail = $ user->user_email;
}
elseif ( is_object($id_or_email) )
{
// No avatar for pingbacks or trackbacks
$allowed_comment_types = apply_filters( 'Get_avatar_comment_types', Feld( 'Kommentar' ) );
wenn ( ! leer( $id_or_email->comment_type ) && ! in_array( $id_or_email->comment_type, (Feld) $allowed_comment_types ) ) falsch zurückgeben;
wenn ( !leer($id_or_email->Benutzeridentifikation) )
{
$id = (int) $id_or_email->Benutzeridentifikation;
$user = get_userdata($die);
wenn ( $Benutzer) $E-Mail = $ user->user_email;
}
elseif ( !leer($id_or_email->comment_author_email) )
{
$E-Mail = $ id_or_email->comment_author_email;
}
}
sonst
{
$E-Mail = $ id_or_email;
}

wenn ( !leer($Email) )
{
$email_hash = md5( strtolower( trimmen( $Email ) ) );
wenn(Datei existiert($root_path_local . $email_hash . '.png'))
{
//if we have a local cache then use it
$gravatar_path= $root_path . $email_hash ;
$gravatar_path_hidpi = ‚data-Gravatar-HiDPI ="‘. $ Root_path . $email_hash . ‚-hidpi.png"';
}
}
wenn($Größe >= 47) $avatar = '<img class ="Last-Gravatar avatar avatar - '$ Größe.' Foto" width ="'$ Größe.'" height ="'$ Größe.'" src ="' . $gravatar_path . ‚-hidpi.png" alt ="Gravatar" />';
$ Avatar sonst = '<img class ="Last-Gravatar avatar avatar - '$ Größe.' Foto" width ="'$ Größe.'" height ="'$ Größe.'" src ="' . $gravatar_path . ‘.png" alt ="Gravatar" ' . $gravatar_path_hidpi . '/>';

return $ avatar;
}

add_filter('Get_avatar', 'Bones_gravatar', 10, 5);






/***********************\
* Erstellen Gravatar Cache *
\***********************/
Funktion grab_avatar($comment_id,$Kommentar,$refresh = false,$email = '')
{
du schläfst(20);
$root_path = get_template_directory_uri() . '/ Bibliothek / images / Gravatars /';
$root_path_local = get_template_directory() . '/ Bibliothek / images / Gravatars /';
wenn($aktualisieren == false) $img_name = md5( get_comment_author_email($comment_id) );
else $ = img_name md5( $Email );
wenn(!Datei existiert($root_path_local . $img_name . '.png') || $aktualisieren == true)
{
wenn($aktualisieren == false) $bgauthemail = get_comment_author_email();
else $ bgauthemail = $ email;
//try google first
$domain= explode("@",$bgauthemail);
wenn($Domain[1]=="gmail.com")
{
$ch = curl_init();
curl_setopt($CH, CURLOPT_SSL_VERIFYPEER, falsch);
curl_setopt($CH, CURLOPT_RETURNTRANSFER, true);
curl_setopt($CH, CURLOPT_URL, "https://picasaweb.google.com/data/entry/api/user/" . $bgauthemail . "?alt = json");
$Ergebnis = curl_exec($CH);
curl_close($CH);

$obj = json_decode($Ergebnis,true);
$avatar_from_gmail = $ obj['Eintrag']["GPhoto $ Thumbnail"]['$ T'];

$extension = strrchr($avatar_from_gmail, '');

$ch = curl_init($avatar_from_gmail);
curl_setopt( $CH, CURLOPT_NOBODY, true );
curl_setopt( $CH, CURLOPT_RETURNTRANSFER, falsch );
curl_setopt( $CH, CURLOPT_HEADER, falsch );
curl_setopt( $CH, CURLOPT_FOLLOWLOCATION, true );
curl_setopt( $CH, CURLOPT_MAXREDIRS, 3 );
curl_exec( $CH );
$headers = curl_getinfo( $CH );
curl_close( $CH );
wenn($Header['HTTP_CODE'] === 200)
{
$ch = curl_init($avatar_from_gmail);
$fp = fopen($root_path_local . $img_name . '-hidpi' . $Erweiterung, 'Wb');
curl_setopt($CH,CURLOPT_USERAGENT,‚Mozilla / 5.0 (Windows NT 6.1; Win64; x64) AppleWebKit / 537,36 (KHTML, wie Gecko) Chrom / 39.0.2171.62 Safari / 537,36');
curl_setopt($CH, CURLOPT_FILE, $fp);
curl_setopt($CH, CURLOPT_HEADER, 0);

curl_exec($CH);
curl_close($CH);

fclose($fp);

$usegravatar = false;

$small_image = wp_get_image_editor($root_path_local . $img_name . '-hidpi' . $Erweiterung);
wenn ( ! is_wp_error( $small_image ) )
{
//überprüfen Sie es nicht ein leeres Mann Bild ist, wenn ja, delete it
if (md5_file($root_path_local . $img_name . '-hidpi.jpg') == strtolower("686E5C46776BA0E5C488853C1C0B492C"))
{
//delete
unlink($root_path_local . $img_name . '-hidpi.jpg');
//try gravatar
$usegravatar=true;
}
else if (md5_file($root_path_local . $img_name . '-hidpi.jpg') == strtolower("6D4083BE95FB32358A5110F5A83B9979"))
{
//delete
unlink($root_path_local . $img_name . '-hidpi.jpg');
//try gravatar
$usegravatar=true;
}
sonst
{
//always convert to png because some plugins expect all gravatars to be pngs
$small_image->sparen($root_path_local . $img_name . '-hidpi.png','Image / jpeg');
$small_image->die Größe(40, 40, true);
$small_image->set_quality( 10 );
$small_image->sparen($root_path_local . $img_name . '.png','Image / jpeg');
wenn($Erweiterung ==".jpg") entkoppeln($root_path_local . $img_name . '-hidpi.jpg');
}
}
}

}
//check e-mail isnt a blank generic one
else if($bgauthemail!=="noemail@intensedebate.com" || $usegravatar == true)
{
$avatar_from_gravatar = "https://www.gravatar.com/avatar/" . $img_name . "?s = 80&d = 404";
$ch = curl_init($avatar_from_gravatar);
curl_setopt( $CH, CURLOPT_NOBODY, true );
curl_setopt( $CH, CURLOPT_RETURNTRANSFER, falsch );
curl_setopt( $CH, CURLOPT_HEADER, falsch );
curl_setopt( $CH, CURLOPT_FOLLOWLOCATION, true );
curl_setopt( $CH, CURLOPT_MAXREDIRS, 3 );
curl_exec( $CH );
$headers = curl_getinfo( $CH );
curl_close( $CH );
wenn($Header['HTTP_CODE'] === 200)
{
$ch = curl_init($avatar_from_gravatar);
$fp = fopen($root_path_local . $img_name . '-hidpi.png', 'Wb');
curl_setopt($CH,CURLOPT_USERAGENT,‚Mozilla / 5.0 (Windows NT 6.1; Win64; x64) AppleWebKit / 537,36 (KHTML, wie Gecko) Chrom / 39.0.2171.62 Safari / 537,36');
curl_setopt($CH, CURLOPT_FILE, $fp);
curl_setopt($CH, CURLOPT_HEADER, 0);

curl_exec($CH);
curl_close($CH);

fclose($fp);

$small_image = wp_get_image_editor($root_path_local . $img_name . '-hidpi.png');
wenn ( ! is_wp_error( $small_image ) )
{
$small_image->die Größe(40, 40, true);
$small_image->sparen($root_path_local . $img_name . '.png');
}
}
}
}
}
add_action('Wp_insert_comment', 'Grab_avatar');






/********************************************\
* Aktualisieren Gravatar Cache im Hintergrund täglich *
\********************************************/
add_action( 'Wp', 'Bones_setup_schedule' );
Funktion bones_setup_schedule() {
wenn ( ! wp_next_scheduled( 'Bones_daily_event' ) ) {
wp_schedule_event( Zeit(), 'Täglich', 'Bones_daily_event');
}
}

add_action( 'Bones_daily_event', 'Bones_refresh_gravatars' );
Funktion bones_refresh_gravatars()
{
//get list of gravatars somehow
global $wpdb;
$comment_author_emails = $ wpdb->get_results( "SELECT DISTINCT(comment_author_email) VON " . $wpdb->Präfix . "Bemerkungen" );
für jede($comment_author_emails wie $ key => $val)
{
für jede($val wie $ a => $b)
{
grab_avatar('','',true,$b);
}
}
}

Leave a Reply