DIY Главная Медиа Logo

Конечная сайт для проектирования и создания вашей установке домашнего кинотеатра и Привет-Fi.

0WordPress Local Gravatar кэш

Я хотел бы иметь аватары показаны для людей, которые комментируют на моем блоге. WordPress поддерживает Gravatar сервис изначально так позволяет это очень легко. Однако он приходит с ценой - доступ к внешним файлам из другого домена добавляет много дополнительного время загрузки в виде нового DNS поиски, новый SSL соединения, чтобы сделать, так далее. Было бы неплохо, если бы граватары хранились локально и обслуживались с вашего собственного сервера. Ну вот что я делал в течение некоторого времени, если вы хотите знать, как, читай дальше…

Если вам все еще интересно, зачем вам это нужно, позвольте мне предложить еще несколько преимуществ - изображения, обслуживаемые локально, могут быть сжаты перед их отправкой, например ‑ все мои изображения конвертируются в веб-версии, и любой браузер, который поддерживает webp, получает версию webp. Это в дополнение к сокращению из-за отсутствия подключения к внешнему серверу.. На локальных ресурсах также может быть установлен заголовок кеширования, чтобы браузеры кэшировали их.. Gravatar не обеспечивает очень долгое время кеширования.

Я создал 3 пользовательские функции, который я просто поместить в functions.php моей темы в. Первый - это настраиваемый фильтр для родного wordpress get_avatar.(). Вторые грейферы аватар из Gravatar и Google, когда призвал, а третий создает ежедневное задание cron, которое обновляет граватары - на случай, если они были изменены., или ранее недоступный теперь доступен.

Вам нужно будет немного поработать, чтобы сделать его совместимым с вашей темой - я использую структуру «костей», как вы заметите в 3р-д функция Я повторно использовал код, который она предоставила. Вам также нужно будет создать, или настроить путь для хранения граватаров, которые в моем случае хранятся в папке темы в подпутье «/ library / images / gravatars /»

/*********************************************\
* Фильтр get_avatar использовать только локальные аватары *
\*********************************************/
функция bones_gravatar($аватар, $id_or_email, $размер, $дефолт, $альт)
{
$root_path = get_template_directory_uri() . '/ Библиотека / изображения / Gravatars /';
$root_path_local = get_template_directory() . '/ Библиотека / изображения / Gravatars /';
$gravatar_path = $ root_path . 'Default_avatar';
$gravatar_path_hidpi = «данных Gravatar-HiDPI ="». $ Root_path . «Default_avatar-hidpi.png"';

//бесстыдно повторно использовать исходный код, чтобы получить адрес электронной почты

$ email = '';
если ( is_numeric($id_or_email) )
{
$ID = (ИНТ) $id_or_email;
$Пользователь = get_userdata($id);
если ( $пользователь ) $электронная почта = $ user->user_email;
}
ElseIf ( is_object($id_or_email) )
{
// Нет аватара для пингбэков или трекбэков
$ allowed_comment_types = apply_filters( 'get_avatar_comment_types', массив( 'Комментарий' ) );
если ( ! пустой( $id_or_email->comment_type ) && ! in_array( $id_or_email->comment_type, (массив) $allowed_comment_types ) ) вернуться ложным;
если ( !пустой($id_or_email->Идентификатор пользователя) )
{
$ID = (ИНТ) $id_or_email->Идентификатор пользователя;
$Пользователь = get_userdata($id);
если ( $пользователь) $электронная почта = $ user->user_email;
}
ElseIf ( !пустой($id_or_email->comment_author_email) )
{
$электронная почта = $ id_or_email->comment_author_email;
}
}
еще
{
$электронная почта = $ id_or_email;
}

если ( !пустой($Эл. адрес) )
{
$email_hash = md5( strtolower( отделка( $Эл. адрес ) ) );
если(Файл существует($root_path_local . $email_hash . '.png'))
{
//если у нас есть локальный кеш, используйте его
$ gravatar_path = $ root_path . $email_hash ;
$gravatar_path_hidpi = «данных Gravatar-HiDPI ="». $ Root_path . $email_hash . «-hidpi.png"';
}
}
если($размер >= 47) $аватар = '<IMG класс ="нагрузки граватаров Аватар - '. $ размера. Фото" ширина ="'. $ Размер." высота ="'. $ Размер." SRC ="' . $gravatar_path . «-hidpi.png" альт ="Gravatar" />';
еще $ аватар = '<IMG класс ="нагрузки граватаров Аватар - '. $ размера. Фото" ширина ="'. $ Размер." высота ="'. $ Размер." SRC ="' . $gravatar_path . ».png" альт ="Gravatar" ' . $gravatar_path_hidpi . '/>';

возвращение $ аватар;
}

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






/***********************\
* Создание Gravatar кэш *
\***********************/
функция grab_avatar($comment_id,$комментарий,$обновить = ложь,$электронная почта = «»)
{
ты спишь(20);
$root_path = get_template_directory_uri() . '/ Библиотека / изображения / Gravatars /';
$root_path_local = get_template_directory() . '/ Библиотека / изображения / Gravatars /';
если($обновить == ложь) $img_name = md5( get_comment_author_email($comment_id) );
еще $ img_name = md5( $Эл. адрес );
если(!Файл существует($root_path_local . $img_name . '.png') || $обновить == правда)
{
если($обновить == ложь) $bgauthemail = get_comment_author_email();
еще $ bgauthemail = $ электронная почта;
//сначала попробуйте гугл
$ domain = взорваться("@",$bgauthemail);
если($домен[1]=="gmail.com")
{
$ч = curl_init();
curl_setopt($ч, CURLOPT_SSL_VERIFYPEER, ложный);
curl_setopt($ч, CURLOPT_RETURNTRANSFER, истинный);
curl_setopt($ч, CURLOPT_URL, "https://picasaweb.google.com/data/entry/api/user/" . $bgauthemail . "?Alt = JSON");
$Результат = curl_exec($ч);
curl_close($ч);

$OBJ = json_decode($результат,истинный);
$avatar_from_gmail = $ OBJ[«Запись»]["GPhoto $ Ленфильм"][«$ Т»];

$расширение = strrchr($avatar_from_gmail, '');

$ч = curl_init($avatar_from_gmail);
curl_setopt( $ч, CURLOPT_NOBODY, истинный );
curl_setopt( $ч, CURLOPT_RETURNTRANSFER, ложный );
curl_setopt( $ч, CURLOPT_HEADER, ложный );
curl_setopt( $ч, CURLOPT_FOLLOWLOCATION, истинный );
curl_setopt( $ч, CURLOPT_MAXREDIRS, 3 );
curl_exec( $ч );
$Заголовки = curl_getinfo( $ч );
curl_close( $ч );
если($заголовки['HTTP_CODE'] === 200)
{
$ч = curl_init($avatar_from_gmail);
$Fp = Еореп($root_path_local . $img_name . '-hidpi' . $расширение, «Термометр»);
curl_setopt($ч,CURLOPT_USERAGENT,«Mozilla / 5.0 (Windows NT 6.1; Win64; x64) AppleWebKit / 537,36 (KHTML, как Gecko) Chrome / 39.0.2171.62 Safari / 537,36');
curl_setopt($ч, CURLOPT_FILE, $Ф.П.);
curl_setopt($ч, CURLOPT_HEADER, 0);

curl_exec($ч);
curl_close($ч);

fclose($Ф.П.);

$usegravatar = ложь;

$small_image = wp_get_image_editor($root_path_local . $img_name . '-hidpi' . $расширение);
если ( ! is_wp_error( $small_image ) )
{
//проверить это не пустой человек изображение, если так, удалите это
если (md5_file($root_path_local . $img_name . '-hidpi.jpg') == strtolower("686E5C46776BA0E5C488853C1C0B492C"))
{
//Удалить
разорвать связь($root_path_local . $img_name . '-hidpi.jpg');
//попробуй граватар
$ usegravatar = правда;
}
иначе если (md5_file($root_path_local . $img_name . '-hidpi.jpg') == strtolower("6D4083BE95FB32358A5110F5A83B9979"))
{
//Удалить
разорвать связь($root_path_local . $img_name . '-hidpi.jpg');
//попробуй граватар
$ usegravatar = правда;
}
еще
{
//всегда конвертировать в png, потому что некоторые плагины ожидают, что все граватары будут png
$ small_image->спасти($root_path_local . $img_name . '-hidpi.png','Изображение / PNG');
$small_image->изменить размер(40, 40, истинный);
$small_image->set_quality( 10 );
$small_image->спасти($root_path_local . $img_name . '.png','Изображение / PNG');
если($расширение ==".jpg") разъединить($root_path_local . $img_name . '-hidpi.jpg');
}
}
}

}
//проверьте, не является ли электронная почта пустым обычным
иначе если($bgauthemail!=="noemail@intensedebate.com" || $usegravatar == верно)
{
$avatar_from_gravatar = "https://www.gravatar.com/avatar/" . $img_name . "?с = 80&d = 404";
$ч = curl_init($avatar_from_gravatar);
curl_setopt( $ч, CURLOPT_NOBODY, истинный );
curl_setopt( $ч, CURLOPT_RETURNTRANSFER, ложный );
curl_setopt( $ч, CURLOPT_HEADER, ложный );
curl_setopt( $ч, CURLOPT_FOLLOWLOCATION, истинный );
curl_setopt( $ч, CURLOPT_MAXREDIRS, 3 );
curl_exec( $ч );
$Заголовки = curl_getinfo( $ч );
curl_close( $ч );
если($заголовки['HTTP_CODE'] === 200)
{
$ч = curl_init($avatar_from_gravatar);
$Fp = Еореп($root_path_local . $img_name . '-hidpi.png', «Термометр»);
curl_setopt($ч,CURLOPT_USERAGENT,«Mozilla / 5.0 (Windows NT 6.1; Win64; x64) AppleWebKit / 537,36 (KHTML, как Gecko) Chrome / 39.0.2171.62 Safari / 537,36');
curl_setopt($ч, CURLOPT_FILE, $Ф.П.);
curl_setopt($ч, CURLOPT_HEADER, 0);

curl_exec($ч);
curl_close($ч);

fclose($Ф.П.);

$small_image = wp_get_image_editor($root_path_local . $img_name . '-hidpi.png');
если ( ! is_wp_error( $small_image ) )
{
$small_image->изменить размер(40, 40, истинный);
$small_image->спасти($root_path_local . $img_name . '.png');
}
}
}
}
}
add_action('Wp_insert_comment', 'Grab_avatar');






/********************************************\
* Обновить Gravatar кэш в фоновом режиме ежедневно *
\********************************************/
add_action( «Сор», 'Bones_setup_schedule' );
функция bones_setup_schedule() {
если ( ! wp_next_scheduled( 'Bones_daily_event' ) ) {
wp_schedule_event( время(), 'ежедневно', 'Bones_daily_event');
}
}

add_action( 'Bones_daily_event', 'bones_refresh_gravatars' );
функция bones_refresh_gravatars()
{
//получить список граватар как-нибудь
глобальный $ wpdb;
$comment_author_emails = $ wpdb->get_results( "SELECT DISTINCT(comment_author_email) ИЗ " . $wpdb->префикс . "Комментарии" );
для каждого($comment_author_emails как $ ключ => $вал)
{
для каждого($вал в $ а => $б)
{
grab_avatar('','',истинный,$б);
}
}
}

оставьте ответ