我是怎么对我的网站进行优化的(二):Meta

虽然现在Google 和百度都已经不把 Meta 标签的内容作为排名的因素了,但是添加好的 Meta 对网站的流量还有有帮助的,因为一个偶然的情况,我发现,Google 的搜索结果在某种情况下会直接使用 Meta Description 做该页面的描述,这个发现,证明 Meta Description,还是有用的,至于 Meta Keywords 貌似基本无效了,这个有时用了还会适得其反,会被认为你有过度 SEO 之嫌,当然,这种情况通常发生于百度。

本站的做法

1)对于首页,使用博客的描述作为 Meta Description,自己写适合的关键词作为 Meta Keywords

2)对于文章页,使用文章的第一段作为 Meta Description,配合我博客的主题,首页的文章摘要也是使用文章的第一段作为 Meta Description 的,然后使用文章的 Tags (标签) 作为  Meta Keywords

还是那个观点,不喜欢使用插件,所以同样是扔代码到主题的 Functions.php。

实现所需要的代码

<?php
function seo_meta() {
	global $post;

	$site_description = get_bloginfo( 'description', 'display' );
	$post_description = "";
	//$site_keywords = "记忆空间, Nikbobo, Nikbobo的博客, 零碎的记忆";
	//$post_keywords = "";

	//$post_tags = wp_get_post_tags($post->ID);
    //foreach ($post_tags as $post_tag) {
        //$post_keywords = $post_keywords . $post_tag->name . ", ";
    //}

	//if ( !empty($post_keywords) )
			//$post_keywords = rtrim($post_keywords, ", ");

	if(preg_match('/<p>(.*)<\/p>/iU',trim(strip_tags($post->post_content,"<p>")),$matches)) {
		$post_description = trim(strip_tags($matches[1]));
	} else {
		$post_content = explode("\n",trim(strip_tags($post->post_content)));
		$post_description = trim(strip_tags($post_content ['0']));
	}

	//if ( $post_keywords && is_single() ) {
		//echo "\n" . '<meta name="keywords" content="' . $post_keywords . '" />' . "\n";
	//}
	//elseif ( $site_keywords && ( is_home() || is_front_page() ) ) {
		//echo "\n" . '<meta name="keywords" content="' . $site_keywords . '" />' . "\n";
	//}	

	if ( $post_description && is_single() ) {
		echo "\n" . '<meta name="description" content="' . $post_description . '" />' . "\n";
	}
	elseif ( $site_description && is_home() ) {
		echo "\n" . '<meta name="description" content="' . $site_description . '" />' . "\n";
	}

}
add_action('wp_head', 'seo_meta' );
?>

 个性化定制

本代码默认不显示 Meta Keywords

当然,如果你觉得 Meta Keywords 还是有那么一点儿用处的话,你可以去掉代码中的注释,即把含有“//”的那一行代码开头的”//”去掉。这样就有了 Meta Keywords 显示了。

新版 BAE WordPress 伪静态规则

好久没关注 BAE 了,现在发现 BAE 变了好多,伪静态规则已经可以简化到一条规则的地步了。
把你之前那些繁杂的规则删掉吧,现在只需要:

handlers:
  - check_exist : not_exist
    script : /index.php

以上在 BAE 3.0 测试通过。

该文章发自手机

我是怎么对我的网站进行优化的(三):Header

有些朋友,在上一些人的博客时发现:哇!他们博客的 Header 好简洁呀,简洁的 Header,也有助于蜘蛛直接通过 Header快速阅览你的网站,帮助蜘蛛的爬行。

原因:WordPress 捣鬼

为什么你博客的 Header那么凌乱,他们博客的 Header 那么简洁,这就是因为 WordPress 搞的鬼,它通过  wp_head() 在 Header 中输出了太多的信息,而这些信息,对一些人来说,是根本没有作用的。那么怎么办?立刻干掉他!

怎么干掉?

So easy!扔以下代码到主题的 Functions.php:

<?php
//Remove unused wp_head for SEO
remove_action('wp_head', 'wp_shortlink_wp_head');
remove_action('wp_head', 'rsd_link');
remove_action('wp_head', 'wlwmanifest_link');
remove_action('wp_head', 'wp_generator');
remove_action('wp_head', 'adjacent_posts_rel_link_wp_head');
?>

 

看一下,是不是变得简洁许多啦!

iGoogler 主题添加文章“预告”功能

大家有没有注意到,本博客小小增加了一点新东西?那就是传说中的“预告”模块。出于某些原因,我们会在 WordPress 中把该篇文章设为“定时发布”。我们何不把静躺在后台的预发布的博文,得以提前给大家透漏点消息呢?通过小手段在前台进行播报呢?

有了这个功能,你再也不用把博文保存为草稿了,取而代之的是预定一个发布时间。此时前台的播报区,已经把你要进行的事情“泄漏”了。访问的用户对此感兴趣,或收藏或默记方便关注;用户没兴趣也不要紧,浏览你博客时发现你在进行的“小动作”,应该会为你正辛苦劳作加油吧?——这无疑增加了用户体验度。

本站用的是 iGoogler 主题,所以,就基于这个主题写一个代码吧!代码参考部分网上的。

需要扔到 Functions.php 里面的代码

<?php
function get_future_posts_igoogler($number = 5)
{
	global $post;
	$temp_post = $post;
	$output = '';
	$futu_posts = get_posts('numberposts='.$number.'&orderby=ID&order=ASC&post_status=future');
	foreach( $futu_posts as $fpost ) :
	$output.='<li>'.get_the_title($fpost->ID).'</li>';
	endforeach;
	$post = $temp_post;
	return $output;
}
?>

需要扔到 Sidebar_r.php 里面的代码

温馨提示:

代码插入

<?php if ( !dynamic_sidebar('right') ) : ?>

<?php endif; ?>

之间。

<h3>即将推出</h3>
<ul>
	<?php echo get_future_posts_igoogler(5); ?>
</ul>

iGoogler 主题使用七牛镜像存储 WordPress 插件导致 JS 加载失败的修正

今天偶然看到,我爱水煮鱼发布了七牛镜像存储 WordPress 插件,欣喜之余,立刻就用上了,可是,用上,问题就来了——JS 加载全失败了。怎么办?弃之不用?这感觉有点不爽,慢慢分析,慢慢调试,终于找到了原因——插件在判断正则上有问题,对于某些特殊写法的php文件没有过滤(例如:all-in-one.js.php)导致。下面是解决方法。(注:本解决方法通过改主题而不是改插件实现,且改动较大,目前暂未发现问题,但改动后该主题JS合并的效果消失,请酌情使用)

1)将 wp-content/themes/iGoogler/js 目录的 all-in-one.js.php 删掉;

2)将 wp-content/themes/iGoogler/js 目录的 comment-ajax.js 更名为 comments-ajax.js;

3)将 wp-content/themes/iGoogler/js 目录的 comment-reply.js 更名为 comments-reply.js;

4)将 wp-content/themes/iGoogler 目录的 all-in-one-js.php 整个替换为以下代码;

<?php

// Common.js
echo '<script type="text/javascript" src="' . get_template_directory_uri() . '/js/common.js"></script>' . "\n";

//
if(is_single()) {
	echo '<script type="text/javascript" src="' . get_template_directory_uri() . '/js/single.js"></script>' . "\n";
	if(comments_open()) {
		echo '<script type="text/javascript" src="' . get_template_directory_uri() . '/js/comments-ajax.js"></script>' . "\n";
		echo '<script type="text/javascript" src="' . get_template_directory_uri() . '/js/comments-reply.js"></script>' . "\n";
	}
}
if(search_words()) {
	echo '<script type="text/javascript" src="' . get_template_directory_uri() . '/js/search-highlight.js"></script>' . "\n";
}
if(igoogler_option('google-plus-one')) {
	echo '<script type="text/javascript" src="' . get_template_directory_uri() . '/js/google-plusone.js"></script>' . "\n";
}
?>

<?php if(search_words()): $arr = preg_split('/[\s,]+/', search_words()); ?>
<script type="text/javascript"><!--//--><![CDATA[//><!--
$(document).ready(function(e) {
	<?php foreach($arr as $words):?>
	    $(".post").highlight("<?php echo $words;?>");
	<?php endforeach; ?>
});
//--><!]]></script>
<?php endif;?>

5)将 wp-content/themes/iGoogler/js 目录的 comments-ajax.js(comment-ajax.js 更名 的)修改一下;

查找

got = js_url.indexOf('js/all-in-one.js'); i++ ; //Modified by me

 

替换为

got = js_url.indexOf('comments-ajax.js'); i++ ; //Modified by me

 

