明天就要开始上课了,由于这个学期我初三了,所以必定会没有太多的时间管理这个博客,所以也许会停止更新很长一段时间,各种事情的处理速度,也会变得长长长长~~~
请见谅!
明天就要开始上课了,由于这个学期我初三了,所以必定会没有太多的时间管理这个博客,所以也许会停止更新很长一段时间,各种事情的处理速度,也会变得长长长长~~~
请见谅!
上篇文章《我是怎么对我的网站进行优化的(四):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”,问题应该自解了。如果还不能解决,只能卸载插件了,说明你不适合用这个插件。
很多同学都说 WordPress 很慢,但是作为全世界最常用的建站和博客系统 WordPress 来说,我相信在性能设计上肯定不会有太大的问题,WordPress 开发团队也肯定也考虑到这个问题。其实我觉得,WordPress 并不慢,只是看你会不会用,就像 Windows、Android,有些人觉得不错,有些人觉得慢、差劲,其实也许是你会不会使用的问题。
主机自身的速度的确是影响网站速度最重要的一点,但除此之外,还受到其他很多方面的影响,比如安装太多效率低下的插件,使用代码质量低下的主题,没有正确使用 WordPress 的缓存等。
今天我就结合实例(本博客)来和大家分析一下这个问题。
首先说下,本博客托管在一般的虚拟主机上,并没有托管在 VPS、有 Memcached 等各种各样内存缓存的虚拟主机上,而且,本博客也没有用任何静态化缓存插件,因为我给博客配置了“手机版”,用这些插件特别容易出问题。
那么怎么去优化自身呢?
这是首要的一点。有句流行的话说过“能用代码解决的决不用插件”,但实际情况是大部分的人往往都没足够的代码知识,更不可能做到每个插件的代码化。所以,更好的选择是能不用的插件就不用。因为大部分的插件都会进行数据查询与生成,这在页面生成过程中将耗费时间。需要注意的是,尽量不要使用效率极低的插件,比如某些 SEO 插件,这完全是可以用代码实现的,对于某些插件仅有一个文件的,完全可以尝试自己简单修改、阅读,加入主题的 Functions.php 中,我相信对大部分喜欢折腾 WordPress 的人来说,没什么难度。
并且,插件大多都会在页面中载入各种各样的 CSS 和 JS,而网站优化中有2条内容是:
而且,对于不用插件的处理,我建议“删除”而不是简简单单的“禁用”。因为 WordPress 在每一次的页面访问时,都会判断插件的使用情况。让 WordPress 做更少的判断就等于做更少的数据查询。
如今 WordPress 主题是越来越绚丽,但请你们在使用这些主题时,考虑下主机能否带得动。而且,明显那些国外的主题(默认主题除外)不太适合我们,因为一些国外的主题往往使用了过多的 JS 和 CSS,人家带宽好,不怕这些,但我们 4M、6M 甚至有些地方还在用着 1M、2M 的宽带的人使用起来可就受苦了。当然,如果你会手动修改主题,使其能适应我们这种带宽的话,我没意见。
使用的主题尽量满足以下要求:
使用 GZip 压缩至少可以减少网页体积20%(静态资源除外)。通常大部分的优秀主机都能够支持服务端的 GZip 并且可以自动压缩。如果服务器没有自动进行页面压缩,就需要自行开启。如何开启,我就不多说了,这个请自己百度,寻找适合的方法。
网站的静态文件一般有两种:第一种是网站的 CSS,JS 和一些主题的常用背景图片和按钮文件,这些图片如果网站不进行改版或者其他改动,基本上是不会修改的,第二种是每天更新的网站内容中上传的图片或者附件,这些图片文件也是基本不会改动的。
解决好静态文件存储和加速,网站性能就首先能得到基本的保证了,WordPress 构建的网站和博客也是一样的。对于这些静态文件来说,最好的解决方案永远是使用 CDN 网络进行加速,这样服务器的压力将大大降低,因为访问页面只有当前页面是在自己服务器上,其他所有图片 JS CSS 都是从 CDN 获取的。
从使用便捷性和性价比角度来说,个人推荐七牛云存储。
这个要跟据你的实际情况使用,比如本博客使用的是 WP File Cache + DB Cache Reloaded Fix,考虑到 WP File Cache,网上还没有教程,有时间我再写一个吧!
要彻底明白和搞懂 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 的模版函数,就不要自作多情再增加一个了,那样会更慢。
Transients 是瞬时的意思,WordPress 的 Transients API 就是 WordPress 用来存储一些缓存的数据到数据库中最简单也是最标准的方法,Transients API 给这些缓存的数据一个过期时间,并且时间已到就会自动删除,所以如果你需要存储一些有生命周期的选项的时候,Transients API 就是最好的选择。
这难道同样不是我们做缓存的最佳选择么?
WordPress 小工具其实是速度变慢的根源之一,因为这会引发许许多多的数据查询。所以,尝试自己手写 SideBar 吧,这并不难。而且,这样也有利于我们使用 WordPress Transients API 和 WordPress Object Cache。
如何快速有效的设置(锁定)首页,一直电脑技术员头疼的一件事。虽然这算不上一件难事,但每次都要操作固定的步骤,甚至一台电脑有几个浏览器的时候,还要操作多次。而且有时还会忘记设置首页,也无非不是一件麻烦事。特别是如何在 Windows PE 环境下快速设置(锁定)目标系统所有浏览器首页,并不是简单几步操作就可以完成的事情。因此,特开发此软件协助各位快捷、批量的设置浏览器首页。
软件相对于 2 代版本,代码完全重写,提高执行效率,大大降低首页设置失败几率,修复 2 代严重 BUG,增加了“安全锁定”、“加入收藏”等功能,乃首页设置(锁定)之利器也!
程序名称: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
(任何未经作者同意对程序进行的修改操作,包含但不限于破解、反编、二次开发等,需承担法律责任)
之前的文章: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;?>
大功告成!
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。据说这也是 WordPress 官方推荐的插件。特此记录一下折腾过程。
切换你的 WordPress 编辑器到 HTML 模式,使用以下格式添加代码:
<pre lang="Language" line="1" escaped="true" > </pre>
说真的,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' ); }; ?>
不知道大家有没有过这样的经历?辛辛苦苦从大神的网站上复制的代码,粘贴到自己的博客上后,刷新——哦,My God!没效果!,这还不算糟糕,最糟糕的是——出错了!站点挂掉了!这是怎么回事呢?今天就让我来带你们一探究竟。
问题出自万恶 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 更新就失效了,又要重新更改一次,怎么办?
很简单,在控制面板搜索“Quotmarks Replacer”插件安装即可,这个插件就是专门为了解决这个问题而生的。
亲爱的垃圾评论者们:
你们好!
本人怀着复杂的心情来给你们写这封信。
你们不累么?每天以非人的速度给我的博客撰写各种各样的评论。其中,甚至还包含英文评论。你们不知道,这是中文博客么?
对于某些免费获取 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 以保护网站安全,但是,令我意想不到的事情发生了——从启用第二天开始,百度站长工具发来邮件:BaiduSpider 无法正常访问你的网站。更令我意想不到的是——启用第三天,谷歌站长工具也发来邮件:Googlebot 无法正常访问你的网站。
开始我还以为,是空间商的空间不稳定,但是,一个偶然的机会,我在查看 Better WP Security 日志的时候,都有 IP 因为“访问大量 404 页面”被锁定的记录,心中猜测,是不是因为这个呢?于是关掉了 Better WP Security 的“404 入侵检测”,结果,蜘蛛不再发邮件过来了。
哦!我立刻明白了问题的所在,决定卸载 Better WP Security,在此做个记录,以便后来人查询。
打个小小广告,卸载后,保护 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' ); ?>
编写时参考了部分网上的资料。