Рекомендации по реализации поддержки кириллических EAI-адресов в CMS WordPress

Как вам может быть известно из личного опыта или из описания в каталоге продуктов на нашем сайте, одна из самых популярных в мире систем управления контентом – CMS WordPress пока не поддерживает интернационализированные адреса электронной почты (далее - EAI-адреса ), а также имена пользователей, содержащие нелатинские символы.

Эта проблема уже более 5 лет обсуждается в сообществе контрибуторов, однако разработчики продукта продолжают считать ее маловажной и исключают ее решение из свежих релизов продукта.

Однако, если вы хотите включить поддержку кириллических или других видов EAI-адресов в WordPress на сайте своего проекта, то сможете это сделать относительно легко при помощи наших рекомендаций.

Ядро CMS WordPress, в том числе класс для работы с электронной почтой PHPMailer, поддерживает адреса электронной почты с Unicode символами, а использование нелатинских символов в адресах электронной почты запрещено только на уровне валидаторов и санитайзеров.

Такие запреты установлены в /wp-includes/formatting.php функций:

  • sanitize_user() – оформляет имя пользователя в соответствии с кодексом WordPress;
  • sanitize_email() – оформляет e-mail в соответствии с правилами для латинских адресов электронной почты при помощи функции is_email(), которая также используется для проверки допустимого формата адресов электронной почты в других местах продукта.

Изменить функцию sanitize_user() для работы с кириллическими именами пользователя просто – нужно лишь добавить в регулярные выражения, используемые для проверки допустимого формата имени, символы необходимых вам алфавитов.

Чтобы избежать работы со множеством регулярных выражений для проверки имени пользователя, а также локальной и доменной частей EAI-адресов, предлагается их определить в отдельные константы и разместить в файле /wp-includes/default-constants.php

  • WP_IDN_LOCAL_MAIL_REGEX – для локальной части EAI-адреса (до знака @);
  • WP_IDN_DOMAIN_REGEX – для всех доменов, в том числе и доменной части EAI-адреса (после знака @);
  • WP_IDN_USERNAME_REGEX и WP_IDN_STRICT_USERNAME_REGEX – для имени пользователя.

В default-constants.php, при необходимости, вы можете добавить алфавиты других языков, используемых в IDN-доменах, с которыми вы хотите организовать работу на сайте.

Изменить функцию sanitize_email() чуть сложнее.

Во-первых, нужно переписать все валидаторы в is_email() и самой sanitize_email() с использованием в регулярных выражениях либо алфавитов необходимых вам IDN-доменов и EAI-адресов, либо констант WP_IDN_LOCAL_MAIL_REGEX для локальной и WP_IDN_DOMAIN_REGEX для доменной части EAI-адреса.

Во-вторых, в самой функции sanitize_email() нужно добавить проверку доменной части e-mail на наличие Punycode и преобразование его в Unicode, так как «Лучшие практики разработки ПО, поддерживающего универсальное принятие» рекомендуют, чтобы IDN-домены хранились и отображались именно в Unicode, а WordPress в ряде случаев автоматически транслирует их в Punycode.

Для решения этой задачи предлагается добавить в formatting.php функции is_punycode() и decode_punycode(), обеспечивающие проверку и преобразование доменного имени (причем последняя вызывается из sanitize_email() ).

При этом преобразование Unicode в Punycode при отправке письма класс PHPMailer осуществляет автоматически.

При внесении этих изменений, вы сможете добавлять пользователей с кириллическими (и символами других алфавитов после изменения констант) именами, а также использовать кириллические EAI-адреса электронной почты. При этом кириллические EAI-адреса, а также IDN-домены, будут отображаться в интерфейсе CMS WordPress в Unicode.

Важно помнить, что изменения функций sanitize_email(), is_email() и sanitize_user() затрагивают основной код CMS WordPress и будут заменены при автоматическом обновлении системы, после чего их придется восстанавливать.