Как создать плагин транслитерации URL для WordPress

Как создать плагин транслитерации URL для WordPress

Введение

В этой статье я расскажу, как создать простой WordPress плагин для автоматической транслитерации кириллических URL в латиницу. Это решает проблему нечитаемых ссылок вида %D0%BA%D0%B0%D0%BA-%D1%81%D0%B4%D0%B5%D0%BB%D0%B0%D1%82%D1%8C.

Проблема

По умолчанию WordPress создаёт URL из заголовка записи. Если заголовок на русском, URL будет содержать кириллицу, которая в браузере отображается как закодированные символы:

  • Было: /как-сделать-липкий-сайдбар//%D0%BA%D0%B0%D0%BA-%D1%81%D0%B4%D0%B5%D0%BB%D0%B0%D1%82%D1%8C/
  • Стало: /kak-sdelat-lipkiy-saydbar/

Решение — создаём плагин

Шаг 1: Создаём папку плагина

Создаём папку dekanpro-transliterate в директории /wp-content/plugins/

Шаг 2: Создаём главный файл плагина

Создаём файл dekanpro-transliterate.php в папке плагина:

<?php
/**
 * Plugin Name: DekanPro Transliterate
 * Description: Транслитерация кириллических URL в латиницу
 * Version: 1.0.0
 * Author: DekanPro
 */

if (!defined('ABSPATH')) {
    exit;
}

class DekanPro_Transliterate {

    // Таблица транслитерации
    private static $table = array(
        'а' => 'a',   'б' => 'b',   'в' => 'v',
        'г' => 'g',   'д' => 'd',   'е' => 'e',
        'ё' => 'yo',  'ж' => 'zh',  'з' => 'z',
        'и' => 'i',   'й' => 'y',   'к' => 'k',
        'л' => 'l',   'м' => 'm',   'н' => 'n',
        'о' => 'o',   'п' => 'p',   'р' => 'r',
        'с' => 's',   'т' => 't',   'у' => 'u',
        'ф' => 'f',   'х' => 'h',   'ц' => 'ts',
        'ч' => 'ch',  'ш' => 'sh',  'щ' => 'sch',
        'ъ' => '',    'ы' => 'y',   'ь' => '',
        'э' => 'e',   'ю' => 'yu',  'я' => 'ya',
    );

    public static function init() {
        add_filter('sanitize_title', array(__CLASS__, 'transliterate'), 9);
        add_filter('sanitize_file_name', array(__CLASS__, 'transliterate'), 9);
    }

    public static function transliterate($title) {
        // Добавляем заглавные буквы
        $table = self::$table;
        foreach ($table as $cyr => $lat) {
            $table[mb_strtoupper($cyr)] = ucfirst($lat);
        }
        
        // Транслитерация
        $title = strtr($title, $table);
        
        // Очистка
        $title = preg_replace('/[^a-zA-Z0-9\-_.]/', '-', $title);
        $title = preg_replace('/-+/', '-', $title);
        $title = trim($title, '-');
        $title = strtolower($title);
        
        return $title;
    }
}

DekanPro_Transliterate::init();

Шаг 3: Активируем плагин

Переходим в админку WordPress → Плагины → Находим «DekanPro Transliterate» → Нажимаем «Активировать»

Как это работает

sanitize_title">Фильтр sanitize_title

WordPress вызывает функцию sanitize_title() каждый раз, когда нужно создать slug из заголовка. Мы подключаемся к этому фильтру с приоритетом 9 (до стандартной обработки):

add_filter('sanitize_title', array(__CLASS__, 'transliterate'), 9);

strtr">Функция strtr()

PHP-функция strtr() заменяет символы по таблице соответствия. Это самый быстрый способ транслитерации:

$title = strtr($title, $table);
// "Привет" → "Privet"

Очистка строки

После транслитерации убираем все символы кроме букв, цифр и дефисов:

$title = preg_replace('/[^a-zA-Z0-9\-_.]/', '-', $title);

Структура файлов

wp-content/
└── plugins/
    └── dekanpro-transliterate/
        └── dekanpro-transliterate.php

Таблица транслитерации

Используется стандарт ГОСТ 7.79-2000:

а→a б→b в→v г→g д→d
е→e ё→yo ж→zh з→z и→i
й→y к→k л→l м→m н→n
о→o п→p р→r с→s т→t
у→u ф→f х→h ц→ts ч→ch
ш→sh щ→sch ы→y э→e ю→yu
я→ya ъ→ ь→

Заключение

Теперь все новые записи будут автоматически получать читаемые латинские URL. Плагин также транслитерирует имена загружаемых файлов.

Комментарии

Пока нет комментариев. Станьте первым!

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *