首页 > 服务器运维 > 博客维护日记

博客维护日记

2014年2月19日 Terence 294 次阅读 发表评论 阅读评论

      从博客重新启用至今已经过去了将近4个月的时间,除了之前提到的对服务器进行最大化优化外,却一直忽略了对于博客程序本身的维护,毕竟是2010年时候的wordpress代码,包括各种插件都已经很过时了,加上最近才发现的一些由于插件问题而带来的bug,因此升级代码是非常必要的。

      首先是插件的升级维护工作,下面是相对于之前所使用的插件,到现在经过改动的插件列表:

1、WP-DB-Backup

      升级插件版本,解决数据库定时备份的bug,其实自从用了脚本定时备份mysql和网站目录文件后,我就把这个插件给禁用了,MySQL的dump效率不知比mysql-php模块快了多少。

2、Keep Blanks

      新安装插件,WordPress所使用的TinyMCE编辑器的兼容问题源自博客里的一篇老日志,在可视化编辑框的模式下打入空格后切换到HTML编辑模式,然后再切回来就会被自作聪明的去掉了,这款插件解决了这个问题。

3、NoSpamNX

      升级插件版本,解决拦截垃圾评论失效问题。

4、WP Super Cache

      升级插件版本,新版本的静态化缓存功能更为强大,更新了Mod Rewrite规则,支持WP-T-Wap插件生成的wap手机版网页的静态化缓存。

5、wp-downloadcounter

      解决了下载计数插件代码里的一个逻辑错误,修改downloadcounter-config.php文件第102行,将“strpos($url->download_url, get_option('siteurl')) == 0”改为“strpos($url->download_url, get_option('siteurl')) === 0”。三个等号的含义是完全等于运算,不仅比较值,而且还比较值的类型,只有两者一致才为真,两个等号是不比较值的类型的。原来的代码混淆了0和false的判断,导致下载计数的链接如果是非本地的话,apache的error_log会记录下插件错误的调用了file指令。

6、baidushare_wp

      新安装插件,百度分享用来代替之前的代推,原因是代推已经很久没有更新了,分享网站很多都已经不可用,加上最近几天发现代推的服务器都打不开了,遂换之,新的百度分享插件做的还是挺漂亮的,分享链接显示在了正文的后面,分享网站入口也很全,还能显示已经分享出去的次数,方便跟踪统计。但不知为什么现在这个插件在WordPress官网上下架了,只能在百度分享官网上下到。另外由于插件代码本身已经很久没更新了,逻辑有缺陷,最新生成的百度分享js代码中的“|”分隔符会导致插件设置保存失败,所以需要对js代码进行处理,解决方法就是将里面的代码“getElementsByTagName('head')[0]||body”二挑一,我选择前者,虽然采取后者可以照顾到网页的加载先后顺序,但经过实验发现这样会造成IE6下网页渲染失败,所以还是把js放在head最后比较稳妥。

7、WP-UserAgent

      升级插件版本,显示评论人的浏览器和操作系统名称,新版本增加了一些新的user agent字符串,修复了IE11的显示,增加了隐藏未知user agent字符串的功能。

8、WordPress Thread Comment

      使用AJAX技术局部刷新评论的插件,该插件启用后在Chrome的控制台里会有“Resource interpreted as Script but transferred with MIME type text/html”的警告。这是由于服务器端给浏览器发回的HTTP响应头中content-type值是text/plain(默认),而所期望返回的是JavaScript类型的,所以浏览器提示上面的警告信息。修改方法就是wp-thread-comment.js.php文件中取消对“header("Content-Type:text/javascript");”的注释,有三处,不知道作者是怎么想的,为什么好端端的写完还要再注释掉。

9、Lightbox Plus

      正文图片灯箱展示插件,该插件一大优点就是对IE6浏览器做了兼容工作,但bug也恰恰出在这儿。在我迁移完博客后,发现IE6浏览器下的灯箱展示CSS布局异常。究其原因该插件把IE6相关的配置选项保存在了wp_options表的“lightboxplus_style_path”键名里,其对应的键值就是IE6下所用到的CSS文件路径,是个绝对路径,迁移服务器后不能自动修改其绝对路径地址,故显示不正常,解决方法只能是手工修改数据库里的键值了。

