Про прекрасный плагин для 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 . И используем его.

В итоге может получиться что-то вроде:

Только не надо в лоб копипастить, у меня там немного по другому, а этот код не проверял. Но надеюсь направление задал.

10 октября 2015 |

Есть что сказать по теме статьи? Пожалуйста - пишите!