大猫の意淫网志

如何获取 Gravatars 头像的路径

Friday, July 30th, 2010

什么是 Gravatar

Gravatar 是 Globally Recognized Avatars (地球人公认的阿凡达)
可以去 http://gravatar.com/ 关联你的 Email 和头像
这样子在任何启用 Gravatar 的博客留言,即可显示对应的头像
例如 i(a)ooxx.me 对应的是 bigCat

Gravatar 是如何构建滴

一个 Gravatar 是服务器动态返回的图片,下面是一坨 src 图片地址

http://www.gravatar.com/avatar/ddb61c44b09ee3e8cb2700249ec9eac7&r=X&s=80

我们来肢解一下

Gravatar 总是以如下URL开头

http://www.gravatar.com/avatar/

接下去是 E-mail 对应的 Hash 结果, 这 E-mail 地址在 hash 之前必须要小写,并且要木有空格

ddb61c44b09ee3e8cb2700249ec9eac7

然后是 rating 分级, 有[ G | PG | R | X ] 4档
(在网站设置头像的时候会让你分级,建议选G)
约X的头像越不和谐,用专业的英语就叫 hardcore sexual
网址里这个分级设置的是容许最极端的那档
例如网址设置容许G,那么只有G的头像会显示
容许PG 会显示 G 和 PG
容许X 会显示 G 和 PG 和 R 和 X

&r=X

最后是 size 图像尺寸 , 有效范围是1到512

&s=80

