这里不是说的的使用缓存插件之类的东西,是关于如何利用wordpress自带的缓存体系。很多时候,比如输出最新评论、相关文章、读者墙等地方,基本是不需要实时更新的,然而每次打开页面就会去数据库里查询一次。用伪静态化当然可以解决这些问题,不过对于流量不大的博客就没必要了。wordpress自带有缓存体系,关键的函数你可以在wp-includes/cache.php或 Codex里查找到所有的函数。

你可以使用下列函数来实现添加缓存。

wp_cache_add($key, $data, $flag = ”, $expire = 0)

相反的,要删除缓存数据可以通过下面的方法实现。

wp_cache_delete($id, $flag = ”)

提取缓存数据:

wp_cache_get($id, $flag = ”)

替换缓存数据:

wp_cache_replace($key, $data, $flag = ”, $expire = 0)

 

举个例子,如果想输出最新评论,可以先从缓存里读取需要输出的HTML,如果没有,请求一次,成功后加入缓存,当然时间可以控制。

我知道有很多最新评论,相关文章免插件输出的方法,原理都一样,可以自行改改,贴个我用的:

<?php

/**
 * get recent comments
 * @param unknown_type $args
 * @return unknown_type
 */
function WinyskyRecentcomments($args='number=5&status=approve'){

	$cacheID = md5($args);
    //有缓存就直接输出
	if($output = wp_cache_get('recentComments_'.$cacheID, 'Winysky')){
		echo $output;
		return;
	}

	//$rcms = get_comments($args);
global $wpdb;

	$my_email = "'" . get_bloginfo ('admin_email') . "'";
//自动获取博主邮箱
$rcms = $wpdb->get_results("
SELECT ID, post_title, comment_ID, comment_author, comment_author_email, 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 10

");

	//print_r($rcms);return;
	if(empty($rcms)){
		_e('没有数据');
		return;
	}
	//历遍数据
	$output = '';
	foreach( $rcms as $rcm ){
			$author = $rcm->comment_author;
			//if($author =='admin'){continue;}
      		$content = WinyskyStriptags( $rcm->comment_content);
		$the_title = get_the_title($rcm->comment_post_ID);
		$s_excerpt = convert_smilies( WinyskySubstr( $content, 200 ) );
		$contents = '<span class=\'recentcommentslink_author\'>' . $author . '</span> <span class=\'recentcommentslink_on\'>on</span> <span class=\'recentcommentslink_title\'>' . $the_title . '</span><div class=\'recentcommentslink_excerpt\'>' . get_avatar($rcm->comment_author_email, 64). $s_excerpt . '</div>';

			$output .=  '<li><div id="C_' . $rcm->comment_ID . '_d" style="display:none">' . $contents . '</div>' . '<a id="C_' . $rcm->comment_ID . '" class="recentcommentslink" href="' . get_permalink($rcm->comment_post_ID) . '#comment-' . $rcm->comment_ID . '" >' . get_avatar($rcm->comment_author_email, 32) . '</a></li>';

	}
	//输出后加入缓存
	wp_cache_add('recentComments_'.$cacheID. $output, 'Winysky');
	echo $output;
}

ps:顺便show下独特的最新评论样式,左侧的头像鼠标移上去看看,:-D

经常折腾wordpress主题的朋友可能会遇到以下问题:

是否曾经保存完一个修改,然后又想把个文件恢复到修改以前的状态?

是否曾经希望能够看到一个文件以前某个时间点的状态?

是否想看看一个或多个文件有什么区别?

是否曾经发现了一个 BUG,然后想调查它是什么时候产生的?

如果上面有一个问题答案是肯定的,那么你可以使用版本控制来解决。即“透过文档控制(documentation control), 能记录任何工程专案内各个模组的改动历程,并为每次改动编上序号。”

我的理解:省去每次修改-复制-备份的手动操作(增量备份),另外附带一键还原功能

尤其对于我这种纯属业余的来说 ,一来技术是不行的,只好经常copy代码测试,不满意想回滚到以前的版本是常事儿;二来,时间也不是连续的,只在没事的时候改改,常常忘了改了哪些地方,与服务器上面的版本有哪些差别。此外,还是需要经常备份一下,防止哪天脑残修改出了一大堆的错误回溯不了。

选好工具无疑会大大节约时间,曾经见过专业的程序员写代码提及SVN这个东西,网上下载时也看到过google code这个地方提供开源代码存放,今日搜索了一下相关的东西,也就是版本控制相关知识,觉得挺不错的,放在这里分享一下。

首先推荐的是:Subversion/Google code 项目托管(服务端)+TortoiseSVN(客户端)+Notepad++/Eclipse(开发工具)的组合

先介绍下背景,不想看长文的请无视,直接看底部

Subversion是什么?
Subversion是一个自由/开源的版本控制系统。也就是说,在Subversion管理下,文件和目录可以超越时空。也就是Subversion允许你数据恢复到早期版本,或者是检查数据修改的历史。正因为如此,许多人将版本控制系统当作一种神奇的“时间机器”。

Google code Project hosting(项目托管)
相信大家很多都熟悉在wordpress主题中引入Google提供的JQuery库,作为其中一部分,Google Code里提供Project Hosting。通过这项新服务,用户可以搜索各种开源项目,也可以自己上传新项目。但前提是用户必须拥有一个Gmail帐号。你可以把 Project Hosting看作是一个开源代码库。当然,最重要的就是版本控制功能。

TortoiseSVN
针对 Windows 平台的 Subversion 客户端,通过与系统资源管理器结合,提供可视化的svn管理。TortoiseSVN 是 Subversion 版本控制系统的一个免费开源客户端,可以超越时间的管理文件和目录。文件保存在中央版本库,除了能记住文件和目录的每次修改以外,版本库非常像普通的文件服务器。你可以将文件恢复到过去的版本,并且可以通过检查历史知道数据做了哪些修改,谁做的修改。

Notepad++/Eclipse
这个就不用介绍了,我们是业余爱好者,也许用不到EclipsePHP,但是你总不可能用记事本编辑主题吧?尤其是需要高亮代码和UTF-8支持,我推荐这个轻量级的文本编辑器(台湾出品,虽然作者好像有点政治倾向),折腾wordpress够用了。当然,其它的编辑器也可以,我只是熟悉这个,然后刚好有一个插件用来实现svn的管理,后面再说。

下面说说具体实施的方法:
建立一个项目库,记录每次文件变化。用Notepad++等编辑器修改文件后提交给管理库记录,每次修改后都会自动记录版本变化;需要比较、修改时可从服务端还原。理论上可以无限还原,对于多个用户,可以保存每个用户的提交而不会相互影响。

解决方案:

(一)使用Google code作为SVN
优点:无需服务端,移动平台
缺点:大小50M,必须开源(注意),不开源据说30天会被删除
简单的教程转引网友写的:(原文http://www.cnblogs.com/shiyangxt/archive/2008/10/06/1304756.html)
1. 进入http://code.google.com/ 用Google帐户登录(推荐使用gmail邮箱)。然后点击>Project Hosting
2. 进入>> http://code.google.com/hosting/ 然后点击>Create a new project
3. 填入信息:
写入项目名,描述,两个选择项(不太明白啥意思)选第一个就好使,写入标签,点击确定。就可以了
4. 提交成功后,选择菜单的Source(其中有https上传协议路径需要拷贝一份,还有一个上传密码)。
5. 打开MyEclipse,打开需要上传的项目,点鼠标右键->team->share Project->svn,写入https路径,下一步,输入Google账号和上传密码,起个名,finish。(当然,不用Eclipse的同学就用TortoiseSVN就行了)

6.如果一切顺利,会自动生成一个项目目录,可以查看所有项目文件。然后进入搭建项目界面,点鼠标右键->team->commit。然后开始上传项目。

7.完了,搭建完成。

8.如果想查看自己的项目,可以用浏览器登陆https的路径,输入Google账号和上传密码,如果成功就可以看到含有项目名称的目录。

(客户端请看下面使用TortoiseSVN,以后部分相同)

(二)本地搭建服务器
优点:本地保存版本库,私密,可以供团队合作(当然google的也是可以的,开源而已)
缺点:配置稍微复杂点,需要额外开启一个系统服务,不过我还是尝试了下这个,有时上网不太方便
下面部分转自:http://blog.waterlin.org/articles/create-local-svn-server.html选用时有更改

1) 搭建一个subversion服务器

在Windows下,推荐使用VisualSVN。这个发行版本的安装最简单了,包含了所有我们需要的模块,如subversion,Apache以及一个控制终端。安装很简单,一步一步安装完成即可。

下载VisualSvn:http://www.visualsvn.com/server/download/     当然也有中文语言包

2) 安装一个svbversion的客户端