查找

ajax_php_url = js_url.substring(0, got) + 'comments-ajax.php',

 

替换为

ajax_php_url = js_url.replace("js/comments-ajax.js","comments-ajax.php"),

 

查找

var i = 0, got = -1, len = document.getElementsByTagName('script').length;
while ( i <= len && got == -1){
	if("undefined" != typeof(document.getElementsByTagName('script')[i].src) ) {
		var js_url = document.getElementsByTagName('script')[i].src;
		got = js_url.indexOf('comments-ajax.js'); i++ ; //Modified by me
	}
}

 

在后面添加一句

js_url = js_url.replace('nikbobo.qiniudn.com','www.nikbobo.net');

 

其中,nikbobo.qiniudn.com 更改为你的七牛提供的二级域名,www.nikbobo.net 改成你的 WordPress 站点域名。

即替换为

var i = 0, got = -1, len = document.getElementsByTagName('script').length;
while ( i <= len && got == -1){
	if("undefined" != typeof(document.getElementsByTagName('script')[i].src) ) {
		var js_url = document.getElementsByTagName('script')[i].src;
		got = js_url.indexOf('comments-ajax.js'); i++ ; //Modified by me
	}
}
js_url = js_url.replace('nikbobo.qiniudn.com','www.nikbobo.net');

 

好了,大功告成!

WordPress 登录邮件提醒防止被人反复尝试登录

在 WordPress 的安全问题越来越不容忽视的今天,如何知道自己的登录信息是否已泄露,自己的博客是否被别人反复尝试登录是一个比较重要的事情。那怎么知道自己的博客是否被别人反复尝试登录呢?这个我们就要参考网上银行的办法——登录提醒。这里用的是邮件登陆提醒。怎么实现这个功能呢?插件固然可以解决问题,但是,我还是那句话,能不用插件,就不用插件。其实实现这个功能很简单,只要在主题的 Functions.php 中扔一段代码就可以做到。

登录提醒,还分为登录成功提醒和登录失败提醒,大家可以酌情选择需要哪一个提醒,或者两个都需要。

登录成功提醒

<php
function wp_login_notify()
{
	date_default_timezone_set('PRC');
	$admin_email = get_bloginfo ('admin_email');
	$to = $admin_email;
	$subject = '[' . get_option("blogname") . '] ' . '登录成功提醒';
	$message = '<p>您的博客(' . get_option("blogname") . ')于 ' . date("Y-m-d H:i:s") . ' 在IP ' . $_SERVER['REMOTE_ADDR'] . ' 上登录成功。</p>' . 
	'<p>请确认是您自己的操作,以防造成损失!</p>' .
	'<p>登录信息如下:</p>' . 
	'<p>用户名:' . $_POST['log'] . '<p>' .
	'<p>登录时间:' . date("Y-m-d H:i:s") .  '<p>' .
	'<p>登录 IP:' . $_SERVER['REMOTE_ADDR'] . '<p>';	
	$wp_email = 'WebMaster@' . preg_replace('#^www\.#', '', strtolower($_SERVER['SERVER_NAME']));
	$from = "From: \"" . get_option('blogname') . "\" <$wp_email>";
	$headers = "$from\nContent-Type: text/html; charset=" . get_option('blog_charset') . "\n";
	wp_mail( $to, $subject, $message, $headers );
}

add_action( 'wp_login', 'wp_login_notify' );
?>

 

登录失败提醒

<?php
function wp_login_failed_notify()
{
	date_default_timezone_set('PRC');
	$admin_email = get_bloginfo ('admin_email');
	$to = $admin_email;
	$subject = '[' . get_option("blogname") . '] ' . '登录失败提醒';
	$message = '<p>您的博客(' . get_option("blogname") . ')于 ' . date("Y-m-d H:i:s") . ' 在IP ' . $_SERVER['REMOTE_ADDR'] . ' 上登录失败。</p>' . 
	'<p>请确认是您自己的操作失误,以防造成损失!</p>' .
	'<p>用户名:' . $_POST['log'] . '<p>' .
	'<p>密码:' . $_POST['pwd'] .  '<p>' .
	'<p>登录时间:' . date("Y-m-d H:i:s") .  '<p>' .
	'<p>登录 IP:' . $_SERVER['REMOTE_ADDR'] . '<p>';	
	$wp_email = 'WebMaster@' . preg_replace('#^www\.#', '', strtolower($_SERVER['SERVER_NAME']));
	$from = "From: \"" . get_option('blogname') . "\" <$wp_email>";
	$headers = "$from\nContent-Type: text/html; charset=" . get_option('blog_charset') . "\n";
	wp_mail( $to, $subject, $message, $headers );
}

