WordPress 缓存插件 WP File Cache 安装与使用

上篇文章《我是怎么对我的网站进行优化的(四):Speed》提到要写这么一个教程,那我就写一写吧!其实 WP File Cache 并“人如其名”,而是对 WordPress Object Cache 的优化。

介绍

The plugin implements object level persistent caching and can be used instead of the built in WordPress WP_Object_Cache. Unlike WP Super Cache, Hyper Cache and other plugins, WP File Cache does not cache the entire page; instead, it caches the data WordPress explicitly asks it to cache (using wp_cache_xxx() API functions). Although this means that the performance will be less than with, say, WP Super Cache, all your pages remain dynamic. WP File Cache won’t help you much if the plugins or theme you are using do not use WordPress Cache API. This is by design, since the plugin tries to play nice. However, for most WordPress installations this will not be critical.

简单来说,这个插件就是将 WordPress Object Cache 保存到文件(所以需要配合 WordPress Object Cache 使用,要不没那么明显的效果),这可是我们这些无法上内存缓存的小家伙的福音。明显的,这个插件要主机的硬盘 I/O 比较好才行。

不过,那些财大气粗,可以上内存缓存的家伙,就不要去使用了,用好你的内存缓存吧!无论怎么样,内存缓存总比文件缓存的效率高。

而且,这个插件不同于 WP Super Cache、Hyper Cache 等插件,所以,你安装完这个后,如果没有我那种特殊需求,你还可以在安装其它的缓存插件,会达到更明显的加速效果。

安装使用

怎么安装就不用我教了吧?后台搜索“WP File Cache”,安装即可。借用“大猫”的一句话:神马FTP时代,全部都过去了。

然后,勾上“Enable WP File Cache”和“Save cached data across sessions”,轻点下“Save Changes“,不必退出登录,如果你的主题优化的足够好的话,立刻就可以体验到飞一般的效果了。

安装后出现了一些莫名其妙的问题,怎么办?

So Easy!勾上“Do not use cache in the Admin Panel”,问题应该自解了。如果还不能解决,只能卸载插件了,说明你不适合用这个插件。

我是怎么对我的网站进行优化的(四):Speed

很多同学都说 WordPress 很慢,但是作为全世界最常用的建站和博客系统 WordPress 来说,我相信在性能设计上肯定不会有太大的问题,WordPress 开发团队也肯定也考虑到这个问题。其实我觉得,WordPress 并不慢,只是看你会不会用,就像 Windows、Android,有些人觉得不错,有些人觉得慢、差劲,其实也许是你会不会使用的问题。

主机自身的速度的确是影响网站速度最重要的一点,但除此之外,还受到其他很多方面的影响,比如安装太多效率低下的插件,使用代码质量低下的主题,没有正确使用 WordPress 的缓存等。

今天我就结合实例(本博客)来和大家分析一下这个问题。

首先说下,本博客托管在一般的虚拟主机上,并没有托管在 VPS、有 Memcached 等各种各样内存缓存的虚拟主机上,而且,本博客也没有用任何静态化缓存插件,因为我给博客配置了“手机版”,用这些插件特别容易出问题。

那么怎么去优化自身呢?

尽量减少使用插件

这是首要的一点。有句流行的话说过“能用代码解决的决不用插件”,但实际情况是大部分的人往往都没足够的代码知识,更不可能做到每个插件的代码化。所以,更好的选择是能不用的插件就不用。因为大部分的插件都会进行数据查询与生成,这在页面生成过程中将耗费时间。需要注意的是,尽量不要使用效率极低的插件,比如某些 SEO 插件,这完全是可以用代码实现的,对于某些插件仅有一个文件的,完全可以尝试自己简单修改、阅读,加入主题的 Functions.php 中,我相信对大部分喜欢折腾 WordPress 的人来说,没什么难度。