在Windows下推荐用TortoiseSVN,我不觉得在命令行下一行一行地敲svn命令是一件很开心的事~~

下载TortoiseSvn:http://tortoisesvn.net/downloads

安装后会重启,没有界面,集成到资源管理器中,右键点击文件可见菜单。

3) 管理你的内容

第一步,在VisualSVN里(管理工具里),创建一个代码Repositories,比如说,我现在要写一个wordpress的主题,创建一个名叫 wordpress的Repositories(就相当于数据库),设置好相关的属性后(基本就地址,用户和权限,本地的话随便给个用户名,注意是否采用ssl)

第二步,用TortoiseSVN来check out这个Repositories。在合适的地方,如本地搭建的wordpress环境的theme文件夹下建立一个新的文件夹,如mytheme,右键SVN检出(Check Out)。Check Out的地址就是VisualSVN在Repositories属性里提供给你的URL地址,类似于:

https://WWW-81ECC445A0F:443/svn/wordpress/

当然,你可以把计算机名换成localhost,即修改成如下地址:(443是前是你的计算机名)

https://localhost:443/svn/wordpress/

第三步:在这个新建立文件夹里编辑你的主题,每次结束后,在这个文件夹里右键点击SVN提交,即表示你提交这个版本给服务端,以后你随时都可以回滚到这个版本。你可以看见,每次修改了文件,文件图标都是不一样的。绿勾代表无更改,红叹号表示修改过的文件很方便吧~