add_action( 'wp_login_failed', 'wp_login_failed_notify' );
?>

 

编写时参考了部分网上的资料。

WordPress 让代码不再误人子弟

不知道大家有没有过这样的经历?辛辛苦苦从大神的网站上复制的代码,粘贴到自己的博客上后,刷新——哦,My God!没效果!,这还不算糟糕,最糟糕的是——出错了!站点挂掉了!这是怎么回事呢?今天就让我来带你们一探究竟。

原因

问题出自万恶 WordPress,它会自动将函数代码中半角的单引号、双引号转换为全角标点,虽然在页面上显示的还是半角标点,但复制后却是全角的标点,造成函数代码无法运行(真不知道WordPress 的开发者为什么要进行这些转换)。所以这里建议喜欢在自己博客上记录折腾 WordPress 心得体会或转载代码的童鞋,请按下面的方法,改造一下自己的WordPress程序,不要弄一堆不能用的代码放在那,误人子弟。

方法一:修改 WordPress 核心文件去除此功能

很简单,修改 wp-includes/formatting.php ,把相关语句注释掉即可。

查找

// static strings  
$curl = str_replace($static_characters, $static_replacements, $curl); 
// regular expressions  
$curl = preg_replace($dynamic_characters, $dynamic_replacements, $curl); 

替换为

// static strings  
//$curl = str_replace($static_characters, $static_replacements, $curl); 
// regular expressions  
//$curl = preg_replace($dynamic_characters, $dynamic_replacements, $curl); 

大功告成!

方法二:安装 WordPress 插件

方法一固然好,但是每次 WordPress 更新就失效了,又要重新更改一次,怎么办?

很简单,在控制面板搜索“Quotmarks Replacer”插件安装即可,这个插件就是专门为了解决这个问题而生的。

更换代码高亮插件:WP-Syntax

因为某些原因,更换代码插件到 WP-Syntax。据说这也是 WordPress 官方推荐的插件。特此记录一下折腾过程。

如何添加代码高亮

切换你的 WordPress 编辑器到 HTML 模式,使用以下格式添加代码:

<pre lang="Language" line="1" escaped="true" >

</pre>

更换 WP-Syntax 代码样式

说真的,WP-Syntax 的 CSS 样式看起来比较难看,所以修改了一下,参考倡萌的修改方法,在你的主题的 style.css 文件中,添加以下代码:

.wp_syntax {
	color:#100;
	background-color:#f9f9f9;
	border:1px solid #EBEBEB;
	margin:0 0 1.5em 0;
	overflow:auto;
}
.wp_syntax {
	overflow-x:auto;
	overflow-y:hidden;
	padding-bottom:expression(this.scrollWidth > this.offsetWidth ? 15:0);
	width:99%;
}
.wp_syntax table {
	border:none;
	border-collapse:collapse;
	margin:0;
	padding:0;
	width:100% !important
}
.wp_syntax caption {
	padding:2px;
	width:100%;
	background-color:#def;
	text-align:left;
	font-family:Monaco;
	font-size:13px;
	line-height:20px;
}
.wp_syntax caption a {
	color:#1982d1;
	text-align:left;
	font-family:Monaco;
	font-size:13px;
	line-height:20px;
	text-decoration:none;
}
.wp_syntax caption a:hover {
	color:#1982d1;
	text-decoration:underline;
}
.wp_syntax div,.wp_syntax td {
	border:none;
	text-align:left;
	padding:0;
	vertical-align:top;
}
.wp_syntax td.code {
	background:none;
	line-height:normal;
	white-space:normal;
	padding-left:10px;
}
.wp_syntax pre {
	background:transparent;
	margin:0;
	padding:0;
	width:auto;
	float:none;
	clear:none;
	overflow:visible;
	font-family:Monaco;
	font-size:13px;
	line-height:20px;
	white-space:pre;
}
.wp_syntax td.line_numbers pre {
	border-right:3px solid #6CE26C;
	background-color:#E7E5DC;
	color:gray;
	width:20px;
	padding:0 5px;
	text-align:right;
}

