0WordPressのローカルキャッシュグラバター

私は私のブログにコメント人々のために示したアバターを持っていたいです. WordPressはネイティブので、これを有効にすると、非常に簡単ですグラバターサービスをサポートしています. 別のドメインからの外部ファイルにアクセスする新しい形で余分な負荷時間の多くを追加します - しかし、それはコストが付属しています DNS 検索, 新しい SSL 作るための接続, 等. グラバターをローカルに保存し、独自のサーバーから提供できたら便利だと思いませんか. まあそれは私が今いくつかの時間のために何をしてきたのです, あなたはどのように知りたい場合, 読む…

場合は、あなたはまだあなたがこれをしたいと思います理由だけで迷っています, 私はさらにいくつかの利点を提供しましょう - 画像はローカルにそれらを提供する前に圧縮することができまし, たとえば、すべての画像が WebP バージョンに変換されます。, そして、WEBPをサポートする任意のブラウザはWEBPのバージョンを取得します. これは、外部のサーバーに接続する必要がないから減少に加えています. ブラウザはそれらをキャッシュするように、ローカルリソースはまた、それらに設定されたキャッシングヘッダを持つことができます. Gravatar は非常に長いキャッシュ時間を提供しません.

私が作成しています 3 カスタム関数, これは私は単に私のテーマののfunctions.phpに入れます. 最初は、ネイティブワードプレスget_avatarのカスタムフィルタであり、(). 呼びかけグラバターとGoogleからの第二グラブアバター, そして第三には、グラバターを更新し、毎日cronジョブを作成します - 場合には、それらは変更されてきました, または、以前は利用できなかったものが現在利用可能になっています.

あなたが気づくように私は「骨」のフレームワークを使用する - あなたはあなたのテーマと互換性を持たせるために工夫を少しを行う必要があります 3rd 私はそれが提供するいくつかのコードを再利用してきた機能. また、作成する必要があります, またはグラバターを保存するパスをカスタマイズ, 私の場合これは、「/ライブラリ/画像/グラバター/」サブパスでテーマフォルダに格納されています

/*********************************************\
* 地元のアバターのみを使用するようにget_avatarフィルター *
\*********************************************/
関数bones_gravatar($アバター, $id_or_email, $サイズ, $デフォルト, $ALT)
{
$root_path = get_template_directory_uri() . '/ライブラリ/画像/グラバター/';
$root_path_local = get_template_directory() . '/ライブラリ/画像/グラバター/';
$gravatar_path = $のroot_path . 'default_avatar';
$gravatar_path_hidpi =「データグラバター-hidpi ="」。$ののroot_path . 「default_avatar-hidpi.png"';

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

$email = '';
もし ( IS_NUMERIC($id_or_email) )
{
$ID = (int型) $id_or_email;
$ユーザー= get_userdata($ザ·);
もし ( $ユーザー ) $メール=します$ user->USER_EMAIL;
}
ELSEIF ( is_object($id_or_email) )
{
// No avatar for pingbacks or trackbacks
$allowed_comment_types = apply_filters( 'get_avatar_comment_types', 配列( 'コメント' ) );
もし ( ! 空の( $id_or_email->comment_typeは ) && ! in_array( $id_or_email->comment_typeは, (配列) $allowed_comment_types ) ) falseを返します;
もし ( !空の($id_or_email->ユーザーID) )
{
$ID = (int型) $id_or_email->ユーザーID;
$ユーザー= get_userdata($ザ·);
もし ( $ユーザー) $メール=します$ user->USER_EMAIL;
}
ELSEIF ( !空の($id_or_email->comment_author_emailは) )
{
$メール= $ id_or_email->comment_author_emailは;
}
}
ほかに
{
$メール= $ id_or_email;
}

もし ( !空の($Eメール) )
{
$email_hash = MD5( strtolower( トリム( $Eメール ) ) );
もし(ファイルが存在しています($root_path_local . $email_hash . '.PNG'))
{
//if we have a local cache then use it
$gravatar_path= $root_path . $email_hash ;
$gravatar_path_hidpi =「データグラバター-hidpi ="」。$ののroot_path . $email_hash . 「-hidpi.png"';
}
}
もし($サイズ >= 47) $アバター= '<IMGクラス="負荷グラバターアバターアバター - 「$サイズ」。写真" 幅="'$サイズ'。" 高さ="'$サイズ'。" SRC ="' . $gravatar_path . 「-hidpi.png" ALT ="gravatar" />';
他の$アバター= '<IMGクラス="負荷グラバターアバターアバター - 「$サイズ」。写真" 幅="'$サイズ'。" 高さ="'$サイズ'。" SRC ="' . $gravatar_path . 」.PNG" ALT ="gravatar" ' . $gravatar_path_hidpi . '/>';

リターン$アバター;
}

ADD_FILTER('get_avatar', 'bones_gravatar', 10, 5);






