外头站着

WordPress 主题: Android 2012

星期二, 5 2 月, 2013

我讨厌魅族的原因:
这货打着简单的旗号,学 iOS 做减法,但把很多有用没用的功能都减掉,扩展也支持不好,
导致简单变成了简陋

我喜欢MIUI的原因:
虽然各种加法,但是收放自如,不该出现的不出现,需要的时候信手拈来

之前做 WordPress 主题 : Android 的时候陷入同样的误区,
做了很多不必要的减法,集成了很多多余的功能

痛定思痛,站在巨人的肩膀上,拒绝重复造轮子

WordPress 主题: Android 2012 是基于 Android Design 的设计,基于官方 Twenty-Twelve 主题功能,保留所有功能的前提下,新增了插件无法方便实现的基础功能

让插件去做插件的事情吧

访问WordPress 主题: Android 下载页

通过SMTP发邮件避免被标记为SPAM

星期四, 22 11 月, 2012

Google 最近丢人不断, 不是日历少了一个月,就是密钥被人破.

补充.. 原来少了一个月的原因是因为要开会

所以我估计 Gmail 突然开始收不到 PHP mail 发的邮件是因为加强了下安全性

为何我的邮件被标记为 Spam 垃圾邮件?

一般同学可能会意识到 WordPress 或自己 PHP mail() 发的邮件,很容易就进了邮箱的 Spam 垃圾邮件分类里,
原因是用PHP mail() 发邮件可随意配置发件人,十有八九确实是垃圾邮件…

解决方案挺简单,那就是配置 SMTP 来发送邮件

SMTP 是什么?

( Simple Mail Transfer Protocol 简单邮件传输协议),好吧我知道你看不懂.

简单的说,PHP mail() 发邮件方式就是直接投递到目标对应的邮局
我们如果用 Gmail 的 SMTP  发邮件,就需要用 Gmail 的账号以及你要发送的东西都告诉 Gmail 的邮局,由 Gmail 帮你投递到目标邮局

这样你的邮件里会带上特殊的标记, 目标邮局可以检测是不是真的来自 Gmail ,从而避免被标记为 Spam

如何改为 SMTP 方式发邮件呢?

WordPress

可以安装 wp smtp 这个插件

然后配置一下, WordPress 以后的邮件都会以这个邮箱的身份发了

具体配置方法,这个插件还提供了Gmail Hotmail 网易 QQ的配置例子,点标题后面的小 icon 查看

 

CodeIgniter

$config = Array(
'protocol' => 'smtp',
'smtp_host' => 'ssl://smtp.googlemail.com',
'smtp_port' => 465,
'smtp_user' => 'mail@ooxx.me',
'smtp_pass' => '***************',
);

$this->load->library('email',$config);

 

安全建议

因为 Codeigniter或其他PHP程序保存 SMTP 密码都是明文形式,

建议专门申请一个发smtp的邮箱
还需要设置smtp邮箱自动转发到自己的主邮箱来避免丢失回复的邮件

WordPress 主题: Android

星期三, 8 8 月, 2012

设计师

直接扒皮 http://developer.android.com/

就不放预览图图了,有兴趣自己点过来

 

小亮点

  1. 自动识别文章内H2并生成侧边索引
  2. 索引和侧边栏滚动固定
  3. AJAX搜索结果提示
  4. AJAX评论集成(动画状态效果喔~)
  5. 评论自动邮件通知被@的同学
  6. 单栏主题模式:后台禁用所有 widget 即可
  7. 快捷键 / 开启搜索
  8. 搜索结果支持上下键
  9. 本地化OpenSans字体,GoogleAPI会被日
  10. 更多请查看 Github Comment History

.

GitHub

https://github.com/damao/Android

所有更改记录都在里头,就不列出来了

 

主题下载

如果要关注更新,请clone 楼上的github
WordPress Android 主题下载

 

download

 

补刀

老的主题全世界无良者联合起来代码丑陋,但设计不错

有兴趣自己玩,木有技术支持

WP Super Cache 安装与设置方法

星期三, 10 11 月, 2010

wordpress 的插件越来越多,速度也越来越慢,咋整?

静态化!

今天主要是把流程 Step by Step 一下,不用理解为啥这么设置, 只需要知道设置后会变的很快

所谓提前优化是万恶之源的意思就是说,之前网站做的越烂,优化的空间就越多
和老板说看,之前多烂多烂,俺给你省了多少多少钱,一般都能拿奖金
静态化也一样,之前一大堆插件,开个页面上百次MYSQL查询,或烂人写的没效率SQL会让人不禁抓栏杆撕床单

WP Super Cache 并不是100%静态化,不过这个不重要,他把最卡的部分搞定了即可