然后,在你主题的 Functions.php 中添加以下代码来禁用 WP-Symtax 插件的 CSS 样式代码。

<?php
if ( has_action( 'wp_print_styles', 'wp_syntax_style' ) ) {
remove_action( 'wp_print_styles', 'wp_syntax_style' );
};
?>

iGoogler 主题使用七牛镜像存储 WordPress 插件导致 JS 加载失败的修正后续:手动合并 JS 文件

之前的文章:iGoogler 主题使用七牛镜像存储 WordPress 插件导致 JS 加载失败的修正,提到过一个问题:这样操作以后,该主题 JS 合并的效果消失,那么,我们何不手动合并 JS 文件呢?下面就和我一起来动手吧!最终效果是合并为两个文件:all-in-one.js 和 google-plusone.js。当然,你如果确定一定会开启 Google Plus 的话,你完全可以全部合并为 all-in-one.js。

操作步骤

1)在 wp-content/themes/iGoogler/js 目录以 UTF-8 无 BOM 模式创建 all-in-one.js,不懂如何创建的,就直接把 comments-ajax.js(comment-ajax.js)复制一份,重命名为 all-in-one.js,然后清空里面的内容即可;

2)在 wp-content/themes/iGoogler/js/all-in-one.js 中写入以下代码;

// JavaScript Document
$(document).ready(function(e) {
	
	// Fix some bugs for ie6
	if ('undefined' == typeof(document.body.style.maxHeight)) {
		if($(".wrap").width() > 1219)
			$(".wrap").width(1219);
		else if($(".wrap").width() < 1001)
			$(".wrap").width(1001);
	}
	
	// Reisize Main Content to fit height
	var minheight = Math.max( $("#lbar").height(), $("#rbar").height() );
	if( $("#main").height() < minheight) {
		$("#main").height(minheight);
	}
	
	// Navigation
	$("#nav .menu li").has(".sub-menu").mouseover(function(e) {
		$("#nav .sub-menu:visible").css("z-index",99);
		$(this).children(".sub-menu").css("z-index",999);
        $(this).children(".sub-menu").stop().slideDown("fast");
    });
	$("#nav .menu li").has(".sub-menu").mouseleave(function(e) {
        $(this).children(".sub-menu").removeAttr('style').stop().slideUp("fast");    
    });
	
	// left sidebar animation
	var position = $("#lbar .line").position().top + 20;
	$("#lbar .lbar_content").css("top", position);
    $("#lbar .lbar_title").click(function(e) {
		$(".lbar_title a").removeClass("current");
		$(e.target).addClass("current");
		$(".lbar_content").css("display","none");
		$(this).next(".lbar_content").slideDown(500);
    });
	
});

// JavaScript Document
$(document).ready(function(e) {
    	// Fix Position problems of #respond_ad
	if($("#respond_ad").length > 0) {
		if ($("#respond_ad").offset().left < 455 ) {
			$("#respond_ad").offset({left:455});
		}
		if ($("#respond").height() < $("#respond_ad").height() ) {
			$("#respond").height($("#respond_ad").height());
		}
	}
	
	if($("#single_bottom_ad").length > 0) {
		if($("#sidebar_bottom").offset().top + $("#single_bottom_ad").height() > $(".post-nav").offset().top) {
			$("#sidebar_bottom").css("margin-bottom",$("#single_bottom_ad").height() - $("#sidebar_bottom").height());
		}
	}
	
	// Single Post footer turn
	$("#sidebar_bottom span:first").addClass("active");
	$("#sidebar_bottom ul:first").fadeIn();
	$(".post-nav").css("margin-top",$("#sidebar_bottom ul:first").css("height"));
	$("#sidebar_bottom span").mouseover(function (){
		$("#sidebar_bottom span").removeClass("active");$(this).addClass("active");
		if($(this).next("ul").css("display")!="block")
		{
			$("#sidebar_bottom ul").hide();
			$(this).next("ul").fadeIn();
		}
		$("#main .post-nav").css("margin-top",$(this).next().css("height"));
	});	
});

/**
 * WordPress jQuery-Ajax-Comments v1.3 by Willin Kan.
 * URI: http://kan.willin.org/?p=1271
 */
