WordPress头像本地缓存优化

日期: 标签:WordPress教程 64 条留言
如需帮忙改代码,或者WordPress二次开发、PHP网站建设等需求,可联系我购买付费服务:  点此联系我
文章目录

     上一篇文章我们讲了,WordPress中如何判断Email是否有Gravatar头像。对于这个功能,我们可以应用到WordPress国内用户普遍使用的Gravatar头像缓存功能上,避免出现:都是默认头像,但是缓存到本地就出现N多个不同名的文件。

相同内容的资源,合并URL

优化后的缓存代码

function my_avatar( $email = 'aaaaa@aaaaaa.com', $size = '32', $default = '', $alt = '') {
  // 设置$email默认值为一个不存在的aaaaa@aaaaaa.com
  // 防止空的$email导致出错
  $f = md5( strtolower( $email ) );

  // 以下代码将头像缓存到wp-content目录下
  $a = WP_CONTENT_URL . '/avatar/'. $f . $size . '.png';
  $e = WP_CONTENT_DIR . '/avatar/' . $f . $size . '.png';
  $d = WP_CONTENT_DIR . '/avatar/' . $f . '-d.png';

  // 如果要将头像缓存到当前主题目录下,请将上面3行代码改成:
  // $a = get_bloginfo('template_url') . '/avatar/'. $f . $size . '.png';
  // $e = get_template_directory() . '/avatar/' . $f . $size . '.png';
  // $d = get_template_directory() . '/avatar/' . $f . '-d.png';

  if($default=='')
    $default = 'https://www.ludou.org/default.jpg';
  
  $t = 2592000; // 缓存有效期30天, 这里单位:秒
  if ( !is_file($e) || (time() - filemtime($e)) > $t ) {
    if ( !is_file($d) || (time() - filemtime($d)) > $t ) {
      // 验证是否有头像
      $uri = 'http://www.gravatar.com/avatar/' . $f . '?d=404';
      $headers = @get_headers($uri);
      if (!preg_match("|200|", $headers[0])) {
        // 没有头像,则新建一个空白文件作为标记
        $handle = fopen($d, 'w');
        fclose($handle);

        $a = $default;
      }
      else {
        // 有头像且不存在则更新
        $r = get_option('avatar_rating');
        $g = 'http://www.gravatar.com/avatar/'. $f. '?s='. $size. '&r=' . $r;
        copy($g, $e);
      }
    }
    else {
      $a = $default;
    }
  }
  
  $avatar = "<img alt='{$alt}' src='{$a}' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />";
  return apply_filters('my_avatar', $avatar, $email, $size, $default, $alt);
}

使用方法

     1、在wp-content目录下新建一个目录,命名为avatar,权限设为755;如果选择头像缓存到当前主题下,请在当前主题目录下,请在当前主题目录下新建一个目录,命名为avatar,权限设为755;
     2、将以上代码放到当前主题function.php的最后一个 ?> 的前面
     3、以上代码第13行换成你本地的默认头像地址
     4、这里默认头像大小是 32*32,可在以上代码第1行更改
     5、在需要使用Gavatar头像的地方调用 my_avatar 函数即可。一般在主题所有文件中,将 get_avatar 函数替换为 my_avatar 。有个例外,functions.php评论列表函数中:

