WordPress 2.5插件大奖赛赛果

WordPress 2.5插件大赛终于在WordPress 2.6.2发布后公布了赛果。奖项很令人羡慕,不过还是关注一下得奖的插件比较实际。

除了两个wpmu相关的插件以外。还有四个奖项是颁给独立WordPress插件的。
这四个奖项是:

安慰奖:Prelovac
这个奖项有点奇怪,链接过去是一个blog而不是插件的页面。过去一看,发现他的blog被某个.cn域名使用者入侵了。 😳

三奖:WP Easy Uploader
这个插件是很值得一用的。她可以让你轻松地上传文件到你的wordpress上,更重要的是你可以选择上传压缩文件到指定的文件夹中并进行解压缩,也就是说你可以直接复制WordPress官方插件站中的压缩包链接到输入框中,然后直接上传解压缩到你的WordPress的插件文件夹中。当然主题也是可以的。这些平时要登录cpanel或ftp的工夫省下不少 😀
wp easy uploader plugin

二奖:Manageable
同样是值得一用的插件。可以在文章、页面的管理区快速地修改文章的各项参数:日期、标题、作者、分类、标签等。没看明白我说什么?点击图片查看具体的形式吧。
manageable wordpress plugin

头奖:WP Comment Remix
为comment区增加多个函数,回复、引用、为comment增加标签等。可惜在点击引用后得到的结果是中文出现乱码 🙁

下次大赛看看能不能插一腿,奖项太诱人了 😈

修正一种特殊的乱码问题

最近在使用sNews的过程中遇到一种特殊的乱码显示问题,表现为:用firefox浏览网页,该网页中的中文字符显示为乱码,但查看它的源代码却发现其中的中文字符是正常的,而且还有正确的meta指定其编码为’utf8’(<meta http-equiv="Content-Type" content="text/html;charset=utf8" />),如果在浏览器中选择编码’utf8’,网页显示正常,但刷新后,网页再次显示为乱码。

很显然,这个乱码显示问题是由于浏览器没有正确指定编码导致的。看了一下代码,发现<meta http-equiv="Content-Type" content="text/html;charset=utf8" />是由title()函数添加到模板中的,可能在此前,浏览器已为网页分配编码,但不能找到meta指定的编码,只能为该网页分配为GB2312,因此页面显示出现乱码,而源代码却是正常的。

解决的方法很简单,只需在程序开始后马上为其指定编码就行了,也即是在index.php的第二行加入<php header('content-type:text/html;charset=utf8'); ?>一句后保存即可。此时再刷新,网页已不会显示乱码了。

latin1_swedish_ci to utf8_general_ci

从旧主机搬到新主机最烦人的就是乱码问题。这也是个由来已久的问题了。
wordpress 2.2开始,wordpress提供DB_CHARSET和DB_COLLATE这两个参数以便我们更好地解决这个问题。但似乎这些并不够,仍旧会产生这样那样的问题,如Warning: Invalid argument supplied for foreach() in D:\xampp\htdocs\wordpress\wp-includes\classes.php on line 88。最根本的解决应该还是把数据库里的数据由latin1_swedish_ci格式转换成utf8_general_ci格式。
wordpress官方的论坛就像wordpress那样,很有人气。你遇到的问题,很可能里面已经有人讨论过并已经解决了。乱码问题这个很热门的问题,当然也是完美地解决了地。
以下方法涉及数据库修改,请在备份数据库后操作!
解决的方法是这样的:
1. 下载g30rg3_x提供的这个plugin;
2. 确保你的wordpress是2.2.x或2.1.x,因为这个plugin只支持这两个系列的版本;
3. 上传到plugins文件夹并激活;
4. 到’UTF-8 Database Converter’菜单中按照提示进行剩余操作即可。

上面的办法多了不少的限制,如wordpress的版本需是2.2.x或2.1.x,并能保证你的wordpress还能登录!(是的,很可能你的wordpress这时已经不能登录了。)
这时我们可以借用一下g30rg3_x提供的UTF8_DB_Converter_DoIt()函数:

<?php
define('DB_NAME', 'putyourdbnamehere');    // 数据库名
define('DB_USER', 'usernamehere');     // MySQL用户名
define('DB_PASSWORD', 'yourpasswordhere'); // 密码
define('DB_HOST', 'localhost');    // 很大可能你无需修改此项

