{"id":404,"date":"2011-07-04T16:32:22","date_gmt":"2011-07-04T16:32:22","guid":{"rendered":"https:\/\/wordpress.org\/plugins-wp\/cyr3lat\/"},"modified":"2026-02-10T09:53:08","modified_gmt":"2026-02-10T09:53:08","slug":"cyr3lat","status":"publish","type":"plugin","link":"https:\/\/lo.wordpress.org\/plugins\/cyr3lat\/","author":15088096,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"3.7.3","stable_tag":"3.7.3","tested":"6.9.4","requires":"5.0","requires_php":"7.4","requires_plugins":null,"header_name":"Cyr to Lat Enhanced","header_author":"Ivijan Stefan Stipic","header_description":"","assets_banners_color":"d9eefb","last_updated":"2026-02-10 09:53:08","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/cyr3lat\/","header_author_uri":"https:\/\/www.linkedin.com\/in\/ivijanstefanstipic\/","rating":4.6,"author_block_rating":0,"active_installs":90000,"downloads":661121,"num_ratings":51,"support_threads":1,"support_threads_resolved":1,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"3.3":{"tag":"3.3","author":"karevn","date":"2011-07-04 16:45:02"},"3.3.1":{"tag":"3.3.1","author":"karevn","date":"2011-07-22 13:00:54"},"3.3.2":{"tag":"3.3.2","author":"karevn","date":"2011-07-23 18:00:38"},"3.3.3":{"tag":"3.3.3","author":"karevn","date":"2012-08-24 07:27:24"},"3.4":{"tag":"3.4","author":"webvitaly","date":"2013-09-10 08:27:59"},"3.5":{"tag":"3.5","author":"webvitaly","date":"2022-11-28 19:00:50"},"3.6":{"tag":"3.6","author":"webvitaly","date":"2022-12-25 21:48:06"},"3.7":{"tag":"3.7","author":"webvitaly","date":"2022-12-29 23:27:09"},"3.7.1":{"tag":"3.7.1","author":"ivijanstefan","date":"2026-02-01 17:25:28"},"3.7.2":{"tag":"3.7.2","author":"ivijanstefan","date":"2026-02-05 11:17:38"},"3.7.3":{"tag":"3.7.3","author":"ivijanstefan","date":"2026-02-10 09:53:08"}},"upgrade_notice":[],"ratings":{"1":3,"2":1,"3":2,"4":2,"5":43},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3451515,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3451515,"resolution":"256x256","location":"assets","locale":""},"icon-512x512.png":{"filename":"icon-512x512.png","revision":3451515,"resolution":"512x512","location":"assets","locale":""}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3454535,"resolution":"1544x500","location":"assets","locale":""},"banner-1880x609.png":{"filename":"banner-1880x609.png","revision":3454535,"resolution":"1880x609","location":"assets","locale":""},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3454535,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["3.3","3.3.1","3.3.2","3.3.3","3.4","3.5","3.6","3.7","3.7.1","3.7.2","3.7.3"],"block_files":[],"assets_screenshots":[],"screenshots":[],"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[6562,1114,562,8312,161908],"plugin_category":[48,50],"plugin_contributors":[78004,88088,125492,78005,77853,77906],"plugin_business_model":[],"class_list":["post-404","plugin","type-plugin","status-publish","hentry","plugin_tags-cyrillic","plugin_tags-russian","plugin_tags-slugs","plugin_tags-transliteration","plugin_tags-ukrainian","plugin_category-language-tools","plugin_category-media","plugin_contributors-atrax","plugin_contributors-creativform","plugin_contributors-ivijanstefan","plugin_contributors-karevn","plugin_contributors-sergeybiryukov","plugin_contributors-webvitaly","plugin_committers-creativform","plugin_committers-ivijanstefan","plugin_support_reps-creativform"],"banners":{"banner":"https:\/\/ps.w.org\/cyr3lat\/assets\/banner-772x250.png?rev=3454535","banner_2x":"https:\/\/ps.w.org\/cyr3lat\/assets\/banner-1544x500.png?rev=3454535","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/cyr3lat\/assets\/icon-128x128.png?rev=3451515","icon_2x":"https:\/\/ps.w.org\/cyr3lat\/assets\/icon-256x256.png?rev=3451515","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Cyr to Lat Enhanced automatically converts Cyrillic, European and Georgian characters in post slugs, term slugs and media file names into Latin characters.<br \/>\nIt helps maintain clean, readable and consistent URLs on WordPress sites that use non-Latin scripts.<\/p>\n\n<p>The plugin integrates directly with WordPress core sanitization (<code>sanitize_title<\/code> and <code>sanitize_file_name<\/code>) and performs transliteration at the moment slugs and filenames are generated.<br \/>\nIt does <strong>not<\/strong> modify post content, titles or front-end text. Its scope is strictly limited to URLs and file names.<\/p>\n\n<p>On activation, existing post and term slugs are converted in the background using safe, batch-based processing via WP-Cron.<br \/>\nWordPress core APIs are used to preserve permalink integrity and existing redirects.<\/p>\n\n<p>Transliteration is based on an ISO 9-style mapping table with built-in support for:\n- Russian\n- Belarusian\n- Ukrainian\n- Bulgarian\n- Macedonian\n- Georgian<\/p>\n\n<p>Locale-specific adjustments are applied automatically, and the transliteration table can be customized using a public filter.<\/p>\n\n<p>Cyr to Lat Enhanced is intentionally lightweight and focused:\n- no admin interface\n- no settings pages\n- no bidirectional conversion\n- no data collection or tracking<\/p>\n\n<p>The plugin continues the cyr2lat \/ cyr3lat lineage and remains compatible with the original approach introduced by Sergey Biryukov.<\/p>\n\n<h3>Advanced Transliteration<\/h3>\n\n<p>For advanced transliteration needs such as full content conversion, bidirectional processing, extended language rules and fine-grained control, consider the separate plugin:\nhttps:\/\/wordpress.org\/plugins\/serbian-transliteration\/<\/p>\n\n<p>That plugin is designed for complex multilingual setups and broader language processing beyond slugs and file names.<\/p>\n\n<h3>Adoption Notice<\/h3>\n\n<p>This plugin represents the continued maintenance of the original \"Cyr to Lat Enhanced\" project from the cyr3lat lineage.<\/p>\n\n<p>The project has been revived to ensure long-term stability, modern WordPress compatibility and responsible maintenance, while preserving the original behavior and purpose.<\/p>\n\n<h3>Credits<\/h3>\n\n<p>Original upstream concept: Rus-To-Lat by Anton Skorobogatov<br \/>\ncyr2lat \/ cyr3lat lineage contributors: karevn, Atrax, Sergey Biryukov, webvitaly<\/p>\n\n<p>Maintainer: Ivijan Stefan Stipic (INFINITUM FORM)<\/p>\n\n<h3>Legal Notice<\/h3>\n\n<p>This plugin is licensed under the GPLv2 or later license.<\/p>\n\n<p>All new contributions are released under the same license.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>cyr3lat<\/code> folder to the <code>\/wp-content\/plugins\/<\/code> directory.<\/li>\n<li>Activate the plugin through the \"Plugins\" menu in WordPress.<\/li>\n<li>If <code>iconv<\/code> is available on your server, it will be used as a best-effort fallback.<\/li>\n<\/ol>\n\n<p>If you experience unexpected characters in slugs, please open a support topic and include your server OS, PHP version and site locale.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"how%20can%20i%20define%20my%20own%20substitutions%3F\"><h3>How can I define my own substitutions?<\/h3><\/dt>\n<dd><p>You can modify or extend the transliteration table by using the <code>ctl_table<\/code> filter.<\/p>\n\n<p>Add this code to your theme's <code>functions.php<\/code> file:<\/p>\n\n<pre><code>function my_cyr_to_lat_table( $ctl_table ) {\n    $ctl_table['\u042a'] = 'U';\n    $ctl_table['\u044a'] = 'u';\n    return $ctl_table;\n}\nadd_filter( 'ctl_table', 'my_cyr_to_lat_table' );\n<\/code><\/pre><\/dd>\n<dt id=\"how%20can%20i%20adjust%20the%20background%20batch%20size%3F\"><h3>How can I adjust the background batch size?<\/h3><\/dt>\n<dd><p>By default, the plugin processes slugs in batches to avoid timeouts.<br \/>\nOn slower or low-memory servers, you may want to reduce the batch size.<\/p>\n\n<p>Add this code to your theme's <code>functions.php<\/code> file:<\/p>\n\n<pre><code>function my_ctl_batch_size( $size, $context ) {\n    \/\/ Apply the same batch size for posts and terms.\n    return 100;\n}\nadd_filter( 'ctl_enhanced_batch_size', 'my_ctl_batch_size', 10, 2 );\n<\/code><\/pre><\/dd>\n<dt id=\"can%20i%20modify%20the%20generated%20slugs%20after%20transliteration%3F\"><h3>Can I modify the generated slugs after transliteration?<\/h3><\/dt>\n<dd><p>Yes. You can adjust the final slug value after transliteration and normalization\nby using the <code>ctl_enhanced_sanitized_title<\/code> filter.<\/p>\n\n<p>Add this code to your theme's <code>functions.php<\/code> file:<\/p>\n\n<pre><code>function my_ctl_modify_slug( $slug, $source, $context ) {\n    \/\/ Example: append a suffix to all generated slugs.\n    return $slug . '-custom';\n}\nadd_filter( 'ctl_enhanced_sanitized_title', 'my_ctl_modify_slug', 10, 3 );\n<\/code><\/pre><\/dd>\n<dt id=\"can%20i%20modify%20media%20file%20names%20after%20transliteration%3F\"><h3>Can I modify media file names after transliteration?<\/h3><\/dt>\n<dd><p>Yes. You can adjust media file names after transliteration and normalization\nby using the <code>ctl_enhanced_sanitized_file_name<\/code> filter.<\/p>\n\n<p>Add this code to your theme's <code>functions.php<\/code> file:<\/p>\n\n<pre><code>function my_ctl_modify_filename( $filename, $source ) {\n    \/\/ Example: prepend a prefix to all media file names.\n    return 'media-' . $filename;\n}\nadd_filter( 'ctl_enhanced_sanitized_file_name', 'my_ctl_modify_filename', 10, 2 );\n<\/code><\/pre><\/dd>\n<dt id=\"what%20is%20the%20difference%20between%20cyr%20to%20lat%20enhanced%2C%20cyr2lat%20and%20transliterator%3F\"><h3>What is the difference between Cyr to Lat Enhanced, cyr2lat and Transliterator?<\/h3><\/dt>\n<dd><p>Cyr to Lat Enhanced is a continuation of the original cyr2lat \/ cyr3lat lineage.\nIts purpose is strictly limited to transliteration of post slugs, term slugs and media file names.<\/p>\n\n<p>The original <a href=\"https:\/\/wordpress.org\/plugins\/cyr2lat\/\">cyr2lat<\/a> plugin by Sergey Biryukov introduced a simple and effective way to generate Latin slugs from Cyrillic titles.\nCyr to Lat Enhanced preserves this philosophy while modernizing the codebase, improving reliability and ensuring compatibility with current WordPress versions.<\/p>\n\n<p><a href=\"https:\/\/wordpress.org\/plugins\/serbian-transliteration\/\">Transliterator<\/a> is a separate plugin with a different scope and goals.\nIt is designed for advanced and complex use cases, including:\n- transliteration of post content and front-end text\n- bidirectional conversion (Latin and Cyrillic)\n- extended language rules and exclusions\n- fine-grained control over when and where transliteration is applied<\/p>\n\n<p>Because these plugins solve different problems, they are intentionally separated.\nCyr to Lat Enhanced focuses on clean URLs and file names with zero configuration.\nTransliterator focuses on full-language processing and advanced multilingual setups.<\/p>\n\n<p>Users should choose the plugin that best matches their needs:\n- use Cyr to Lat Enhanced for simple, automatic slug and filename transliteration\n- use <a href=\"https:\/\/wordpress.org\/plugins\/serbian-transliteration\/\">Transliterator<\/a> when full content-level transliteration is required<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>3.7.3<\/h4>\n\n<ul>\n<li>Minor improvements to plugin metadata presentation in the WordPress admin.<\/li>\n<li>Improved robustness and consistency of internal admin-only logic.<\/li>\n<li>No changes to front-end behavior or existing URLs.<\/li>\n<\/ul>\n\n<h4>3.7.2<\/h4>\n\n<ul>\n<li>Added filter support for adjusting background batch size during slug conversion.<\/li>\n<li>Improved safety and flexibility of background processing for large sites.<\/li>\n<li>Refined cron cleanup on plugin deactivation.<\/li>\n<li>Minor internal code cleanup and consistency improvements.<\/li>\n<li>No changes to front-end behavior or existing URLs.<\/li>\n<\/ul>\n\n<h4>3.7.1<\/h4>\n\n<ul>\n<li>Adopted plugin maintenance and modernized codebase for current WordPress standards<\/li>\n<li>Reworked sanitize_title and sanitize_file_name hooks to use proper arguments<\/li>\n<li>Removed debug_backtrace usage to improve performance and reliability<\/li>\n<li>Replaced direct database updates with WordPress APIs (wp_update_post, wp_update_term)<\/li>\n<li>Added background batch processing for existing slugs via WP-Cron<\/li>\n<li>Improved transliteration handling with locale-aware caching<\/li>\n<li>General code cleanup and stability improvements<\/li>\n<\/ul>\n\n<h4>3.7<\/h4>\n\n<ul>\n<li>Added prepare() for every SQL query<\/li>\n<\/ul>\n\n<h4>3.6<\/h4>\n\n<ul>\n<li>Added esc_sql for SQL query<\/li>\n<\/ul>\n\n<h4>3.5<\/h4>\n\n<ul>\n<li>Removed quotes from table which added extra dashes<\/li>\n<\/ul>\n\n<h4>3.4<\/h4>\n\n<ul>\n<li>Fixes for Ukrainian characters<\/li>\n<\/ul>\n\n<h4>3.3.3<\/h4>\n\n<ul>\n<li>Bugfix: posts of status \"future\" were not affected<\/li>\n<\/ul>\n\n<h4>3.3.2<\/h4>\n\n<ul>\n<li>Added support for European diacritics<\/li>\n<\/ul>\n\n<h4>3.3.1<\/h4>\n\n<ul>\n<li>Added Georgian transliteration table<\/li>\n<li>A problem with some letters causing apostrophes in slugs was resolved<\/li>\n<\/ul>\n\n<h4>3.3<\/h4>\n\n<ul>\n<li>Internal improvements<\/li>\n<\/ul>\n\n<h4>3.2<\/h4>\n\n<ul>\n<li>Added transliteration when publishing via XML-RPC<\/li>\n<li>Fixed Invalid Taxonomy error when viewing the most used tags<\/li>\n<\/ul>\n\n<h4>3.1<\/h4>\n\n<ul>\n<li>Fixed transliteration when saving a draft<\/li>\n<\/ul>\n\n<h4>3.0<\/h4>\n\n<ul>\n<li>Added automatic conversion of existing post, page and term slugs<\/li>\n<li>Added saving of existing post and page permalinks integrity<\/li>\n<li>Added transliteration of attachment file names<\/li>\n<li>Adjusted transliteration table in accordance with ISO 9 standard<\/li>\n<li>Included Russian, Belarusian, Ukrainian, Bulgarian and Macedonian characters<\/li>\n<li>Added filter for the transliteration table<\/li>\n<\/ul>\n\n<h4>2.1<\/h4>\n\n<ul>\n<li>Optimized filter call<\/li>\n<\/ul>\n\n<h4>2.0<\/h4>\n\n<ul>\n<li>Added check for existing terms<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Updated description<\/li>\n<\/ul>\n\n<h4>1.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<\/ul>","raw_excerpt":"Converts Cyrillic, European and Georgian characters in post, term slugs and media file names into Latin characters.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/lo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/404","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/lo.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/lo.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=404"}],"author":[{"embeddable":true,"href":"https:\/\/lo.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/ivijanstefan"}],"wp:attachment":[{"href":"https:\/\/lo.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=404"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/lo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=404"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/lo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=404"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/lo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=404"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/lo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=404"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/lo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=404"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}