WP Super Cache 他唯一的缺点就是如果你在改主题或搞啥插件,后台设置了前台看不出变化,为毛?下面有解决方案

OK, let’s gou

  1. 首先,永久连接不能使用默认格式
  2. 修改永久链接格式,中文推荐采用 /%post_id%.html (这下你知道我的.orz哪里来了吧)
    如果你和我一样蛋疼愿意为每篇文章写一个英语的post slug
    建议采用这样的格式:/%postname%.html (百分号外面的随意写)


这里我一二三四五六七都标注了就不介绍了吧,常规装插件也是这个套路

那些个神马ftp时代都已经过去鸟过去鸟


装完后激活一下


激活了,但他说还需要去设置一把, Rock it

凡是推荐的都打钩,无脑输出嘛

需要注意的是(miao)的用户不要开Compress pages so they’re served more quickly to visitors. (Recommended)

因为默认已经压缩了,再压缩一次一是可能乱码,而是增加不必要的损耗变得更慢

需要注意的是Don’t cache for known users的意思是对已经登录的用户不缓存

这就解决的后台改主题无法更新的缺点

也就是说,平时的时候这个选项不打钩,当你需要改主题或调试插件什么时候就打他,改完了再去掉

因为我们选择了最快的mod_rewrite 方式,所以继续往下拉,会看到一坨螺旋状大黄色的容器,点里头的update mod_rewrite rules

不出意外会给个绿色的确认,某某.htaccess被插了…

有个激动人心的功能上几个版本才加进来的叫Preload,具体有兴趣可以看我写过的Preload 就不累赘再说一次了

全都搞定后去前台页面,右键查看源代码,拉到最下面,会有三行状态告诉你已经搞定鸟

FAQ:

Q: 我流量那么小,有必要搞这个么?
A: 搞这个纯粹为了自High,和流量没关系,例如打开自己的网站快个两三秒不是一键很爽的事咩?

Q: 那个过期时间我能改咩?
A: 建议用默认的

Preload 模式下更改过期时间,会导致全站文件一遍遍的重新生成,这是完全没必要的
普通模式下更改过期时间,太短或太长都会导致CPU飙升,得不偿失,除非你流量大一个月五六千才有必要

Q: 我发表新日志,或访客留言后他会全站再静态化一次么?
A:不用担心,使用起来和没有装是一样的,有内容更新它会重新生成对应的页面的静态文件,没有更新的就没必要再去重新生成一次

Q: 这个对SEO有没有影响?
A: 有,SEO里爬虫对页面打开速度比较敏感,

常规模式下第一次访问才生成,到期后回收掉,也就是说第一次比较慢
Preload模式先给你都静态了,不管何时访问都快,对SEO更好

Q: 乱码啦乱死人啦~~~

A: 关掉 Compress pages so they’re served more quickly to visitors. (Recommended)

还有啥Q请留言

如何获取 Gravatars 头像的路径

星期五, 30 7 月, 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://bigc.at/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 功能(进阶版)

星期日, 18 7 月, 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 错误

星期三, 12 5 月, 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() ) { ?>无效/失效的解决方案

星期六, 12 12 月, 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() 函数生成的分类列表里移除指定分类名链接

星期四, 19 11 月, 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() 输出到模板对应的前台页面

为何WordPress需要连接信息

星期日, 25 10 月, 2009

连接信息

执行请求操作,连接信息必需提供

这个界面只会出现在系统把apache进程不是以用户身份来运行的主机上
目的只有一个,安全
问题有好几个,这样子用apache创建的文件就不属于用户,那么没有写权限的话,用户就没法删除,只能用apache来删除

遇到这个问题的同学可以看一下这篇
如何删除ftp或ssh无法删除的文件

The following code is from the get_filesystem_method() method in the wp-admin/includes/file.php file:
if( function_exists('getmyuid') && function_exists('fileowner') ){
$temp_file = wp_tempnam();
if ( getmyuid() == fileowner($temp_file) )
$method = 'direct';
unlink($temp_file);
}

wordpress会创建一个临时文件看看owner是不是和当前运行的php比如plugin-install.php一样
如果不一样,那么会出现如图的使用ftp来搞定

怕麻烦的话修改下wp-config.php,加入
// ** FTP SETTINGS FOR AUTO-UPDATE ** //
define('FTP_HOST', 'localhost');
define('FTP_USER', 'ftp帐号');
define('FTP_PASS', 'ftp密码');

之后就不会提示了

PS: 最近后台自动升级连接不到服务器或复制文件出错是因为我那个脚本限制连接数自动屏蔽IP造成的,已经调整过,如果还有问题请联系我,谢谢