第四步,如果你喜欢用eclipse的话,用Subclipse我用Notepad++,作为svbversion的客户端也不错。用这个Notepad++插件,Subversion Plugin 就一个dll,去下载后解压到Notepad++安装文件夹下面的plugin里面,重启就可以看见,如图:


在编辑时候就直接可以提交更改和还原了,(前提,必须先按第三步配置好TortoiseSVN),菜单分别对应提交当前文件,提交所有打开的文件,更新文件,更新所有,还原文件,还原所有。

就这样,你在本地能清楚地看到你这次修改了哪些文件,只要把这些文件上传到服务器即可。这下就不用每次抓狂地回忆究竟修改了哪个文件!

总结:我之所以推荐这个,是因为这个方法几乎可以用到任何文档修改的地方,作为版本控制。当你毕业写毕业论文,工作撰写报告,平时需要经常更改文件,SVN都是有用的。当然,word2003有个保存为版本的功能,不过2007以后都给移除整合到sharepoint里,这里不再赘述。

以上只是刚接触SVN不久的我的一点收集,如有错误还请熟悉的朋友指正。

PS:本来Dropbox也有版本控制的功能,哎,可惜~~大家都懂的

接上文:jQuery+Ajax在wordpress中的应用(二)

其实,copy代码并不难,能够理解学习对于业余爱好者已经不错,至于应用和创新那得下很多功夫学习基础。我也是停留在复制/粘贴的水平上,折腾折腾还是要考虑量力而行的。

(四)Ajax站点搜索和Ajax comment paper(这部分尚未搞明白,待补充)
除了使用google的Ajax站点搜索外,也可以在wordpress中实现Ajax实时搜索。
评论分页插件也是有现成的,当然它不依赖任何 JavaScript 框架。但我的既然用了JQuery框架,那也不要浪费了,可以改写用JQuery实现。
一些主题里已经内置了以上功能,如philna2里,这个我暂时没用上(因为小站来的人少,没需求,囧),所以还没来得及折腾,有兴趣去看看源码。

(五)wordpress全站ajax化(JQuery插件)
首先声明这样做完全不会影响SEO 。
当然,也有全站Ajax话的插件,不过我觉得了解一下原理有利于使用。
基本思路:利用jQuery来简单实现WordPress的全Ajax加载。做法是因为每次打开文章只需要SINGLE部分,打开首页面之类只需要INDEX部分,所以 HEADER,SIDEBAR,FOOT就加载一次就行了。ll9给出的方法是这里这里,另外,作者还解决了Ajax浏览器前进、后退历史的问题。额,还有一个JQuery插件,方便使用,可以去作者博客下载。使用方法:

