Про прекрасный плагин для WordPress Jexr я уже писал. Один из немногих плагинов которые я использую на всех проектах на вп уже далеко не первый год. Его нет в репозитории, автор давно его забросил ( но за плагин ему реально большой респект ) и периодически с ним вылезают косяки. Последнее что вылезло это проблема с доменами на кириллице ( всякие мой-сайт.рф ). Для меня вообще странно кому в голову приходит брать кириллические домены в зоне .рф для не государственных сайтов, однако проблема есть и её надо решать.
А проблема в функции wp_redirect(), по сути вордпрессовская обертка над header(«Location: $location», true, $status); . Но перед отправкой заголовка с локейшеном wp_redirect прогоняет адрес через $location = wp_sanitize_redirect($location);, которая отчасти обертка над $location = preg_replace(‘|[^a-z0-9-~+_.?#=&;,/:%!]|i’, », $location); , в итоге при редиректе через wp_redirect вся кириллица вырезается.
Самым легким выходом кажется делать редирект не через wp_redirect, а напрямую через header(«Location, без чистки. Однако этот способ не работает, даже с urlencode. В разных способах разные ошибки, но не работает. Гугление предложило варианты использования вместо urlencode iconv, но не пробовал. Есть более правильный вариант. Нужно преобразовать кириллический урл в ascii формат.
Если у вас на хостинге PHP >= 5.3 то все просто — используем функцию idn_to_ascii, и отконверченое отдаем wp_redirect. Если у вас 5.2, то там этой функции нет. Поэтому ищем класс idna_convert.class.php . И используем его.
В итоге может получиться что-то вроде:
1 2 3 4 5 6 7 |
if(preg_match('/[А-Яа-я]/u', $url)){ require_once('idna_convert.class.php'); $IDN = new idna_convert(); header("Location: ".$IDN->encode_uri($url), true, 302); }else{ wp_redirect($url, 302); } |
Только не надо в лоб копипастить, у меня там немного по другому, а этот код не проверял. Но надеюсь направление задал.