get_avatar( $comment

需要改成:

my_avatar( $comment->comment_author_email

     因为my_avatar函数只能通过Email来调取用户头像,所以以上情况,需要将第一个参数改成email地址。

-- 完 --

本文采用 「CC BY-NC-SA 4.0」创作共享协议,转载请标注以下信息:
原文出处:露兜博客 https://www.ludou.org/wordpress-gravatar-local-cache.html
露兜
kaapass@outlook.com  QQ 825533758

业余编程爱好者,主业是淘宝店主,卖些工艺品,感兴趣可以到我的淘宝店看看(旺旺不提供技术咨询):西西弗sisyphe

64 条留言

点此留言
1 2 526
  1. maie

    用wp_list_comments()输出评论可以缓存头像么

  2. 萨龙龙

    <?php
    global $wpdb;
    $limit_num = $limit;
    $my_email = "'" . get_bloginfo ('admin_email') . "'";
    $rc_comms = $wpdb->get_results("SELECT ID, post_title, comment_ID, comment_author,comment_author_email,comment_date,comment_content FROM $wpdb->comments LEFT OUTER JOIN $wpdb->posts ON ($wpdb->comments.comment_post_ID = $wpdb->posts.ID) WHERE comment_approved = '1' AND comment_type = '' AND post_password = '' AND comment_author_email != $my_email ORDER BY comment_date_gmt DESC LIMIT $limit_num ");
    $rc_comments = '';
    foreach ($rc_comms as $rc_comm) { $rc_comments .= "<li><section class='recent-comments'><span class='comment-avatar left'>" . get_avatar($rc_comm,$size='32') ."</span><p class='com-content right'><a href='". get_permalink($rc_comm->ID) . "#comment-" . $rc_comm->comment_ID. "' title='在 " . $rc_comm->post_title . " 发表的评论'>".cut_str(strip_tags($rc_comm->comment_content),28)."…</a></p><br/><span class='comment-author left'>".$rc_comm->comment_author."</span><time class='comment-time right'>" .$rc_comm->comment_date."</time></section></li>\n";}
    echo $rc_comments;
    ?>
    您好,我的评论小工具是这样调用头像,把get_avatar换成my_avatar出错了,提示$f = md5( strtolower( $email ) );这行有错,麻烦看看什么原因?

    • 露兜

      @萨龙龙 get_avatar($rc_comm,
      改成
      get_avatar($rc_comm->comment_author_email,

  3. giant888

    已经用上了,谢谢博主分享!

  4. leveyai

    你好,我最近用的一个主题Three,是懿古今的,他的主题functions里面缓存的代码,与博主的是一模一样的,这样安装主题后就不用设置就能使用缓存头像了,但有一个问题,我在使用插件WP User Avatar自定义头像,在评论中却不能显示出来,还是缓存的头像,请问我需要怎么修改,才能使用插件的自定义头像呢?functions里面关于头像的代码如下:
    //avatar头像缓存
    function my_avatar( $email = 'unite@boke123.net', $size = '40', $default = '', $alt = '') {
    $f = md5( strtolower( $email ) );
    $a = get_bloginfo('template_url') . '/avatar/'. $f . $size . '.png';
    $e = get_template_directory() . '/avatar/' . $f . $size . '.png';
    $d = get_template_directory() . '/avatar/' . $f . '-d.png';
    $txdf = get_bloginfo('template_url'). '/avatar/default.jpg';
    if($default=='')
    $default = $txdf;
    $t = 2592000; // 缓存有效期30天, 这里单位:秒
    if ( !is_file($e) || (time() – filemtime($e)) > $t ) {
    if ( !is_file($d) || (time() – filemtime($d)) > $t ) {
    // 验证是否有头像
    $uri = 'http://gravatar.duoshuo.com/avatar/' . $f . '?d=404';
    $headers = @get_headers($uri);
    if (!preg_match("|200|", $headers[0])) {
    // 没有头像,则新建一个空白文件作为标记
    $handle = fopen($d, 'w');
    fclose($handle);
    $a = $default;
    }
    else {
    // 有头像且不存在则更新
    $r = get_option('avatar_rating');
    $g = 'http://gravatar.duoshuo.com/avatar/'. $f. '?s='. $size. '&r=' . $r;
    copy($g, $e);
    }
    }
    else {
    $a = $default;
    }
    }
    $avatar = "<img alt='{$alt}' src='{$a}' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />";
    return apply_filters('my_avatar', $avatar, $email, $size, $default, $alt);
    }
    烦请抽空解答,感谢!

    • 露兜

      @leveyai function my_avatar
      除了什么这个,把my_avatar全部改成wp_avatar

  5. Leveyai

    除了function my_avatar,只有一个my_avatar,改了后还没有反应喔!能帮忙再想想办法吗?真心感谢!

  6. 随之长风

    你好,问下,贵站评论头像过渡效果咋弄的!

  7. 随之长风

    为啥一用这个图片全变成默认图片了!

  8. wordpresshi

    这个方法在wordpress 4.2之后已经不适用了,没有考虑到Retina屏幕下的头像图片缓存<a href="https://wordpresshi.com/wordpress-avatar-local-cache-2016/">Wordpress 4.2 版本之后的头像本地缓存</a>

    • 露兜

      @wordpresshi 不错,可供借鉴

    • 露兜

      @wordpresshi 不过,你为什么不搞个gavatar头像呢

      • wordpresshi

        @露兜 哈哈,目前没有满意头像可选就没头像,你这个优化的不错啊,研究下,增加个2x头像图片缓存就更好了

  9. 番茄薯片

    看起来好复杂,没有看懂啊

1 2

发表留言