并且,插件大多都会在页面中载入各种各样的 CSS 和 JS,而网站优化中有2条内容是:

  • 减少HTTP请求,每一次对于JS,CSS等文件的访问都是一次HTTP请求。插件用得少,HTTP 请求数自然就变少了。
  • 合并 CSS 和 JS 文件,减少HTTP请求的首要办法是合并 CSS 和 JS。因为浏览器没有你们想象中的那么聪明,告诉一个令你们感到不可思议的事实——1个 10KB 的 JS 和2个 5KB 的  JS 载入所耗费的时间是不一样的,而且后者载入时间会明显增多。特别是文件都在同一域名下这样的情况更为明显。而插件的 JS 和 CSS 都是独立的,如果10个插件每个都生成1个 JS + 1个CSS,再加上主题的话,CSS 和 JS 的数量的数量可能会令你无法想象。当然,我也用了好多插件(20来个~),你要是有点水平的话,可以尝试自己合并,但是,我想说的是,个人建议不要使用自动合并插件,很多时候,出了问题,你也不知道该怎么办,甚至出了问题你还没有知道。

而且,对于不用插件的处理,我建议“删除”而不是简简单单的“禁用”。因为 WordPress 在每一次的页面访问时,都会判断插件的使用情况。让 WordPress 做更少的判断就等于做更少的数据查询。

使用经过优化的主题

如今 WordPress 主题是越来越绚丽,但请你们在使用这些主题时,考虑下主机能否带得动。而且,明显那些国外的主题(默认主题除外)不太适合我们,因为一些国外的主题往往使用了过多的 JS 和 CSS,人家带宽好,不怕这些,但我们 4M、6M 甚至有些地方还在用着 1M、2M 的宽带的人使用起来可就受苦了。当然,如果你会手动修改主题,使其能适应我们这种带宽的话,我没意见。

使用的主题尽量满足以下要求:

  • 合并 CSS 和 JS——尽量仅仅使用一个 JS 和一个 CSS
  • 正确放置 CSS 和 JS 的位置——尽量将 JS 放置到页面底部、CSS 放置到页面顶部(最好放在</head>之前)
  • 合并图片——尽量少使用图片,能的话,将主题图片使用 CSS Sprites 控制在1~2个
  • 减少数据查询——尽量少使用数据查询,能直接输出的就不要用数据查询

对页面进行 GZip 压缩

使用 GZip 压缩至少可以减少网页体积20%(静态资源除外)。通常大部分的优秀主机都能够支持服务端的 GZip 并且可以自动压缩。如果服务器没有自动进行页面压缩,就需要自行开启。如何开启,我就不多说了,这个请自己百度,寻找适合的方法。

使用 CDN 加速静态资源

网站的静态文件一般有两种:第一种是网站的 CSS,JS 和一些主题的常用背景图片和按钮文件,这些图片如果网站不进行改版或者其他改动,基本上是不会修改的,第二种是每天更新的网站内容中上传的图片或者附件,这些图片文件也是基本不会改动的。

解决好静态文件存储和加速,网站性能就首先能得到基本的保证了,WordPress 构建的网站和博客也是一样的。对于这些静态文件来说,最好的解决方案永远是使用 CDN 网络进行加速,这样服务器的压力将大大降低,因为访问页面只有当前页面是在自己服务器上,其他所有图片 JS CSS 都是从 CDN 获取的。

从使用便捷性和性价比角度来说,个人推荐七牛云存储。

正确使用缓存插件

这个要跟据你的实际情况使用,比如本博客使用的是 WP File Cache + DB Cache Reloaded Fix,考虑到 WP File Cache,网上还没有教程,有时间我再写一个吧!

有效利用 WordPress 自身缓存机制——对象缓存

要彻底明白和搞懂 WordPress 性能优化,首先要理解 WordPress 缓存机制,WordPress 默认是一种叫做 WordPress Object Cache 的对象缓存机制,它把需要缓存的内容按照 Key-Value 这样的模式进行缓存(和 No-SQL 的 key-value 的有点类似),当然它还支持按照 Group 来划分和避免缓存的内容冲突。

所以最基础的 WordPress 缓存就是,把 WordPress 产生的 Key-Value 缓存起来。比如存到文件(文件缓存),或者存到内存(内存缓存)。

由此得知,WordPress 主题和插件尽量使用模板函数,因为 WordPress 模板函数如果部分已经做好了 WordPress Object Cache。
比如 get_the_terms 和 wp_get_object_terms 这两个函数,功能基本一样,但是 get_the_terms 直接从对象缓存中取数据,无查询,而 wp_get_object_terms 每次都从数据库中取数据。