/***********************\
* グラバターキャッシュを作成します。 *
\***********************/
関数grab_avatar($comment_id,$コメント,$偽=リフレッシュ,$メール=「」)
{
usleep(20);
$root_path = get_template_directory_uri() . '/ライブラリ/画像/グラバター/';
$root_path_local = get_template_directory() . '/ライブラリ/画像/グラバター/';
もし($偽==リフレッシュ) $img_name = MD5( get_comment_author_email($comment_id) );
他の$ img_nameは、MD5を=( $Eメール );
もし(!ファイルが存在しています($root_path_local . $img_name . '.PNG') || $真==リフレッシュ)
{
もし($偽==リフレッシュ) $bgauthemail = get_comment_author_email();
他の$ bgauthemail = $ Eメール;
//try google first
$domain= explode("@",$bgauthemail);
もし($ドメイン[1]=="gmail.com")
{
$CH = curl_init();
ますcurl_setopt($CH, CURLOPT_SSL_VERIFYPEER, 偽);
ますcurl_setopt($CH, CURLOPT_RETURNTRANSFER, true);
ますcurl_setopt($CH, CURLOPT_URL, "https://picasaweb.google.com/data/entry/api/user/" . $bgauthemail . "?ALT = JSON");
$結果= curl_exec($CH);
curl_close($CH);

$OBJ = json_decode($結果,true);
$avatar_from_gmail = $ OBJ['エントリ']["GPhoto $サムネイル"]['$のT'];

$拡張子= strrchr($avatar_from_gmail, '');

$CH = curl_init($avatar_from_gmail);
ますcurl_setopt( $CH, CURLOPT_NOBODY, true );
ますcurl_setopt( $CH, CURLOPT_RETURNTRANSFER, 偽 );
ますcurl_setopt( $CH, CURLOPT_HEADER, 偽 );
ますcurl_setopt( $CH, CURLOPT_FOLLOWLOCATION, true );
ますcurl_setopt( $CH, CURLOPT_MAXREDIRS, 3 );
curl_exec( $CH );
$ヘッダ= curl_getinfo( $CH );
curl_close( $CH );
もし($ヘッダ['HTTP_CODE'] === 200)
{
$CH = curl_init($avatar_from_gmail);
$FP =のfopen($root_path_local . $img_name . '-hidpi' . $拡張, 'WB');
ますcurl_setopt($CH,CURLOPT_USERAGENT,「Mozillaの/ 5.0 (Windows NTの 6.1; Win64の; x64の) AppleWebKit / 537.36 (KHTML, ヤモリのような) クローム/ 39.0.2171.62サファリ/ 537.36');
ますcurl_setopt($CH, CURLOPT_FILE, $FP);
ますcurl_setopt($CH, CURLOPT_HEADER, 0);

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

fcloseを($FP);

$usegravatar =偽;

$small_image = wp_get_image_editor($root_path_local . $img_name . '-hidpi' . $拡張);
もし ( ! is_wp_error( $small_image ) )
{
//それは空白の男のイメージではありません確認してください, もしそうなら, 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;
}
それ以外の場合 (md5_file($root_path_local . $img_name . '-hidpi.jpg') == strtolower("6D4083BE95FB32358A5110F5A83B9979"))
{
//delete
unlink($root_path_local . $img_name . '-hidpi.jpg');
//try gravatar
$usegravatar=true;
}
ほかに
{
//always convert to png because some plugins expect all gravatars to be pngs
$small_image->セーブ($root_path_local . $img_name . '-hidpi.png','画像/ PNG');
$small_image->リサイズ(40, 40, true);
$small_image->set_quality( 10 );
$small_image->セーブ($root_path_local . $img_name . '.PNG','画像/ PNG');
もし($拡張子==".JPG") リンク解除($root_path_local . $img_name . '-hidpi.jpg');
}
}
}

}
//check e-mail isnt a blank generic one
else if($bgauthemail!=="noemail@intensedebate.com" || $usegravatar ==真)
{
$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, 偽 );
ますcurl_setopt( $CH, CURLOPT_HEADER, 偽 );
ますcurl_setopt( $CH, CURLOPT_FOLLOWLOCATION, true );
ますcurl_setopt( $CH, CURLOPT_MAXREDIRS, 3 );
curl_exec( $CH );
$ヘッダ= curl_getinfo( $CH );
curl_close( $CH );
もし($ヘッダ['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, ヤモリのような) クローム/ 39.0.2171.62サファリ/ 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');
もし ( ! is_wp_error( $small_image ) )
{
$small_image->リサイズ(40, 40, true);
$small_image->セーブ($root_path_local . $img_name . '.PNG');
}
}
}
}
}
add_action('wp_insert_comment', 'grab_avatar');






/********************************************\
* 毎日バックグラウンドでグラバターキャッシュを更新 *
\********************************************/
add_action( 'WP', '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()
{
//get list of gravatars somehow
global $wpdb;
$comment_author_emails = $ wpdb->get_results( "DISTINCT SELECT(comment_author_emailは) から " . $wpdb->接頭辞 . "コメント" );
foreachの($$キーとしてcomment_author_emails => $ヴァル)
{
foreachの($valを$として=> $B)
{
grab_avatar('','',true,$B);
}
}
}

返信を残す