var i = 0, got = -1, len = document.getElementsByTagName('script').length;
while ( i <= len && got == -1){
	if("undefined" != typeof(document.getElementsByTagName('script')[i].src) ) {
		var js_url = document.getElementsByTagName('script')[i].src;
		got = js_url.indexOf('all-in-one.js'); i++ ; //Modified by me
	}
}
js_url = js_url.replace('nikbobo.qiniudn.com','www.nikbobo.net');

		var edit_mode = '1', // 再編輯模式 ( '1'=開; '0'=不開 )
		
		ajax_php_url = js_url.replace("js/all-in-one.js","comments-ajax.php"),
		wp_url = js_url.substr(0, js_url.indexOf('wp-content')),
		pic_sb = wp_url + 'wp-admin/images/wpspin_light.gif', // 提交 icon
		pic_no = wp_url + 'wp-admin/images/no.png',      // 錯誤 icon
		pic_ys = wp_url + 'wp-admin/images/yes.png',     // 成功 icon
		txt1 = '<div id="loading"><img src="' + pic_sb + '" style="vertical-align:middle;" alt=""/> 正在提交, 请稍候...</div>',
		txt2 = '<div id="error">#</div>',
		txt3 = '"><img src="' + pic_ys + '" style="vertical-align:middle;" alt=""/> 提交成功',
		edt1 = ', 刷新页面之前可以<a rel="nofollow" class="comment-reply-link" href="#edit" onclick=\'return addComment.moveForm("',
		edt2 = ')\'>再编辑</a>',
		cancel_edit = '取消编辑',
		edit, num = 1, comm_array=[]; comm_array.push('');

$(document).ready(function($) {
		$comments = $('#comments-title'); // 評論數的 ID
		$cancel = $('#cancel-comment-reply-link'); cancel_text = $cancel.text();
		$submit = $('#commentform #submit'); $submit.attr('disabled', false);
		$('#comment').after( txt1 + txt2 ); $('#loading').hide(); $('#error').hide();
		$body = (window.opera) ? (document.compatMode == "CSS1Compat" ? $('html') : $('body')) : $('html,body');

/** submit */
$('#commentform').submit(function() {
		$('#loading').slideDown();
		$submit.attr('disabled', true).fadeTo('slow', 0.5);
		if ( edit ) $('#comment').after('<input type="text" name="edit_id" id="edit_id" value="' + edit + '" style="display:none;" />');

/** Ajax */
	$.ajax( {
		url: ajax_php_url,
		data: $(this).serialize(),
		type: $(this).attr('method'),

		error: function(request) {
			$('#loading').slideUp();
			$('#error').slideDown().html('<img src="' + pic_no + '" style="vertical-align:middle;" alt=""/> ' + request.responseText);
			setTimeout(function() {$submit.attr('disabled', false).fadeTo('slow', 1); $('#error').slideUp();}, 3000);
			},

		success: function(data) {
			$('#loading').hide();
			comm_array.push($('#comment').val());
			$('textarea').each(function() {this.value = ''});
			var t = addComment, cancel = t.I('cancel-comment-reply-link'), temp = t.I('wp-temp-form-div'), respond = t.I(t.respondId), post = t.I('comment_post_ID').value, parent = t.I('comment_parent').value;

// comments
		if ( ! edit && $comments.length ) {
			n = parseInt($comments.text().match(/\d+/));
			$comments.text($comments.text().replace( n, n + 1 ));
		}

// show comment
		new_htm = '" id="new_comm_' + num + '"></';
		new_htm = ( parent == '0' ) ? ('\n<ol style="clear:both;" class="commentlist' + new_htm + 'ol>') : ('\n<ul class="children' + new_htm + 'ul>');

		ok_htm = '\n<span id="success_' + num + txt3;
		if ( edit_mode == '1' ) {
			div_ = (document.body.innerHTML.indexOf('div-comment-') == -1) ? '' : ((document.body.innerHTML.indexOf('li-comment-') == -1) ? 'div-' : '');
			ok_htm = ok_htm.concat(edt1, div_, 'comment-', parent, '", "', parent, '", "respond", "', post, '", ', num, edt2);
		}
		ok_htm += '</span><span></span>\n';

		$('#respond').before(new_htm);
		$('#new_comm_' + num).hide().append(data);
		$('#new_comm_' + num + ' li').append(ok_htm);
		$('#new_comm_' + num).fadeIn(4000);

		$body.animate( { scrollTop: $('#new_comm_' + num).offset().top - 200}, 900);
		countdown(); num++ ; edit = ''; $('*').remove('#edit_id');
		cancel.style.display = 'none';
		cancel.onclick = null;
		t.I('comment_parent').value = '0';
		if ( temp && respond ) {
			temp.parentNode.insertBefore(respond, temp);
			temp.parentNode.removeChild(temp)
		}
		}
	}); // end Ajax
  return false;
}); // end submit

/** comment-reply.dev.js */
addComment = {
	moveForm : function(commId, parentId, respondId, postId, num) {

		var t = this, div, comm = t.I(commId), respond = t.I(respondId), cancel = t.I('cancel-comment-reply-link'), parent = t.I('comment_parent'), post = t.I('comment_post_ID');
		if ( edit ) exit_prev_edit();
		num ? (
			t.I('comment').value = comm_array[num],
			edit = t.I('new_comm_' + num).innerHTML.match(/(comment-)(\d+)/)[2],
			$new_sucs = $('#success_' + num ), $new_sucs.hide(),
			$new_comm = $('#new_comm_' + num ), $new_comm.hide(),
			$cancel.text(cancel_edit)
		) : $cancel.text(cancel_text);

		t.respondId = respondId;
		postId = postId || false;

		if ( !t.I('wp-temp-form-div') ) {
			div = document.createElement('div');
			div.id = 'wp-temp-form-div';
			div.style.display = 'none';
			respond.parentNode.insertBefore(div, respond)
		}

		!comm ? ( 
			temp = t.I('wp-temp-form-div'),
			t.I('comment_parent').value = '0',
			temp.parentNode.insertBefore(respond, temp),
			temp.parentNode.removeChild(temp)
		) : comm.parentNode.insertBefore(respond, comm.nextSibling);

		$body.animate( { scrollTop: $('#respond').offset().top - 180 }, 400);

		if ( post && postId ) post.value = postId;
		parent.value = parentId;
		cancel.style.display = '';

		cancel.onclick = function() {
			if ( edit ) exit_prev_edit();
			var t = addComment, temp = t.I('wp-temp-form-div'), respond = t.I(t.respondId);

			t.I('comment_parent').value = '0';
			if ( temp && respond ) {
				temp.parentNode.insertBefore(respond, temp);
				temp.parentNode.removeChild(temp);
			}
			this.style.display = 'none';
			this.onclick = null;
			return false;
		};

		try { t.I('comment').focus(); }
		catch(e) {}

		return false;
	},

	I : function(e) {
		return document.getElementById(e);
	}
}; // end addComment

function exit_prev_edit() {
		$new_comm.show(); $new_sucs.show();
		$('textarea').each(function() {this.value = ''});
		edit = '';
}

var wait = 15, submit_val = $submit.val();
function countdown() {
	if ( wait > 0 ) {
		$submit.val(wait); wait--; setTimeout(countdown, 1000);
	} else {
		$submit.val(submit_val).attr('disabled', false).fadeTo('slow', 1);
		wait = 15;
  }
}

});// end jQ