WordPress 插件和主题如果一定要直接查询数据库,请做好 WordPress Object Cache,将查询的结果使用 wp_cahce_set 存到 Object Cache 中,下次直接使用 wp_cache_get 获取。

不过,需要注意的是,别过度,比如某些已经使用过 WordPress Object Cache 的模版函数,就不要自作多情再增加一个了,那样会更慢。

用好 WordPress Transients API

Transients 是瞬时的意思,WordPress 的 Transients API 就是 WordPress 用来存储一些缓存的数据到数据库中最简单也是最标准的方法,Transients API 给这些缓存的数据一个过期时间,并且时间已到就会自动删除,所以如果你需要存储一些有生命周期的选项的时候,Transients API 就是最好的选择。

这难道同样不是我们做缓存的最佳选择么?

尽量不使用 WordPress 小工具

WordPress 小工具其实是速度变慢的根源之一,因为这会引发许许多多的数据查询。所以,尝试自己手写 SideBar 吧,这并不难。而且,这样也有利于我们使用 WordPress Transients API 和 WordPress Object Cache。

Super StartPage v3.0.0.229(首页设置锁定利器)[2013.8.5] – 多种浏览器一键设首!!WinPE下也可设置(锁定)主页!

如何快速有效的设置(锁定)首页,一直电脑技术员头疼的一件事。虽然这算不上一件难事,但每次都要操作固定的步骤,甚至一台电脑有几个浏览器的时候,还要操作多次。而且有时还会忘记设置首页,也无非不是一件麻烦事。特别是如何在 Windows PE 环境下快速设置(锁定)目标系统所有浏览器首页,并不是简单几步操作就可以完成的事情。因此,特开发此软件协助各位快捷、批量的设置浏览器首页。

软件相对于 2 代版本,代码完全重写,提高执行效率,大大降低首页设置失败几率,修复 2 代严重 BUG,增加了“安全锁定”、“加入收藏”等功能,乃首页设置(锁定)之利器也!

SuperStartPage

软件信息

程序名称:Super StartPage 3 (SP3)

程序版本:3.0.0.229

支持系统:适用于 x86 / x64 的 Windows XP / Windows Vista / Windows 7 / Windows 8 操作系统以及同期Windows PE系统

支持语言:简体中文 (Simplified Chinese)

软件下载

下载地址:百度网盘

文件效验:

压缩包:

文件:SuperStartPage3_3.0.0.229.zip
大小:1638579 字节
修改时间:2013年8月25日, 19:47:08
MD5:05A6CBC1DC6DB379A436B9EC3C0BA7D5
SHA1:693EEF8DBE5D1341D96DE52B15FCB1946F7662FB
CRC32:87ECD4FB

主程序:

文件:SuperStartPage3.exe
大小:2512844 字节
文件版本:3.0.0.229
修改时间:2013年8月25日, 18:21:58
MD5:388840AA3635D09FC05B6C94128C7763
SHA1:FC9226DD0E4AB9DE8A7E47CEAE86145A840FD2FD
CRC32:F59D1600

(任何未经作者同意对程序进行的修改操作,包含但不限于破解、反编、二次开发等,需承担法律责任)

 

特别提醒

  1. 请下载后务必核实文件效验信息,如不正确,请勿使用;
  2. 本程序属于系统首页设置管理程序,必然涉及对注册表的直接修改,易被各类安全软件误报,非信勿用;
  3. 强烈建议在阅读说明后,再行使用本程序;
  4. 在 Windows PE 下使用本程序时,推荐使用与本程序具有最佳兼容性的 U 盘装机助理

重要说明

  1. 本软件支持在 Windows 系统桌面环境Windows PE 环境使用;
  2. Windows 系统桌面环境下,可直接修改首页,但此环境下易被杀软阻拦
  3. Windows PE 环境下,将自动搜索硬盘中所有系统,并修改其首页,推荐 Windows PE 环境下使用;
  4. 所设置首页需通过配置文件进行更改,配置文件于软件同目录下UrlGenius.ini,配置方法见配置文件内说明;
  5. 本程序可静默运行,静默参数“/S”(不包括两侧引号)。

多图杀猫

SuperStartPage

SuperStartPage 主程序 UI 预览