还有一坨可选的默认头像地址,就是说如果email找不到对应的头像了或者不在分级范围内,就用这张默认图
可选参数为
* '404' (返回 a 404)
* 'mm' (mysteryman)
* 'identicon' (unique, generated image)
* 'monsterid' (unique, generated image)
* 'wavatar' (unique, generated image)
都是些奇形怪状的丑图,建议自定义一张拉轰的(http://ooxx.me/me.jpg)

&d=http%3A%2F%2Fooxx.me%2Fme.jpg

那么在主题里调用 Gravatar 就很简单的用

 <?php
   echo get_avatar(i@ooxx.me,50);
   ?>

这里的邮件地址可以用 get_the_author_meta('user_email') 获取本文作者的email
如果用在评论循环里,可以用 get_comment_author_email() 获取当前循环里的email
记得小写哦 strtolower(get_comment_author_email()) 会自动转为小写
记得MD5哦 md5(strtolower(get_comment_author_email())) 会进行 hash

加起来就是

 <?php
   echo get_avatar(md5(strtolower(get_comment_author_email())),50);
   ?>

会吐出来

<img alt='{$safe_alt}' src='{$out}' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />

不幸的是get_avatar()默认吐img标签
幸运的是如果只要src值,可以这么写

<?php
echo "http://www.gravatar.com/avatar/".md5(strtolower(get_comment_author_email()))."&r=X&s=80";
?>

挨吻老湿就是这么写再结合jQuery 配合 CSS3 搞图片圆角来输出头像滴
点这里看

不用插件实现 WP-PageNavi 功能(进阶版)

Sunday, July 18th, 2010

开始本文之前请先阅读 WordPress 技巧:不用插件实现 Pagenavi 功能

接着是一坨广告:如果有企业要建站,推荐凶器 WP Jam

然后开始正文:

根据先阅读的那篇文章,教偶们如何用 wordpress 自带函数实现 pagenavi 功能
整完后输出的就是12344567的数字了

但还木有实现 pagenavi 的表现,也木有 左边那坨当前页面/总页面指示数
这就是为啥要写这篇文章的原因了

pagenav的缺点:多一个外挂样式表 一个http 请求是非常占速度的,可参考yslow说明书
以插件形式载入,虽然灵活,但以性能为代价

因为水煮鱼已经介绍过了,我直接就说修改的地方了,输出结果可以参考截图

第一步:在 functions.php 的 <?php 和 ?> 之间插入


function ooxx_nav(){
global $wp_query, $wp_rewrite;
$wp_query->query_vars['paged'] > 1 ? $current = $wp_query->query_vars['paged'] : $current = 1;

$pagination = array(
'base' => @add_query_arg('paged','%#%'),
'format' => '',
'total' => $wp_query->max_num_pages,
'current' => $current,
'prev_text' => '&laquo; ',
'next_text' => ' &raquo;'
);

if( $wp_rewrite->using_permalinks() )
$pagination['base'] = user_trailingslashit( trailingslashit( remove_query_arg('s',get_pagenum_link(1) ) ) . 'page/%#%/', 'paged');

if( !empty($wp_query->query_vars['s']) )
$pagination['add_args'] = array('s'=>get_query_var('s'));

echo '<div class="ooxx_nav"><span class="page-numbers pages">Page'.$pagination[current].' of '.$pagination[total].'</span>'.paginate_links($pagination).'</div>';
}

第二步: 在 style.css 里插入


.ooxx_nav{clear:both;margin:5px -2px;overflow:hidden;zoom:1;text-align:center;}
.ooxx_nav .page-numbers:hover{background:#FF3D86;color:#FFF;-moz-box-shadow:1px 1px 1px #DDD;-webkit-box-shadow:1px 1px 1px #DDD;box-shadow:1px 1px 1px #DDD;}
.ooxx_nav .page-numbers,
.ooxx_nav .dots:hover,
.ooxx_nav .pages:hover{-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;background:#FFF;display:inline-block;float:left;height:18px;margin:2px;min-width:28px;_width:28px;padding:1px;}
.ooxx_nav .page-numbers:visited{opacity:0.5;}
.ooxx_nav .current,
.ooxx_nav .current:hover{background:#7BAFA7;color:#FFF;font-weight:bold;-moz-box-shadow:1px 1px 1px #DDD;-webkit-box-shadow:1px 1px 1px #DDD;box-shadow:1px 1px 1px #DDD;}
.ooxx_nav .pages,
.ooxx_nav .pages:hover{color:#CCC;width:120px;}

第三步: 在需要导航的适当位置,例如index.php search.php 里插入


<?php if(function_exists('ooxx_nav')) {ooxx_nav(); } ?>

要直接用的拷贝上头代码直接用即可,听解释的继续看

第一步里 function ooxx_nav() 作用就是新建一个输出页码的函数,名字随便来,当然调用的时候要对上
这里改动不大

1. 基于语义考虑<p />标签改为<div />,当然最好改成<nav />如果你已经createElement的话,哈
2. 调用变量 $pagination 数组里的当前页和总页数组重新合成左侧那坨功能
3. 左箭头和右箭头用字符实体标示一下更规范

第二步里 你可以根据自己的主题修改颜色
box-shadow 为页码数投影
border-radius 为圆角程度
-moz- firefox 私有
-webkit- chrome safari qq浏览器 maxthon 等webkit内核私有
不细说,有需求留言即可

第三步加入 function_exists() 判断 ooxx_nav() 是否存在,要是不存在也没关系
如果不加判断,天会塌下来

--update--

感谢 yun77op 找茬

'base' => @add_query_arg('page','%#%'),
应改为
'base' => @add_query_arg('paged','%#%')

少了个d,非permalinks固定连接的同学会链接失效

Permalink Redirect失效 Headers already sent 错误

Wednesday, May 12th, 2010

描述:
Permalink Redirect 这个插件失效
在浏览器里, [庙(miao) 的和尚们在用户目录会有个error_log]
得到这么个报错信息:

Warning: Cannot modify header information - headers already sent by (output started at...

肢解&&解决方案:
一般来说这都是因为有空格,空行,或其他大便堵在 <?php 之前,或 ?> 之后
wp-config.php里最常见.当然其他文件也会有
你可以对照着报错信息里提到的php文件列表
用你备份的或重新下载的同名文件去覆盖掉一般都会搞定
又或者...let's 一起搞定

不要以为你看见mm没穿衣服,就认为 PHP 看不见了

  1. 下载错误日志里提到的php文件
  2. 用纯文本编辑器打开(例如notepad++ editplus emeditor 等,你懂得)
  3. 检查 <?php 之前
  4. 检查 ?> 之后

删除干净, 别又手一抖留个空白什么的

保存的时候注意文件的编码,如果显示ANSI就由他去,
如果是UTF-8 with BOM,那一定要选择UTF-8 without BOM
有些编辑器会显示成 Unicode ,没有UTF-8 without BOM 就选择 UTF-8吧
BOM会有很多灵异问题..包括firebug看到时候会看到DOM树有空行...
哎呀我x怎么又出来个DOM...自己google去吧

<?php if ( is_home() ) { ?>无效/失效的解决方案

Saturday, December 12th, 2009

wordpress_is_home

<?php if ( is_home() ) { ?>
我只会在首页显示
<?php } ?>

is_home(); 函数在首页的时候会返回一个 true
上面那段代码是常用的只在首页显示
插入任何模板页PHP里都可以,
例如侧边栏 sidebar.php 或页脚 footer.php

但如果它之前有个 query_posts(); 则会让它失效
原因是 is_home is_virgin is_ooxx 这种 is_ 前缀的都是基于主旋律循环来判断,
而 query_posts(); 会让其偏离主循环

解决方案是在 is_home(); 之前加一个 wp_reset_query();

<?php wp_reset_query(); if ( is_home() ) { ?>
我只会在首页显示, 真的!
<?php } ?>

如何在wordpress the_category() 函数生成的分类列表里移除指定分类名链接

Thursday, November 19th, 2009

hack the_category()身为 WordPress 中文团队不活跃团员之一,俺觉得是时候做点啥了

比如出个 hack 介绍如何从
the_category() 函数生成的分类列表里移除指定的几个分类名的链接

做过模板的小盆友都知道,一篇文章可对应多个分类,在循环

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

里,可以用

< ?php the_category( $separator, $parents ); ?>

the_category('*') 输出当前文章的分类,并用菊花符 * 来分隔,比如

分类: < ?php the_category('*'); ?>

会输出

分类:wordpress*hack*category

在内部 Blog 搞皮肤的时候接到一条规则,要求有个分类叫重点的,然后又不要显示出来,仅仅用来作为 query_posts() (非常牛逼的函数,内容太多,有机会另起文章介绍强大的筛选功能) 获取文章的一个筛选条件

辣么,就需要 hack 一下 the_category() 了

很幸运 WordPress 提供了一个 ooxx 函数叫

< ?php add_filter( $tag, $function_to_add, $priority, $accepted_args ); ?>

根据 Smashing Theme 的一篇文章,把如下代码丢到 functions.php 最底部的 ?> 内即可实现

function the_category_filter($thelist,$separator=' ') {
	if(!defined('WP_ADMIN')) {
		//要移除的分类ID,这里是1和5
		$exclude = array(1,5);
		$exclude2 = array();
		foreach($exclude as $c) {
			$exclude2[] = get_cat_name($c);
		}
		$cats = explode($separator,$thelist);
		$newlist = array();
		foreach($cats as $cat) {
			$catname = trim(strip_tags($cat));
			if(!in_array($catname,$exclude2))
				$newlist[] = $cat;
		}
		return implode($separator,$newlist);
	} else {
		return $thelist;
	}
}
add_filter('the_category','the_category_filter', 10, 2);

解题思路就是先获取当前文章对应的分类 ID 数组,explode() 打散,和自定义的那个ID进行对比,如果有就移除,返回过滤后再 implode() 合并后的列表给 the_category() 输出到模板对应的前台页面