addComment={moveForm:function(d,f,i,c){var m=this,a,h=m.I(d),b=m.I(i),l=m.I("cancel-comment-reply-link"),j=m.I("comment_parent"),k=m.I("comment_post_ID");if(!h||!b||!l||!j){return}m.respondId=i;c=c||false;if(!m.I("wp-temp-form-div")){a=document.createElement("div");a.id="wp-temp-form-div";a.style.display="none";b.parentNode.insertBefore(a,b)}h.parentNode.insertBefore(b,h.nextSibling);if(k&&c){k.value=c}j.value=f;l.style.display="";l.onclick=function(){var n=addComment,e=n.I("wp-temp-form-div"),o=n.I(n.respondId);if(!e||!o){return}n.I("comment_parent").value="0";e.parentNode.insertBefore(o,e);e.parentNode.removeChild(e);this.style.display="none";this.onclick=null;return false};try{m.I("comment").focus()}catch(g){}return false},I:function(a){return document.getElementById(a)}};

/*

highlight v3

Highlights arbitrary terms.

<http://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html>

MIT license.

Johann Burkard
<http://johannburkard.de>
<mailto:jb@eaio.com>

 */

jQuery.fn.highlight = function(pat) {
	function innerHighlight(node, pat) {
		var skip = 0;
		if (node.nodeType == 3) {
			var pos = node.data.toUpperCase().indexOf(pat);
			if (pos >= 0) {
				var spannode = document.createElement('span');
				spannode.className = 'highlight';
				var middlebit = node.splitText(pos);
				var endbit = middlebit.splitText(pat.length);
				var middleclone = middlebit.cloneNode(true);
				spannode.appendChild(middleclone);
				middlebit.parentNode.replaceChild(spannode, middlebit);
				skip = 1;
			}
		} else if (node.nodeType == 1 && node.childNodes
				&& !/(script|style)/i.test(node.tagName)) {
			for ( var i = 0; i < node.childNodes.length; ++i) {
				i += innerHighlight(node.childNodes[i], pat);
			}
		}
		return skip;
	}
	return this.each(function() {
		innerHighlight(this, pat.toUpperCase());
	});
};