10、WP-T-Wap

      生成wap手机版网页的插件,这款插件的问题比较大。先说小的修改,为了能让代码高亮显示,我安装了WP-Syntax插件,普通电脑主题上用着效果还不错,但代码显示在wap页面上就不能自动换行了,直接超出到了屏幕外面,经过排查发现是由于WP-Syntax插件对应的css文件没有在wap页面上加载,解决方法就是在index-wap2.php文件的head标签最后添加“<link rel="stylesheet" href="<?php bloginfo('template_url'); ?>/wp-syntax.css" type="text/css" media="screen" />”即可。另外我在wap页面最后添加了追踪代码供分析监控。

      然后说说大问题的,WP-T-Wap插件号称与WordPress Related Posts插件相兼容,能把相关日志列表显示在正文后面,但这个插件已经很久没有更新了,加上WordPress Related Posts插件变化又很大,导致WP-T-Wap插件的相关日志列表显示不正常,其代码块需要重写,以匹配新的函数接口和数据库字段存储方式。下面我就把需要修改的地方贴出来,覆盖位置在functions.php文件的_wp23_get_related_posts()函数体里:

<?php 
function _wp23_get_related_posts() {//改动整个函数,匹配wordpress-23-related-posts-plugin插件的新接口
	global $wpdb, $post;
	if(!$post->ID){return;}
	$now = current_time('mysql', 1);
	$tags = wp_get_post_tags($post->ID);
 
	//print_r($tags);
 
	$taglist = "'" . str_replace("'",'',str_replace('"','',urldecode($tags[0]->term_id))). "'";
	$tagcount = count($tags);
	if ($tagcount > 1) {
		for ($i = 1; $i <= $tagcount; $i++) {
			$taglist = $taglist . ", '" . str_replace("'",'',str_replace('"','',urldecode($tags[$i]->term_id))) . "'";
		}
	}
 
	$wp_rp = get_option("wp_rp");//读取配置,这里读出的是数组
	$limit = $wp_rp['wp_rp_limit'];
	if ($limit) $limitclause = "LIMIT $limit";
	$exclude = $wp_rp['wp_rp_exclude'];
	if ( $exclude != '' ) {
	$excludeclause = "AND p.ID NOT IN (SELECT tr.object_id FROM $wpdb->term_relationships tr LEFT JOIN $wpdb->term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy = 'category' AND tt.term_id REGEXP '[$exclude]')";
	}
 
	$q = "SELECT DISTINCT p.ID, p.post_title, p.post_date, p.comment_count, count(t_r.object_id) as cnt FROM $wpdb->term_taxonomy t_t, $wpdb->term_relationships t_r, $wpdb->posts p WHERE t_t.taxonomy ='post_tag' AND t_t.term_taxonomy_id = t_r.term_taxonomy_id AND t_r.object_id  = p.ID AND (t_t.term_id IN ($taglist)) AND p.ID != $post->ID AND p.post_status = 'publish' AND p.post_date_gmt < '$now' $excludeclause GROUP BY t_r.object_id ORDER BY cnt DESC, p.post_date_gmt DESC $limitclause;";
 
	//echo $q;
 
	$related_posts = $wpdb->get_results($q);
	$output = "";
 
	$wp23_RP_title = $wp_rp['wp_rp_title'];
	if(!$wp23_RP_title) $wp23_RP_title= __("Related Posts",'wp_related_posts');
 
	if (!$related_posts){
 
		$wp23_no_RP = $wp_rp['wp_no_rp'];
 
		if(!$wp23_no_RP || ($wp23_no_RP == "popularity" && !function_exists('akpc_most_popular'))) $wp23_no_RP = "text";
 
		$wp23_no_RP_text = $wp_rp['wp_no_rp_text'];
 
		if($wp23_no_RP == "text"){
			if(!$wp23_no_RP_text) $wp23_no_RP_text= __("No Related Posts",'wp_related_posts');//国际化字段之前错了,textdomain也写错了,下同
			$output  .= '<li>'.$wp23_no_RP_text .'</li>';
		}	else{
			if( function_exists('wp_random_posts') && $wp23_no_RP == "random"){
				if(!$wp23_no_RP_text) $wp23_no_RP_text= __("Random Posts",'wp_related_posts');
				$related_posts = wp_get_random_posts($limitclause);//修改调用函数接口
			}	elseif( function_exists('wp_most_commented_posts') && $wp23_no_RP == "commented"){
				if(!$wp23_no_RP_text) $wp23_no_RP_text= __("Most Commented Posts",'wp_related_posts');
				$related_posts = wp_get_most_commented_posts($limitclause);
			}	elseif( function_exists('wp_most_popular_posts') && $wp23_no_RP == "popularity"){
				if(!$wp23_no_RP_text) $wp23_no_RP_text= __("Most Popular Posts",'wp_related_posts');
				$related_posts = wp_get_most_popular_posts($limitclause);
			}else{
				return __("Something wrong",'wp_related_posts');;
			}
			$wp23_RP_title = $wp23_no_RP_text;
		}
	}
 
	foreach ($related_posts as $related_post ){
		$output .= '<li>';
 
		$show_date = $wp_rp['wp_rp_date'];
		if ($show_date){
			$dateformat = get_option('date_format');
			$output .=   mysql2date($dateformat, $related_post->post_date) . " -- ";
		}
 
		$output .=  '<a href="'._get_permalink($related_post->ID).'" title="'.wptexturize($related_post->post_title).'">'.wptexturize($related_post->post_title).'';
 
		$show_comments_count = $wp_rp['wp_rp_comments'];
		if ($show_comments_count){
			$output .=  " (" . $related_post->comment_count . ")";
		}
 
		$output .=  '</a></li>';
	}
 
 
	$output =  '<div id="infoblock"><h2>'.$wp23_RP_title .'</h2></div>'.'<div class="page"><ol id="pages">' . $output . '</ol></div>';
	return $output;
}
?>