主页锁定效果

主页锁定效果

更新日志

[2013.8.5] v3.0.0.229

  1. 〔新增〕第一个对外公开版本发布
  2. 〔修正〕某些特殊浏览器设置的陷阱导致主页设置失败以及快捷方式失效
  3. 〔新增〕“加入收藏”功能,此功能目前暂时仅支持 IE 浏览器,不过 Windows 系统桌面环境和 Windows PE 环境都可用哦
  4. 〔新增〕“安全锁定”功能,此功能目前暂时仅支持 IE 浏览器,不过 Windows 系统桌面环境和 Windows PE 环境都可用哦

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;?>

大功告成!

更换代码高亮插件: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' );
};
?>

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”插件安装即可,这个插件就是专门为了解决这个问题而生的。

致各位 Spammer

亲爱的垃圾评论者们:

你们好!

本人怀着复杂的心情来给你们写这封信。

你们不累么?每天以非人的速度给我的博客撰写各种各样的评论。其中,甚至还包含英文评论。你们不知道,这是中文博客么?

对于某些免费获取 Windows 7 各种版本 Key 的评论,我想说,我不需要,我使用的是正版的 Windows 7 64 Bit 专业版 和 Office 2010 专业版,所以,我根本不需要免费获取这些 Key。

对于某些 XXSEO 的评论,我感到有些高兴,起码,你们使用了我们的母语,使用了和我的博客一样的语言——中文,可是,我还是不得不把你当垃圾处理,因为你用这个名字来评论,给人一种“评论者不是人”的感觉。

而且,我清楚的知道,你们这些评论者,之所以能以非人的速度评论我的文章,是因为你们不是人,是机器。所以,我不得不狠下心来,删掉你们。

你们不知道,我使用了 Willin Kan 大师的“小墙”么?你们不知道发表的结果么?使用评论机器发表那么多评论的结果是——无论发表多少,均被自动拦截。也许,你们不知道,甚至,你们都不知道你们来过我的网站。你们也许使用的是所谓的“全自动”软件,甚至你们也许连在哪个网站发表了评论都不知道。如果是这样,我真替你们感到惋惜。

你们不知道,我经常给我的博客除草的么?你们不知道,所有的评论都会被自动加上 rel=”nofollow” 的么?对于某些人工发表的 Spam,我劝您别再费力气了,我这个流量不高,经常为0;排名不高,收录十几的小博客,用得着这么费劲发这些评论么?

实话说,我其实很佩服你们,佩服你们的勤劳、佩服你们付出的努力,佩服你们对于“反垃圾评论”机制的斗争之心,可是,我也讨厌你们,因为你们将一片净土给污染了。

如果你真的想在我这个小博客占据一席之地,那么,请做到以下几点,也许你发表的那些评论,我就不舍得删除了:

1)先认真读一遍我写的文章;

2)针对里面的内容发表评论,可以是提出疑问、可以是建议意见、可以是衷心祝愿等;

3)使用人类的名字,不要使用例如 XXSEO 这类让人一眼就觉得不是人的名字;

4)使用一下 Gravatar 头像,让我感觉到这是真实的评论,而不是 Spam。

……

慎用 Better WP Security,可能会导致蜘蛛无法正常访问你的网站

一周前,本博客查看了某篇博客的介绍,启用了 Better WP Security 以保护网站安全,但是,令我意想不到的事情发生了——从启用第二天开始,百度站长工具发来邮件:BaiduSpider 无法正常访问你的网站。更令我意想不到的是——启用第三天,谷歌站长工具也发来邮件:Googlebot 无法正常访问你的网站。

开始我还以为,是空间商的空间不稳定,但是,一个偶然的机会,我在查看 Better WP Security 日志的时候,都有 IP 因为“访问大量 404 页面”被锁定的记录,心中猜测,是不是因为这个呢?于是关掉了 Better WP Security 的“404 入侵检测”,结果,蜘蛛不再发邮件过来了。

哦!我立刻明白了问题的所在,决定卸载 Better WP Security,在此做个记录,以便后来人查询。

打个小小广告,卸载后,保护 WordPress 安全可以参考:WordPress 登录邮件提醒防止被人反复尝试登录

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' );
?>

 

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