jQuery.fn.removeHighlight = function() {
	return this.find("span.highlight").each(function() {
		this.parentNode.firstChild.nodeName;
		with (this.parentNode) {
			replaceChild(this.firstChild, this);
			normalize();
		}
	}).end();
};

3)将 wp-content/themes/iGoogler/js/all-in-one.js 中的域名改成你的;

查找

js_url = js_url.replace('nikbobo.qiniudn.com','www.nikbobo.net');

 

其中,nikbobo.qiniudn.com 更改为你的七牛提供的二级域名,www.nikbobo.net 改成你的 WordPress 站点域名。

4)将 wp-content/themes/iGoogler 目录的 all-in-one-js.php 整个替换为以下代码;

<script type="text/javascript" src="<?php echo get_template_directory_uri();?>/js/all-in-one.js"></script>
<?php
if(igoogler_option('google-plus-one')) {
	echo '<script type="text/javascript" src="' . get_template_directory_uri() . '/js/google-plusone.js"></script>' . "\n";
}
?>

<?php if(search_words()): $arr = preg_split('/[\s,]+/', search_words()); ?>
<script type="text/javascript"><!--//--><![CDATA[//><!--
$(document).ready(function(e) {
	<?php foreach($arr as $words):?>
	    $(".post").highlight("<?php echo $words;?>");
	<?php endforeach; ?>
});
//--><!]]></script>
<?php endif;?>

大功告成!

开启 Google Plus 后全合并方法

1)将以下代码添加到 wp-content/themes/iGoogler/js/all-in-one.js 末尾;

(function() {
    var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
    po.src = 'https://apis.google.com/js/plusone.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
  })();

2)将 wp-content/themes/iGoogler 目录的 all-in-one-js.php 整个替换为以下代码;

<script type="text/javascript" src="<?php echo get_template_directory_uri();?>/js/all-in-one.js"></script>

<?php if(search_words()): $arr = preg_split('/[\s,]+/', search_words()); ?>
<script type="text/javascript"><!--//--><![CDATA[//><!--
$(document).ready(function(e) {
	<?php foreach($arr as $words):?>
	    $(".post").highlight("<?php echo $words;?>");
	<?php endforeach; ?>
});
//--><!]]></script>
<?php endif;?>

大功告成!

神秘兮兮的 WPJAM Debug,你也来山寨一个

大家都知道,我爱水煮鱼写了一个“WPJAM DeBug”插件,用于检测 WordPress 的效率。主要是针对“很多同学说 WordPress 的效率很低,但是又说不出哪里效率低的”问题。

可是这个插件竟然要收 ¥4.99,所以,我也折腾了一下,以代码的形势山寨了一个 WPJAM Debug。

功能很简单,在当前页面的 url 后面加上 ?debug,然后页脚就会显示当前页面有多少条 SQL 查询,页面生成花了多少时间,并且把 SQL 按照执行顺序和按照耗时两种方式列出。

其实启用这个功能很简单:

1、编辑 wp-config.php,在合适的地方加上

define('SAVEQUERIES', true);

2、编辑主题的 Functions.php,在末尾加上

<?php
function nikbobo_debug()
{
	if ( isset($_GET['debug']) && current_user_can('level_10') ) {
	echo "Made " . get_num_queries() . " queries in " . timer_stop(0) . " seconds";
	global $wpdb;
	echo "<pre>";
	print_r($wpdb->queries);
	echo "</pre>";
	}
}
add_action('wp_footer', 'nikbobo_debug');
?>

好了,登录试试看吧!在任意页面加上 ?debug,是不是在页脚显示了?各位 WordPresser,大胆根据这个找出令你站点变慢的原因吧!