Wordpress: плагин переводчик заголовков
Позавчера можно сказать девственности лишился, написал свой первый плагин под WordPress. Функционал не сложный, но нужный. Когда сохраняешь статью ссылка делается из названия с удалением всяких нецензурных символов и заменой пробелов на тире. Но никто же своим страницам не даёт русские ссылки, это плохо во-первых для SEO, а во-вторых просто не читабельно потому что буквы преобразуются в ASCII коды, да еще и по 6 символов на букву! Так например слово 'бля' будет зашифровано как %d0%b1%d0%bb%d1%8f. А переводить каждый раз руками все заголовки лень, вот я и прикрутил свой Google Transtator к WordPress'у.
Естественно я сначала попытался найти плагин реализующий подобный функционал в репозитории WordPress'а, но там был только перевод с китайского на английский, что мне немного не подходило ;). Поскольку опыта в написании плагинов под WordPress у меня не было я взял за основу именно этот плагин выкинув из него все лишнее, на мой взгляд и дополнив его своим Google Transtator'ом. Получилось я думаю не очень плохо, зато я переписал его под PHP5и поправил объектную модель. Все что у меня получилось вы можете увидеть ниже.
<?php
/*
Plugin Name: TitleTranslate
Plugin URI: http://mabp.kiev.ua/2009/03/28/wordpress-plugin-title-translator/
Version: 1.0
Description: Translate title fot permanent link
Author: CTAPbIu_MABP
Author URI: http://mabp.kiev.ua/
*/
if(!class_exists('TitleTranslate')):
class TitleTranslate{
private $slug_name;
private $slug_title;
public function __construct($wp_version){
add_filter('title_save_pre', array(&$this,'get_from_title'), 0);
add_filter('name_save_pre', array(&$this,'put_to_name'), 0);
if($wp_version > 2.4 && strpos($_SERVER['REQUEST_URI'], 'admin-ajax.php') && $_POST['action'] === 'sample-permalink'){
add_filter('sanitize_title', array(&$this,'ajax_slug'),0);
}
}
public function ajax_slug($name){
remove_filter('sanitize_title', array(&$this,'ajax_slug'), 0);
$name = $this->put_to_name($name);
add_filter('sanitize_title', array(&$this,'ajax_slug'), 0);
return $name;
}
public function get_from_title($title){
$this->slug_name = '';
$this->slug_title = $title;
return $title;
}
public function put_to_name($name){
if(!empty($this->slug_name))
return $this->slug_name;
if(empty($name) && !empty($this->slug_title))
$name = $this->slug_title;
$translation = $this->translate($name);
$translation = sanitize_user(sanitize_title($translation), true);
return $translation ? $translation : $name;
}
public function translate($str, $from='ru', $to='en'){
$fp = fsockopen("www.google.com", 80, $errno, $errstr, 30);
if (!$fp) {
//trigger_error("$errstr ($errno)<br />\n", E_USER_WARNING);
return "";
} else {
$out = "GET /translate_a/t?client=t&sl=".$from."&tl=".$to."&text=".urlencode($str)." HTTP/1.1\r\n";
$out .= "Host: www.google.com\r\n";
$out .= "User-Agent: Mozilla/5.0\r\n";
$out .= "Accept-Encoding: deflate\r\n";
$out .= "Connection: Close\r\n\r\n";
fputs($fp, $out);
$res = "";
while (!feof($fp)) {
$res .= fgets($fp, 1024);
}
fclose($fp);
}
$res = explode("\r\n\r\n",$res);
$res = explode("\r\n",$res[1]);
return substr($res[1],0,1) == '[' ?
substr($res[1],2,strpos($res[1],'"',2)-2) :
substr($res[1],1,-1);
}
}
endif;
new TitleTranslate($wp_version);
?>
А если кто-то захочет скачать то вот ссылка на файл. Устанавливается так же как и все остальные плагины копированием *.php файла в папку wp-content/plugins.
ps. чего не спишь?