jQuery("p.date a,li.tag_list a,p#pagination a").ajax_19("div#main_container");

这里的作用是将所有class是date的p元素、class是tag_list的li元素、id是pagination的p元素下的链接点击的时候得到这个链接的内容后显示在ID为main_container的div里,而不会去打开此链接。这样既不影响SEO又实现了AJAX。

(六)Ajax随机一句话功能(demo参加yinheli的主题,右上角)

代码是借鉴的wordpress自带的一个插件Hello Dolly.它能在后台随机显示一句话.但是不支持Ajax.我们要做的是把他弄到前台显示.并实现Ajax刷新的效果。教程《Ajax之jQuery》,我的上一个主题,以及现在这个主题左侧栏部分就是这个。当然,为了SEO,你可以把它改用js输出。

(七)Ajax调用音乐播放器

想来大家也很讨厌在博客里突然响起的音乐,毕竟个人口味不一样嘛。如果站长想要是加入播放器,是可以不让其自动播放,但多载入一个没有用处的flash也会拖慢站点速度。这样的情况可以用Ajax载入,访客点击的时候才载入播放器。一个示例如下:

$(".music_open").click(function() {//点击元素的id或class
jQuery.ajax({
   url: "http://pic.winysky.com/content/themes/winy/music.php",//url music.php包含播放器代码,如flash
   data:"url=http://pic.winysky.com/content/themes/winy/",
   dataType:"html",
   type:"post",
   success: function(msg){
   jQuery("#music").html(msg);//事先在html中准备的空div的id,插入位置
       $(".music_open").css('display','none');//按钮样式
    $(".music_close").css('display','inline');

   jQuery("#music").show();
   }
});
return;
});
$(".music_close").click(function() {//关闭播放器
     $(".music_close").hide();
    $(".music_open").show();
jQuery("#music").empty().hide();
return;
});
}); //end

(八)其它待折腾的。。。

ihiro:Ajax加载历史文章列表:Ajax加载相关最新10条文章记录,分类Ajax 加载相关最新10条文章记录,标签Ajax加载相关最新10条文章记录,效果见其博客。虽然没给出方法,但实现起来并不难,有时间再试试吧。

可以看出,这一大类jQuery+Ajax基本思路都是差不多的,wordpress也提供了一个很好的平台。很多hook函数,虽然降低了效率,但方便调用。

写在最后:如果不愿意自己折腾,看看水煮鱼写的30多个 AJAX 驱动的 WordPress 插件应该足够齐全了。

我是比较喜欢折腾的过程,各位朋友有同好的可以和我交流。

这是一篇分享的文章,很多方法都是在网上收集而来的。Ajax主要是用来提高用户体验,我最开始折腾其实只为了更快的载入站点,毕竟国外虚拟主机速度慢。不过,好的主机才是提速的关键。以下部分是自己折腾wordpress过程中学习和用过的的一些jQuery+Ajax技巧,整理一下收录在这里。

事先声明,使用以下方法需要一定的php和jQuery基础,如果有一颗不怕麻烦,爱好折腾的心也是可以的(比如我,自我满足下)。当然,必须的jQuery库是应该提前加载的,可以用google托管的,也可以放自己站点上。

(一)使用最多的Ajax评论
首先,你可以使用插件,以“Ajax comment”为关键词在官方插件目录里查找就有。我这里介绍两种非插件实现的方法:
1. wilin大师的《WordPress 內置嵌套評論專用 Ajax comments》这个提供了详细的教程,在wordpress博主中也是用的最多的,使用方法简单,另外可以配上《Ajax comments 評論回應郵件通知》一起使用。
网上还有类似的代码,实现的方法基本上是利用JQuery的ajax过程提交,修改根目录下的“wp-comments-post.php”文件,将类似“wp_die”替换为自定义的响应函数,实现无刷新评论。
2. JQuery Form插件
这个直接就是用jQuery插件超级简单实现WordPress的ajax留言,无需另外在写一个ajax comment.php文件。(题外话,这个js压缩了10kb左右)
jQueryForm:http://www.malsup.com/jquery/form/
简单的例子,首先html部分是wp默认的留言表单,下面加入以下js:

