发布一个将WordPress标题批量转换成另一种语言的插件

背景描述

最近一直在帮助陈良乔(imcc)维护他的博客——『有{间}客栈』。因为文章都是从博客大巴导过来的,所以文章的标题都是采用的中文方式。中文编码虽然现在不少浏览器、搜索引擎都能识别,但是遇到浏览器没有设置编码的情况下,乱七八糟看起来多少有点不爽。我推荐他使用了 wp slug translate,新的文章可以顺利转换,但是对老文章就无能为力了。

网上搜了一下,有个叫 cos slug converter 的插件可以批量翻译,但是试用了一下,版本太老了,google的翻译接口已经有了些变化。所以我受这两个插件的启发,合并了一下代码,做了这个插件 wp slug converter,现在发布给大家。

安装与使用

  1. 下载这个zip,在 WordPress 后台上传,并启用
  2. 在后台编辑插件,主要有这么三个地方需要注意。
    • 第一个是第 21 行的 langpair,这个是用来设定翻译类型的,这里默认将中文翻译成英文。
    • 第二个是第 44 行的 $per,这个变量限定了每次翻译的标题数量,毕竟一次数量太多可能会被 google 屏蔽。
    • 第三个是第 70 行 </script> 前面的数字,这里我写的是5000,意思是每5秒自动翻译下一页。
  3. 使用的时候很简单,假设你的blog域名是 http://example.com,那么只要打开 http://example.com/?tran=1 ,就开始自动翻页了

源码

源码采用 GPLv2 方式发布,与 WordPress 保持一致。

<?php
/*
Plugin Name:Wp slug converter
Plugin URI: http://ironblood.net/2012/03/23/wp-slug-converter
Description: 批量中文标题翻译成英语,使用方法:
             请参见 http://ironblood.net/2012/03/23/wp-slug-converter
Version: 1.0
Author: IronBlood
date:2012-03-23
Author URI:http://ironblood.net
*/
if( !class_exists("Snoopy") )
	require_once (ABSPATH."/wp-includes/class-snoopy.php");

function wp_translate_ib($text){
	$snoopy = new Snoopy;

	$url="http://translate.google.com/translate_t?langpair=zh|en";
	$submit_vars["text"] = $text;
	$submit_vars["ie"] = "UTF8"; 
	$submit_vars["hl"] = "zh-CN"; 
        // 翻译的类型,前面是原语言,后者是翻译后的语言
	$submit_vars["langpair"] = "zh|en"; 
	$snoopy->agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11';
	
	$snoopy->submit($url,$submit_vars);
	$htmlret = $snoopy->results;

	if(preg_match('/<div.*?id\s*=\s*("|\')?\s*result_box\s*("|\')?.*?>/ius', $htmlret, $matchs) == 1){
		$out = explode($matchs[0],$htmlret);
		unset($matchs);
		$out = explode('</div>',$out[1]);
		$name_tmp = sanitize_user(sanitize_title($out[0]), true);
		
		unset($out,$htmlret);

	}

	return $name_tmp;
}

function conv_batconvert(){
	header("Content-Type: text/html; charset=UTF-8");
	echo "<style>a,td,div{font-size:12px;}</style>";
	if( $_GET['tran'] =='') return true;
	$per = 10; // 每次翻译的条数
	if( $_GET['page'] < 1)$_GET['page'] =1;
	$begin = $_GET['page'] * $per - $per ; 
	global $wpdb  ;		
	$tableposts = $wpdb->posts;
	$sql = "SELECT post_title,post_name ,ID FROM $tableposts WHERE post_status = 'publish'   AND   post_type='post' limit $begin , $per";		
	$titleSel = $wpdb->get_results($sql);
	$i = 0;
	echo "<table border='1'><tr><td><b>原标题</b></td><td><b>翻译标题</b></td></tr>";
	
	foreach ($titleSel as $TS) {
		/* start */
		$slug = sanitize_title( wp_translate_ib($TS->post_title) );
		$sql ="UPDATE ".$tableposts." SET `post_name` = '".$slug."' WHERE ID =$TS->ID;";		
		if( strlen($slug) > 4 ) $res = $wpdb->get_results($sql);
		echo "<tr><td>".$TS->post_title."</td><td>".$slug."</td></tr>";
		$i ++ ;
	}

	echo "</table>";
	
	$page = $_GET['page'] + 1;
	
	if( $i == $per  ) {
		echo "<a href='?tran=1&page=".$page."'>下一页 </a>";
		echo "<div>防止google临时屏蔽IP,所以一次只翻译(".$per .")篇之,<b>请稍等10秒钟</b>左右手动点击下一页</div>";
		echo "<script language=\"javascript\">setTimeout(\"window.location.href='?tran=1&page=".$page."'\",5000)</script>";
	}
	else {
		echo "<div>已经转换完毕</div>";
	}
	
	die();
}

add_action('init', 'conv_batconvert');

发布一个将WordPress标题批量转换成另一种语言的插件》上有14条评论

  1. Pingback引用通告: IronBlood on “Wp slug converter” | Wordpress NETHERLANDS WordPress

  2. Spunsugar CHINA Google Chrome Windows

    反馈一个问题,这个插件在定义函数function conv_batconvert()时,往网页里面写了CSS规则,由于插入位置位于声明之前,会导致RSS失效,希望博主能修复下,或者直接删除也可以的,无非是效果不好看了,但是RSS就正常了。

    回复
    1. IronBlood CHINA Mozilla Firefox Mac OS 文章作者

      Hi, Spunsugar

      我仔细回看了一下代码,不是非常明白您说的意思是什么,我解释一下代码逻辑:

      1. 您看到的 style 说的是第 42 行的那个吗?它仅仅是为了给插件输出结果增加一点样式。(请抱歉我懒,一年多了也没想着做个像样的界面 ;-))
      2. 代码中,对于标题的更新,仅仅是针对全局对象 $wpdb->postspost_name 字段,理论上来说,影响的是 RSS 的链接地址吧?

      您说的 RSS 失效,是指转换之后,点击RSS的链接无法跳转到正确的页面,还是其他什么现象呢?可否详细描述一下。谢谢!

      回复
  3. Pingback引用通告: 关于Wp slug converter导致RSS失效的问题及解决方法 | 雅阁啦 WordPress

  4. quqiu CHINA Mozilla Firefox Windows

    博主你好,请问可以做一个去掉翻译功能的版本嘛
    我有一个英文站,标题都是英文的
    我想直接调用标题用作slug而省略翻译的步骤
    谢谢

    回复
    1. IronBlood CHINA Mozilla Firefox Mac OS 文章作者

      WordPress 默认就是直接拿标题来做slug的,我不是很明白您的需求是什么,是不是批量导入文章后,再批量生成slug呢?

      回复
    1. IronBlood Mozilla Firefox Windows 文章作者

      自动翻译请用 wp slug translate 这个插件,我这个是后台批量翻译用的

      回复
      1. IronBlood CHINA Mozilla Firefox Windows 文章作者

        可能 google 换新的接口了,不过最近精力不在 WordPress 上了,所以抱歉。如果您需要单篇文章的翻译,可以使用 wp slug translate。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>