<?php
/*
Plugin Name: Cyr to Lat enhanced
Plugin URI: http://wordpress.org/extend/plugins/cyr3lat/
Description: Converts Cyrillic, European and Georgian characters in post, term slugs and media file names to Latin characters. Useful for creating human-readable URLs. Based on the original plugin by Anton Skorobogatov.
Author: Sol, Sergey Biryukov, Nikolay Karev, Dmitri Gogelia
Author URI: http://karevn.com/
Version: 3.3.3
*/
function ctl_sanitize_title($title) {
global $wpdb;
$iso9_table = array(
'Рђ' => 'A', 'Р‘' => 'B', 'Р’' => 'V', 'Р“' => 'G', 'Рѓ' => 'G`',
'Тђ' => 'G`', 'Р”' => 'D', 'Р•' => 'E', 'РЃ' => 'YO', 'Р„' => 'YE',
'Р–' => 'ZH', 'Р—' => 'Z', 'Р…' => 'Z', 'Р' => 'I', 'Р™' => 'J',
'Р€' => 'J', 'Р†' => 'I', 'Р‡' => 'YI', 'Рљ' => 'K', 'РЊ' => 'K`',
'Р›' => 'L', 'Р‰' => 'L', 'Рњ' => 'M', 'Рќ' => 'N', 'РЉ' => 'N`',
'Рћ' => 'O', 'Рџ' => 'P', 'Р ' => 'R', 'РЎ' => 'S', 'Рў' => 'T',
'РЈ' => 'U', 'РЋ' => 'U`', 'Р¤' => 'F', 'РҐ' => 'H', 'Р¦' => 'TS',
'Р§' => 'CH', 'РЏ' => 'DH', 'РЁ' => 'SH', 'Р©' => 'SHH', 'РЄ' => '``',
'Р«' => 'Y`', 'Р¬' => '`', 'Р' => 'E`', 'Р®' => 'YU', 'РЇ' => 'YA',
'Р°' => 'a', 'Р±' => 'b', 'РІ' => 'v', 'Рі' => 'g', 'С“' => 'g',
'Т‘' => 'g', 'Рґ' => 'd', 'Рµ' => 'e', 'С‘' => 'yo', 'С”' => 'ye',
'Р¶' => 'zh', 'Р·' => 'z', 'С•' => 'z', 'Рё' => 'i', 'Р№' => 'j',
'С' => 'j', 'С–' => 'i', 'С—' => 'yi', 'Рє' => 'k', 'Сњ' => 'k`',
'Р»' => 'l', 'С™' => 'l', 'Рј' => 'm', 'РЅ' => 'n', 'Сљ' => 'n`',
'Рѕ' => 'o', 'Рї' => 'p', 'СЂ' => 'r', 'СЃ' => 's', 'С‚' => 't',
'Сѓ' => 'u', 'Сћ' => 'u`', 'С„' => 'f', 'С…' => 'h', 'С†' => 'ts',
'С‡' => 'ch', 'Сџ' => 'dh', 'С€' => 'sh', 'С‰' => 'shh', 'СЉ' => '``',
'С‹' => 'y`', 'СЊ' => '`', 'СЌ' => 'e`', 'СЋ' => 'yu', 'СЏ' => 'ya'
);
$geo2lat = array(
'бѓђ' => 'a', 'бѓ‘' => 'b', 'бѓ’' => 'g', 'бѓ“' => 'd', 'бѓ”' => 'e', 'бѓ•' => 'v',
'бѓ–' => 'z', 'бѓ—' => 'th', 'бѓ' => 'i', 'бѓ™' => 'k', 'бѓљ' => 'l', 'бѓ›' => 'm',
'бѓњ' => 'n', 'бѓќ' => 'o', 'бѓћ' => 'p','бѓџ' => 'zh','бѓ ' => 'r','бѓЎ' => 's',
'ტ' => 't','უ' => 'u','ფ' => 'ph','ქ' => 'q','ღ' => 'gh','ყ' => 'qh',
'бѓЁ' => 'sh','бѓ©' => 'ch','бѓЄ' => 'ts','бѓ«' => 'dz','бѓ¬' => 'ts','бѓ' => 'tch',
'бѓ®' => 'kh','бѓЇ' => 'j','бѓ°' => 'h'
);
$iso9_table = array_merge($iso9_table, $geo2lat);
$locale = get_locale();
switch ( $locale ) {
case 'bg_BG':
$iso9_table['Р©'] = 'SHT';
$iso9_table['С‰'] = 'sht';
$iso9_table['РЄ'] = 'A`';
$iso9_table['СЉ'] = 'a`';
break;
case 'uk':
$iso9_table['Р'] = 'Y`';
$iso9_table['Рё'] = 'y`';
break;
}
$is_term = false;
$backtrace = debug_backtrace();
foreach ( $backtrace as $backtrace_entry ) {
if ( $backtrace_entry['function'] == 'wp_insert_term' ) {
$is_term = true;
break;
}
}
$term = $is_term ? $wpdb->get_var("SELECT slug FROM {$wpdb->terms} WHERE name = '$title'") : '';
if ( empty($term) ) {
$title = strtr($title, apply_filters('ctl_table', $iso9_table));
if (function_exists('iconv')){
$title = iconv('UTF-8', 'UTF-8//TRANSLIT//IGNORE', $title);
}
$title = preg_replace("/[^A-Za-z0-9'_\-\.]/", '-', $title);
$title = preg_replace('/\-+/', '-', $title);
$title = preg_replace('/^-+/', '', $title);
$title = preg_replace('/-+$/', '', $title);
} else {
$title = $term;
}
return $title;
}
add_filter('sanitize_title', 'ctl_sanitize_title', 9);
add_filter('sanitize_file_name', 'ctl_sanitize_title');
function ctl_convert_existing_slugs() {
global $wpdb;
$posts = $wpdb->get_results("SELECT ID, post_name FROM {$wpdb->posts} WHERE post_name REGEXP('[^A-Za-z0-9\-]+') AND post_status IN ('publish', 'future', 'private')");
foreach ( (array) $posts as $post ) {
$sanitized_name = ctl_sanitize_title(urldecode($post->post_name));
if ( $post->post_name != $sanitized_name ) {
add_post_meta($post->ID, '_wp_old_slug', $post->post_name);
$wpdb->update($wpdb->posts, array( 'post_name' => $sanitized_name ), array( 'ID' => $post->ID ));
}
}
$terms = $wpdb->get_results("SELECT term_id, slug FROM {$wpdb->terms} WHERE slug REGEXP('[^A-Za-z0-9\-]+') ");
foreach ( (array) $terms as $term ) {
$sanitized_slug = ctl_sanitize_title(urldecode($term->slug));
if ( $term->slug != $sanitized_slug ) {
$wpdb->update($wpdb->terms, array( 'slug' => $sanitized_slug ), array( 'term_id' => $term->term_id ));
}
}
}
function ctl_schedule_conversion() {
add_action('shutdown', 'ctl_convert_existing_slugs');
}
register_activation_hook(__FILE__, 'ctl_schedule_conversion');
?>