無極夜簫 發表於 2023-6-3 00:00:00

详解WordPress中的头像缓存和代理中的缓存更新方法

<p>
wordpress评论中的头像是使用Gravatar的头像服务(Gravatar官方注册地址:http://en.gravatar.com),用户的缓存头像一般都是固定不变的,所以我们可以将头像缓存到本地来提高我们网站的访问速度。<br>
我的wordpress avatar目录的头像缓存:</p>
<p>
<img style="max-width:100%!important;height:auto!important;"title="详解WordPress中的头像缓存和代理中的缓存更新方法" alt="详解WordPress中的头像缓存和代理中的缓存更新方法" src="https://zhuji.jb51.net/uploads/img/202305/4931426e2c3f67c035b16bf09191c36d.jpg"></p>
<p>
<strong>wordpress头像缓存功能设置方法</strong><br>
首先是在根目录下建立一个文件夹avatar,权限755。再在里面放一个默认的头像(default.jpg),没头像的童鞋就会用默认的。代码如下:</p>
<div>
<blockquote>
<ol>
<li>
<span><span>function</span><span> my_avatar( $email, $size = </span><span>'32'</span><span>, $</span><span>default</span><span> = </span><span>''</span><span>, $alt = </span><span>''</span><span>) { </span></span>
</li>
<li>
<span> $f = md5( strtolower( $email ) ); </span>
</li>
<li>
<span> $a = WP_CONTENT_URL . <span>'/avatar/'</span><span>. $f . $size . </span><span>'.png'</span><span>; </span></span>
</li>
<li>
<span> $e = WP_CONTENT_DIR . <span>'/avatar/'</span><span> . $f . $size . </span><span>'.png'</span><span>; </span></span>
</li>
<li>
<span> $d = WP_CONTENT_DIR . <span>'/avatar/'</span><span> . $f . </span><span>'-d.png'</span><span>; </span></span>
</li>
<li>
<span> </span>
</li>
<li>
<span> <span>if</span><span>($</span><span>default</span><span>==</span><span>''</span><span>) </span></span>
</li>
<li>
<span>  $<span>default</span><span> = </span><span>'http://www.wpnoob.cn/avatar/default.jpg'</span><span>; //尺寸需要改为你自己网站评论的默认头像 </span></span>
</li>
<li>
<span>  </span>
</li>
<li>
<span> $t = 2592000; <span>// 缓存有效期30天, 这里单位:秒</span><span> </span></span>
</li>
<li>
<span> <span>if</span><span> ( !is_file($e) || (time() - filemtime($e)) &gt; $t ) { </span></span>
</li>
<li>
<span>  <span>if</span><span> ( !is_file($d) || (time() - filemtime($d)) &gt; $t ) { </span></span>
</li>
<li>
<span>   <span>// 验证是否有头像</span><span> </span></span>
</li>
<li>
<span>   $uri = <span>'http://www.gravatar.com/avatar/'</span><span> . $f . </span><span>'?d=404'</span><span>; </span></span>
</li>
<li>
<span>   $headers = @get_headers($uri); </span>
</li>
<li>
<span>   <span>if</span><span> (!preg_match(</span><span>"|200|"</span><span>, $headers)) { </span></span>
</li>
<li>
<span>    <span>// 没有头像,则新建一个空白文件作为标记</span><span> </span></span>
</li>
<li>
<span>    $handle = fopen($d, <span>'w'</span><span>); </span></span>
</li>
<li>
<span>    fclose($handle); </span>
</li>
<li>
<span> </span>
</li>
<li>
<span>    $a = $<span>default</span><span>; </span></span>
</li>
<li>
<span>   } </span>
</li>
<li>
<span>   <span>else</span><span> { </span></span>
</li>
<li>
<span>    <span>// 有头像且不存在则更新</span><span> </span></span>
</li>
<li>
<span>    $r = get_option(<span>'avatar_rating'</span><span>); </span></span>
</li>
<li>
<span>    $g = <span>'http://www.gravatar.com/avatar/'</span><span>. $f. </span><span>'?s='</span><span>. $size. </span><span>'&amp;r='</span><span> . $r; </span></span>
</li>
<li>
<span>    copy($g, $e); </span>
</li>
<li>
<span>   } </span>
</li>
<li>
<span>  } </span>
</li>
<li>
<span>  <span>else</span><span> { </span></span>
</li>
<li>
<span>   $a = $<span>default</span><span>; </span></span>
</li>
<li>
<span>  } </span>
</li>
<li>
<span> } </span>
</li>
<li>
<span>  </span>
</li>
<li>
<span> $avatar = <span>"&lt;img alt='{$alt}' src='{$a}' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' /&gt;"</span><span>; </span></span>
</li>
<li>
<span> <span>return</span><span> apply_filters(</span><span>'my_avatar'</span><span>, $avatar, $email, $size, $</span><span>default</span><span>, $alt); </span></span>
</li>
<li>
<span>} </span>
</li>
</ol>
</blockquote>
</div>
<p>
再将以上代码添加到你主题的functions.php文件。<br>
将获取头像地址的 get_avatar 函数替换为 my_avatar 。有个例外,functions.php评论列表函数中:</p>
<div>
<div>
<div id="highlighter_902158">
<div>
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td>
<div>
1</div>
</td>
<td>
<div>
<div>
<code>get_avatar( </code><code>$comment</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div id="codetool">
<div>
<textarea></textarea>
</div>
</div>
</div>
<p>
需要改成:</p>
<div>
<div>
<div id="highlighter_887464">
<div>
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td>
<div>
1</div>
</td>
<td>
<div>
<div>
<code>my_avatar( </code><code>$comment</code><code>-&gt;comment_author_email</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div id="codetool">
<div>
<textarea></textarea>
</div>
</div>
</div>
<p>
因为my_avatar函数只能通过Email来调取用户头像,所以以上情况,需要将第一个参数改成email地址。</p>
<p>
get_avatar函数介绍:<br>
用上面的方法简单方便啊。 不过还有一步是要注意的。得要确认在调用头像的地方都是用get_avatar函数来完成的。一般都是了,只有以前老的theme才不是。不是的话改过来就行。</p>
<p>
如改为:</p>
<div>
<div>
<div id="highlighter_967509">
<div>
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td>
<div>
1</div>
<div>
2</div>
<div>
3</div>
</td>
<td>
<div>
<div>
<code>&lt;?php</code>
</div>
<div>
<code> </code><code>echo</code> <code>get_avatar( </code><code>$comment</code><code>-&gt;comment_author_email, </code><code>$size</code> <code>= </code><code>'48'</code><code>, </code><code>$default</code> <code>= get_bloginfo(</code><code>'wpurl'</code><code>) . </code><code>'/avatar/default.jpg'</code> <code>); </code>
</div>
<div>
<code>?&gt;</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div id="codetool">
<div>
<textarea></textarea>
</div>
</div>
</div>
<p>
 </p>
<p>
<strong>代理(squid)中更新css/js文件缓存的方法</strong><br>
在wordpress添加css或者js文件,我们一般使用这四个函数来实现:</p>
<ul>
<li>
 wp_enqueue_script()</li>
<li>
 wp_enqueue_style()</li>
<li>
 wp_register_script()</li>
<li>
 wp_register_style()</li>
</ul>
<p>
函数中你可以定义css/js的版本号,以便我们在对css/js文件更新时能够清楚浏览器的缓存,默认的版本号是wordpress的版本号。版本号会链接在css/js完整路径的后面,一般在版本号变更后,css/js载入的样式的完整URL也会变更,浏览器发现URL变更会重新请求css/js文件,这样就能达到载入最新的css/js文件。</p>
<p>
但是很多代理软件(比如squid)并不支持”?“号形式的cache,我们在使用反向代理来cache我们的网站时,特别在squid3.0以后,已经开始不对带”?”号的url进行缓存了。所以我们如果要使用squid的缓存功能就必须去掉”?”,更新squid代理商的缓存只能通过修改文件名来实现。</p>
<p>
以下我们将介绍在wordpress通过对版本号的控制来修改js/css文件名从而能够在代理软件中达到缓存的目的:<br>
1、在我们的主题代码functions.php文件中添加如下代码:</p>
<div>
<div>
<div id="highlighter_203895">
<div>
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td>
<div>
1</div>
<div>
2</div>
<div>
3</div>
<div>
4</div>
<div>
5</div>
<div>
6</div>
<div>
7</div>
<div>
8</div>
<div>
9</div>
<div>
10</div>
<div>
11</div>
<div>
12</div>
<div>
13</div>
<div>
14</div>
<div>
15</div>
<div>
16</div>
<div>
17</div>
<div>
18</div>
</td>
<td>
<div>
<div>
<code>/** </code>
</div>
<div>
<code> </code><code>* Description: wordpress在代理(squid)中更新css/js文件缓存的方法</code>
</div>
<div>
<code> </code><code>* Author:wordpress教程网</code>
</div>
<div>
<code> </code><code>* Author URI: http://www.wpnoob.cn/</code>
</div>
<div>
<code> </code><code>*/</code>
</div>
<div>
<code>function</code> <code>ds_filename_based_cache_busting( </code><code>$src</code> <code>) {</code>
</div>
<div>
<code> </code><code>// 管理员的后台css/js文件无需处理</code>
</div>
<div>
<code> </code><code>if</code> <code>( is_admin() )</code>
</div>
<div>
<code> </code><code>return</code> <code>$src</code><code>;</code>
</div>
<div>
<code> </code><code>//将版本号添加到文件名中已”.“号来区分</code>
</div>
<div>
<code> </code><code>return</code> <code>preg_replace(</code>
</div>
<div>
<code> </code><code>'/.(js|css)?ver=(.+)$/'</code><code>,</code>
</div>
<div>
<code> </code><code>'.$2.$1'</code><code>,</code>
</div>
<div>
<code> </code><code>$src</code>
</div>
<div>
<code> </code><code>);</code>
</div>
<div>
<code>}</code>
</div>
<div>
<code>add_filter( </code><code>'script_loader_src'</code><code>, </code><code>'ds_filename_based_cache_busting'</code> <code>);</code>
</div>
<div>
<code>add_filter( </code><code>'style_loader_src'</code><code>, </code><code>'ds_filename_based_cache_busting'</code> <code>);</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div id="codetool">
<div>
<textarea></textarea>
</div>
</div>
</div>
<p>
如果你使用的是apache服务器,在你的根目录的.htaccess文件下添加:</p>
<div>
<div>
<div id="highlighter_158596">
<div>
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td>
<div>
1</div>
<div>
2</div>
<div>
3</div>
<div>
4</div>
<div>
5</div>
<div>
6</div>
<div>
7</div>
<div>
8</div>
</td>
<td>
<div>
<div>
<code>&lt;IfModule mod_rewrite.c&gt;</code>
</div>
<div>
<code>   </code><code>RewriteEngine On</code>
</div>
<div>
<code>   </code><code>RewriteBase /</code>
</div>
<div>
<code> </code>
</div>
<div>
<code>   </code><code>RewriteCond %{REQUEST_FILENAME} !-f</code>
</div>
<div>
<code>   </code><code>RewriteCond %{REQUEST_FILENAME} !-d</code>
</div>
<div>
<code>   </code><code>RewriteRule ^(.+).(.+).(js|css)$ $1.$3 </code>
</div>
<div>
<code>&lt;/IfModule&gt;</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div id="codetool">
<div>
<textarea></textarea>
</div>
</div>
</div>
<p>
 <br>
如果你是nginx服务器配置如下:</p>
<div>
<div>
<div id="highlighter_487942">
<div>
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td>
<div>
1</div>
<div>
2</div>
<div>
3</div>
</td>
<td>
<div>
<div>
<code>location ~ ^(.+).(.+).(js|css)$ {</code>
</div>
<div>
<code>  </code><code>alias $1.$3;</code>
</div>
<div>
<code>}</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div id="codetool">
<div>
<textarea></textarea>
</div>
</div>
</div>
<p>
 </p>
頁: [1]
查看完整版本: 详解WordPress中的头像缓存和代理中的缓存更新方法