function UTF8_DB_Converter_DoIt() {
	$tables = array();
	$tables_with_fields = array();

	// Since we cannot use the WordPress Database Abstraction Class (wp-db.php),
	// we have to make an a stand-alone/direct connection to the database.
	$link_id = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD) or die('Error establishing a database connection');
	mysql_select_db(DB_NAME, $link_id);

	// Gathering information about tables and all the text/string fields that can be affected
	// during the conversion to UTF-8.
	$resource = mysql_query("SHOW TABLES", $link_id);
	while ( $result = mysql_fetch_row($resource) )
		$tables[] = $result[0];

	if ( !empty($tables) ) {
		foreach ( (array) $tables as $table ) {
			$resource = mysql_query("EXPLAIN $table", $link_id);
			while ( $result = mysql_fetch_assoc($resource) ) {
				if ( preg_match('/(char)|(text)|(enum)|(set)/', $result['Type']) )
					$tables_with_fields[$table][$result['Field']] = $result['Type'] . " " . ( "YES" == $result['Null'] ? "" : "NOT " ) . "NULL " .  ( !is_null($result['Default']) ? "DEFAULT '". $result['Default'] ."'" : "" );
			}
		}

		// Change all text/string fields of the tables to their corresponding binary text/string representations.
		foreach ( (array) $tables as $table )
			mysql_query("ALTER TABLE $table CONVERT TO CHARACTER SET binary", $link_id);

		// Change database and tables to UTF-8 Character set.
		mysql_query("ALTER DATABASE " . DB_NAME . " CHARACTER SET utf8", $link_id);
		foreach ( (array) $tables as $table )
			mysql_query("ALTER TABLE $table CONVERT TO CHARACTER SET utf8", $link_id);

		// Return all binary text/string fields previously changed to their original representations.
		foreach ( (array) $tables_with_fields as $table => $fields ) {
			foreach ( (array) $fields as $field_type => $field_options ) {
				mysql_query("ALTER TABLE $table MODIFY $field_type $field_options", $link_id);
			}
		}

		// Optimize tables and finally close the mysql link.
		foreach ( (array) $tables as $table )
			mysql_query("OPTIMIZE TABLE $table", $link_id);
		mysql_close($link_id);
	} else {
		die('<strong>There are no tables?</strong>');
	}

	return true;
}
UTF8_DB_Converter_DoIt();
?>

现在你把上面代码保存到一个php文件中,上传至空间并运行,如无意外你的数据已经完成了latin1_swedish_ci到utf8_general_ci转换。

wordpress导入后出现乱码之解决

昨天下了wamp5,准备再好好学学PHP和玩一下wordpress。
没想到一来就弄个麻烦的~从空间上备份的数据,导入到本地数据库后,竟然是一堆乱码(形如:????),自己是搞鼓了一整天(试了几乎所以相关的utf8编码都是不行)也是没搞定。
自己搞不定就找人问吧。来到海豚在google论坛上建的论坛上发言,下午海豚告诉我在苛世录上可找到解决办法,跟去→桑林志Windix’s Weblog阿修的部落格
原因是:

从MySQL 4.1开始引入的多语言支持确实很棒,而且一些特性已经超过了其他的数据库系统。不过我在测试过程中发现使用适用于MySQL 4.1之前的PHP语句操作MySQL数据库会造成乱码,即使是设置过了表字符集也是如此。我读了一下新的MySQL在线手册中第十章”Character Set Support“后终于找到了解决方法并测试通过。

MySQL 4.1的字符集支持(Character Set Support)有两个方面:字符集(Character set)和排序方式(Collation)。对于字符集的支持细化到四个层次: 服务器(server),数据库(database),数据表(table)和连接(connection)。

当我们按照原来的方式通过PHP存取MySQL数据库时,就算设置了表的默认字符集为utf8并且通过UTF-8编码发送查询,你会发现存入数据库的仍然是乱码。问题就出在这个connection连接层上。解决方法是在发送查询前执行一下下面这句:

SET NAMES 'utf8';

解决办法是:
一、导入数据时,新建的数据库collation (校勘/整理)项选择为utf8_general_ci;
二、修改wp-includes/wp-db.php为

$this->dbh = @mysql_connect($dbhost,$dbuser,$dbpassword);
//加上下面這行
$this->query("SET NAMES 'utf8' ");

至此,问题解决。