11、Google XML Sitemaps

      升级插件版本,修复了Bing的Sitemaps提交入口,去除了雅虎搜索的提交。另外我注释掉了sitemap-core.php文件中的$this->AddElement(new GoogleSitemapGeneratorDebugEntry("generator=\"wordpress/" . get_bloginfo('version') . "\""));防止sitemap.xml文件中泄漏WordPress版本号。

 

      修改完了插件代码,最后再是iNove主题中的functions.php文件,修改了一些WordPress核心级别的功能,添加下面的代码在文件开头:

<?php
/** 禁止评论内容自动添加链接,防止广告 */
remove_filter('comment_text', 'make_clickable', 9);
 
/** 禁止wp输出版本号 */
remove_action('wp_head', 'wp_generator');
function remove_wordpress_version() { return ''; } add_filter('the_generator', 'remove_wordpress_version');
 
/** 禁用正文中自作聪明地把英文标点转换成中文标点 */
remove_filter('the_content', 'wptexturize');
 
/** 在正文最后添加版权声明 */
function feed_copyright($content)
{
    if (is_single() or is_feed()) {
        $content .= '
<blockquote>';
        $content .= '
<div>  &raquo; 转载请注明来源:<a title="' . get_bloginfo('name') . '" href="' . get_bloginfo('url') . '">' . get_bloginfo('name') . '</a> &raquo; <a rel="bookmark" title="' . get_the_title() . '" href="' . get_permalink() . '">《' . get_the_title() . '》</a></div>
 
';
        $content .= '</blockquote>
 
';
    }
    return $content;
}
add_filter('the_content', 'feed_copyright');
?>

      写完这篇日记才发现原来改动了这么多地方,还是记录下来比较好,这下博客又能欢快地奔跑好一段时间了~





 » 转载请注明来源:Terence的窝 » 《博客维护日记》
  1. 本文目前尚无任何评论.