$('#commentform #submit').click(function() {
   $('#commentform').ajaxForm(function() {
   	success: function(result) {
    alert("Thank you for your comment!");
	},
	error : function(result) {
	alert(result.responseText);
	}
    });
}

这个插件可以截获wordpress表单提交后的相应,SUBMIT的时候便会根据你FORM中的ACTION和METHOD来自动完成AJAX的操作,SUCCESS是提交成功后要做的,ERROR则 是发生错误返回的错误页面,result.responseText得到错误信息(WP中的WP_DIE())。当然,你还需要在html中加入合适的部分,例如commentform提交时显示一个DIV提示“等待”或者“留言成功”以及“提交错误”,留言成功后便会在适当位 置把留言的内容输出出来。这里有ll19提供的《jQuery简单实现WordPress的Ajax留言 》教程,已经很详细了,有兴趣的可以去看看。

另外,wilin大师的还有一个单一文件(js)的 Ajax comments,beta 版的 mini-ajax-comm.js 。遗憾就是使用 jQ 1.3 新的 live 语法, IE 下不能使用。

(二)Ajax分页导航

实现Wordpress首页分页部分的Ajax分页效果,本站也用了这个效果。简单说来就是点击下一页时只请求了页面部分区域的更新,一次客户端载入的数据更少,来源于yinheli的《我做的插件: Ajax home page》。其实,说是插件,也不是那么简单的,不折腾是很难成功滴。作者代码写的不错,就是教程对初学者很难看懂。我在这里干脆提取出来,直接集成到主题里,简单注释一下:

首先,载入以下js:

$(document).ready(function() {
home_page_ajax();//下面定义的函数
home_js();//这里是以前首页需要加载的js,放一起做个函数
});
function home_page_ajax(){
$(".wp-pagenavi a").click(function(){//默认你用了wp-pagenavi插件,其它自己修改
    var paurl;
 paurl=$(this).attr('href');
 $.ajax({
 url:paurl,
 data:"action=ajax_page",
 dataType:'html',
 type: 'POST',
 beforeSend: function(){
 var loading='<span id="aploading">Loading</span>';
 document.body.style.cursor = 'wait';
 $("#navigation").html(loading);//注意修改导航id
 var C=0.7;
//$('#ajax').css({opacity:C,MozOpacity:C,KhtmlOpacity:C,filter:'alpha(opacity=' + C * 100 + ')'});//IE下透明会很难看,自己可以试试
},
 error: function(request) {
 //alert(request.responseText);
alert('Error,I\'m sorry.you have to click the refresh button!');
},
success:function(data){
 $("#ajax").html(data);//#ajax是内容部分父元素的id,注意修改,重要!
var C=1;
//$("#ajax").css({opacity:C,MozOpacity:C,KhtmlOpacity:C,filter:'alpha(opacity=' + C * 100 + ')'});//IE下透明会很难看,自己可以试试
document.body.style.cursor = 'auto';
home_page_ajax();//重新写上锚点
home_js();//js的重载,注意
$("#return_top").click();//返回顶部,自己修改

}
 });
 //run other js function;
 return false;
 });
}

然后,关键是还要修改主题:“确保你的内容(文章列表)的父级ID包含了分页导航,如果不是,你需要修改…(这个就是说你的首页文章列表和分页导航,因该一个DIV里面.这要Ajax 返回的数据才方便插入.)”好吧,引号内是原作者的话,这样估计很多新手看不懂。

第一步:在主题header.php最后加上"<div id="ajax">"在sidebar.php(或者footer,取决于主题加载顺序)顶部加上"</div>",这样把需要ajax加载的部分包括起来。(注意,其它页面也许不需要ajax效果,这个多余的div自己想办法解决)

第二步:确认主题Index.php有如下结构:

< ? php if($_POST['action'] !='ajax_page')get_header();?>;//截获ajax传入参数
...//原index内容部分
...//原index分页部分
< ? php if($_POST['action'] !='ajax_page')  {get_sidebar();get_footer(); }?>//截获ajax传入参数

最后,css部分就自己改好了,也就是一个ajax过程分页导航动画效果。

可以看出思路还是挺简单的。以上要注意的就是注释部分,元素id还有javascript的重载,避免ajax后原来的锚点丢失(页面特效没了)。另外,"if($_POST['action']"可能会在某些php版本上notice,问题不大,function.php中加入“error_reporting(E_ALL & ~E_NOTICE );”忽略即可。

(三)Ajax首页动态显示效果(仿Mg12)

你可以看到著名的inove主题作者mg12新首页,前三篇文章输出全文,后面只显示标题,点击右侧三角才会动态载入内容。这个可以减小首页大小,尤其是视屏和图片比较多的站点,也是提高访客体验的一直。(当然,坏处也是明显的,对SEO可能有影响,mg12也提到了一种“欺骗”搜索引擎的方法来避免)

可以参加mg12的《动态加载文章内容》一文(不完全的教程),或者使用inove的同学可以看这个《如何对WP实现动态加载文章内容》(更加详细),基本上按照教程就可以了,在这里我只简单说一下自己的理解:

基本思路是不输出内容(去掉),点击后通过js输出。但我觉得不必要全部用js输出,对seo不好。以前是这样的:

var PRE_LOAD = 2;//定义展开几篇文章
(function(){jQuery(document).ready(function(){
jQuery('div.post').each(function(){
var id=jQuery(this).attr('id');
if(/^post\-[0-9]+$/.test(id)){
var toggle=jQuery('');
toggle.toggle(function(){if(jQuery('#'+id+' .content').text()==''){loadPost(id)}
jQuery('#'+id+' .content').slideDown();jQuery(this).removeClass('collapse').addClass('expand')},function(){jQuery('#'+id+' .content').slideUp();
jQuery(this).removeClass('expand').addClass('collapse')}).prependTo(jQuery('#'+id+' h1'))}});
if(PRE_LOAD>0){jQuery('div.post a.toggle').each(function(index){if(indexLoading...')},
success:function(data){loadPostContent(id,data)},
error:function(data){loadPostContent(id,'Oops, failed to load data. [Reload]')}})}
function loadPostContent(id,data){jQuery('#'+id+' .content').html(data)}window['POS']={};window['POS']['loadPost']=loadPost})();


上面的例子里用了PRE_LOAD这个变量来定义开始展开几篇文章,但这样是等页面载入后再加载的,我的办法是去掉PRE_LOAD参数,前三篇可以用php输出

例如:

< ? php if (have_posts()) : $count=1; while (have_posts()) : the_post(); ?>
...
< ? php if(is_bot()) : the_content(); ?>//is_bot是自定义的函数,如果是搜索引擎输出全文
< ? php elseif($count ==1 ||$count ==2||$count ==3) :the_excerpt(); ?>//前三篇输出摘要
< ? php endif;$count++;?>
...
< ? php endwhile; ?>< ? php endif; ?>


这样就不用像原来一样页面加载后才输出前三篇内容,另外,附上我修改的响应部分

<?php
/**
 * Winysky ajax index
 * @return unknown_type
 */
function Winy_post(){
 if( isset($_GET['action'])&& $_GET['action'] == 'load_post'){
 $ariticle_id=$_GET['id'];
 query_posts("p=$ariticle_id");
 the_post();
 the_excerpt();
 die();
 }else{
 return;
 }
}
add_action('init', 'Winy_post');

直接hook到init上,方便调用,不清楚效率怎么样。

另外前面说了,需要一个“欺骗SEO”的判断函数,即根据user_agent判断来路,如果是bot返回true,正常输出全文。这个判断函数网上有很多例子,就不再细说了。

太长了,还有一部分,分两篇写,:-),

下一篇:jQuery+Ajax在wordpress中的应用(二)

五一期间折腾新主题,现在先测试一下。不是原创的设计,我不熟悉css和XHTML,略懂略懂。数数看来已经模仿了至少三个主题了,css都是扒皮的,主题自己写的,但都加入了我自己的特点。
一开始用的是inove,后来换了其它的。换来换去都觉得不是很满意,打算学学做一个自己的主题。可惜我开始没选择从简单的开始,过分追求功能了,走了许多弯路。比如K2主题,是够强大的,一开始没有注释感觉很难看懂。不过后来认识了philna2, 认真研究了它的代码,学习了很多;至于css对于我来说确实比较麻烦,主要是对设计美学没有感觉,先模仿下别人的。
另外页面用了大量的jQuery效果,也是互联网上逐渐收集的,感谢无私分享的朋友!
当然,模仿只是第一步,以后再慢慢完善。系统学习还不够,嗯。。。以后估计也很忙,没时间再折腾了。
我向来喜欢简约不简单的东西,wordpress主题也是,比起其他主题也许是很简陋,但功能还是少不了的。可能也有很多bug,如果有朋友指正最好不过~O(∩_∩)O~

最近新折腾主题,遇到一个问题很是费解:wordpress提交评论后白屏,无php错误记录。
问题是在引入ajax回复时发现的,本来打算加入willin新更新的Ajax comments ,但是加入后提交评论出错。具体错误是提示:

t.I('comment_post_ID').value=null

同时提示“无效的评论状态”(Invalid comment status.)
以前也引入过willin的代码,都没啥问题,这次很奇怪。因为自己折腾的主题代码不规范,以为是某些id,class不对应导致。懒得重新改模板,又试了下jQuery的ajaxform插件,新方法更简单,(一个详细的教程:这里),demo试了下果然方便好用。但是集成后点击submit按钮,用firebug察看ajax post传入参数正确,也,确实执行了succsess后的代码,可是就是没有输出评论内容,很是奇怪。
去掉所有的ajax代码,试试提交评论,居然是白屏,看来测试的时候没有注意啊。
问题看来是主题的关系,先找找原因:
察看wp-comments-post.php(willin的comments-ajax.php也差不多),发现20行

$comment_post_ID = isset($_POST['comment_post_ID']) ? (int) $_POST['comment_post_ID'] : 0;

有comment_post_ID参数,但我的ajax过程却没有这个参数post。折腾了好久,通过比较,终于找到了一个可疑的地方,就是

官方对它的解释如下:

Generates two hidden inputs for the comment form to identify the comment_post_ID and comment_parent for threaded comments. This tag must be within the section of comments.php. New since WordPress version 2.7.

就是这里了,2.7以下的主题是没有的,(同时也不支持原生嵌套回复)自己折腾的时候没注意这个,加上后问题解决。
具体解决办法:
找到主题comments.php里面的表单commentform,在</form>之前加上<php? comment_id_fields;?>

以上是本人业余爱好折腾,难免描述不准确;只是一些主题教程大多没注意这些小的地方,希望能给出现类似问题的wp博主一点提示。

好吧,新年博客也换个新主题,新气象未必有,新主题还是可以的。过年额,没啥说的,春晚不想看,上来更新下博客。
折腾了好久的主题,依然不是原创,因为没有从头开始学过。不是我喜欢的,都懒得动弹⊙﹏⊙b汗,再说时间也不够~
但是学习wordpress也花了我很多时间,一直想找一个比较好点的主题,别人做的呢拿来总是要改改的,尤其看见wp博友分享一些很炫的技术,心里总是痒痒的。我就是一个典型的CP党(copy & paste);js,插件,技术文,css效果,能拿来就照搬过来,当然这过程中还是学习了一些东西。当然,我还是比较重视版权的,凡是引用的,尽量保留出处,尊重原作者,呵呵~
这个主题颇费了一些心思,之前我完全不懂php、css、java(到现在也谈不上入门)不过我觉得这些其实初学都不难。起初我没看过教程,完全就照着别人的代码,一边google一边费时间一点点尝试。只要认真比较,不难发现其中的规律性。css可以google,java拿来改改,php还能看懂大多数函数(不会写,读懂还是可以的,O(∩_∩)O~数据结构没白学)。最近对JQuery和AJAX比较感兴趣,搜遍了wordpress主题,就冲着这两方面的。GUI倒是觉得越简单的越好,但功能却不含糊,小而强大!上网不方便,就找找本地架设wamp调试,改代码用notepad++,效率提高不少。
言归正传,主题基于 PocketT. (界面,更改了一些,不到30%源代码可不敢去掉作者链接)and PhilNa2.(个人函数,拿来主义,O(∩_∩)O~感谢原作者),主题后台移植了PhilNa2的设置项,广告部分也留着(两次AdSense都没过,罢了),也集成了一些插件功能。

主题特性:
1.ajax头部随机一句话--点击换一句,访客欢迎词,头部图像随机切换(From PhilNa2)。头部每次访问都不一样,没事放点图片上去,一些短句,是心情的写照么?算是吧~个人博客有点个性也不错。访客欢迎能判断访客来源,来显示不同欢迎词。如果经常来没有留言,就会提醒访客留言;如果是已评论过的朋友,会显示最新评论;如果是老掉牙的IE浏览器,会推送firefox和chrome链接,提示更新。(算是体会到了IE的麻烦。兼容性真差,自己几个系列6,7,8显示的效果都不一样)
2.JQuery实现的的ajax首页百叶窗折叠效果,以前是全部输出后隐藏,现在是真正的ajax效果,也就是你点击标题才会去取得内容摘要。(类似 mg12首页效果)。我知道有人会说这个对SEO不利。但我也有判断is_bot函数,对应搜索引擎来访输出全文,看google快照抓取的和实际看到的应该是不同的。不过可能还是有影响的,因为这其实是作弊吧(展示内容同访客不一样。可能会被惩罚)。不过也没人真正试过,我也不在乎啦。
3.主题style切换,白天、晚上不一样,随时间变化,晚上就黑色主题节能吧!当然,访客也可以自己切换,在目录那里,切换有效果(from jinwen)。自然也会根据cookie记录状态,访客刷新还是上次的选择。
4.集成了一些功能,所以无需插件,我也觉得不用插件就能解决很多问题。插件其实也是一些函数,常用的主题集成就好了
  >>pagenavi,SEO功能(关键词,描述等无需插件)
  >>willin“小墙”(这是bot陷阱,替代反垃圾的插件),ajax评论,邮件通知(尚未完成测试中)
  >> 最新评论,相关评论,彩色标签,搜索高亮关键词,站点通告
  >>utf-8自动截断(from wp-utf8-excerpt插件,集成到后台中),首页300字,文章页150字,保留html标签
  >>feed插入相关文章和版权声明
5.其它从各个地方收集来的功能。。。
尚未完成功能:
评论部分,打算采用隐藏已评访客信息、以30天评论次数替换之,输入邮箱即时显示用户头像,一些css调整

先就这样吧,新年快乐!

想自己整个wordpress模板,但css不会,php不会,原来设计过的网站也是模仿来的。基础不行,打算先从最简单的模板开始模仿。sandbox应该算是最基本的了,看了一下,太晕,可惜现在也没时间折腾了,等有机会再说。现在先抽空改个纯css的模板,加上在别的站点上“偷学”过来的jQuery效果,试试看看。不过,没基础真实麻烦,看着css就头大,php代码我还能看懂一些,css真不好办。比如:

margin: 0
padding: 20px 0 0

就没弄清楚,幸好我有工具,firefox加上chrome,一个firebug+谷歌浏览器的元素审查工具,还算是比较方便的,可以看看别人的style是怎么写的,于是就折腾出来了现在这个样子。照理应该是先设计好效果图的,不过话说回来,也不对自己的审美有什么期望,。。。。

目前打算集成的功能,原生ajax嵌套回复,邮件通知,防垃圾的“小墙”(都是willin那里学过来的),自己改写的头像缓存,一些jQuery改善用户体验的效果,邮件表单,集成的最近评论和随机文章,读者墙......胃口倒是很大,不过反正都是”拿来主义“,顺便学习一下。有好多功能插件也是很容易实现的,不过我也不喜欢插件,还是不用吧。另外,自己折腾感觉还是不一样的。

Ps:最近试了一款统计插件simple-stats-widget,效果跟clicki差不多,显示来访的地址和浏览器,也是个好玩的东西。效果如图:
screenshot-1
这个好处就是数据保存在本地,速度很快,clicki就是载入速度太慢,”坏处“也很明显,用的是纯真的数据库,有时候太详细了,可以精确到XX大学XX宿舍XX房间,也不一定准确吧。还有一个缺陷,会撑大主题,导致页面变形,再研究研究。

最后,用了这个插件真的有意外收获:还真有人用扫描器探查我的网站,猜测也许是扫描主机IP?本来就是合租的主机,不知道上面放了啥。不过,我这是PHP的站点呃,干啥没事找一些asp网站的后台登陆,想试试asp漏洞?看IP是山西太原电信的,先看看apache记录去,封了他Y的。想来也好笑,几年前我也干过这事,tool kid而已,低调低调。。。

换个背景