如何覆盖/扩展WordPress函数IS_EMAIL

时间:2019-01-28 作者:Sam

所以wordpress的核心并没有真正更新unicode域的电子邮件许可。即使是像德语umlauts(äÄöÖÜß)这样的简单特殊字符也不允许出现在名称的域部分。

因此,我一直在考虑向is\\U电子邮件功能添加一个具有高优先级的过滤器,并简单地返回结果。但它似乎并没有像我预期的那样发挥作用。以下是我尝试过的:

// Code written in my themes functions.php
function kk_email_validation_override( $email )
{
    $pattern = \'/^(?!(?:(?:\\\\x22?\\\\x5C[\\\\x00-\\\\x7E]\\\\x22?)|(?:\\\\x22?[^\\\\x5C\\\\x22]\\\\x22?)){255,})(?!(?:(?:\\\\x22?\\\\x5C[\\\\x00-\\\\x7E]\\\\x22?)|(?:\\\\x22?[^\\\\x5C\\\\x22]\\\\x22?)){65,}@)(?:(?:[\\\\x21\\\\x23-\\\\x27\\\\x2A\\\\x2B\\\\x2D\\\\x2F-\\\\x39\\\\x3D\\\\x3F\\\\x5E-\\\\x7E]+)|(?:\\\\x22(?:[\\\\x01-\\\\x08\\\\x0B\\\\x0C\\\\x0E-\\\\x1F\\\\x21\\\\x23-\\\\x5B\\\\x5D-\\\\x7F]|(?:\\\\x5C[\\\\x00-\\\\x7F]))*\\\\x22))(?:\\\\.(?:(?:[\\\\x21\\\\x23-\\\\x27\\\\x2A\\\\x2B\\\\x2D\\\\x2F-\\\\x39\\\\x3D\\\\x3F\\\\x5E-\\\\x7E]+)|(?:\\\\x22(?:[\\\\x01-\\\\x08\\\\x0B\\\\x0C\\\\x0E-\\\\x1F\\\\x21\\\\x23-\\\\x5B\\\\x5D-\\\\x7F]|(?:\\\\x5C[\\\\x00-\\\\x7F]))*\\\\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-+[a-z0-9äÄüÜöÖß]+)*\\\\.){1,126}){1,}(?:(?:[a-z][a-z0-9äÄüÜöÖß]*)|(?:(?:xn--)[a-z0-9äÄüÜöÖß]+))(?:-+[a-z0-9äÄüÜöÖß]+)*)|(?:\\\\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\\\\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\\\\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\\\\]))$/iD\';

    if (preg_match($pattern, $email)) {
        return trim(strtolower($email));
    }

    return false;
}
add_filter(\'is_email\', \'kk_email_validation_override\', 99, 4);
但出于某种原因,最初的wordpressis_email() 仍在通话中。我是否应用了错误的过滤器,或者为了不进入wordpress的过滤链,我还遗漏了什么?

提前感谢!

1 个回复
最合适的回答,由SO网友:Krzysiek Dróżdż 整理而成

is_email 是本机WP函数。正如你在这里看到的(https://core.trac.wordpress.org/browser/tags/5.0.3/src/wp-includes/formatting.php#L2886) 它允许您使用过滤器对其进行修改is_email.

是的,任何时候函数is_email 将被调用,它将运行,最后它将运行您的过滤器,允许您修改结果。

但是这个filter 应采用3个参数:

$is_email (bool)电子邮件地址是否已通过is\\u email()检查。默认值为false。

$email (字符串)正在检查的电子邮件地址。

$context (字符串)测试电子邮件的上下文。

function my_email_validation( $is_email, $email, $context )
{
    if ( <MY CONDITION> ) {  // check if it is an email
        return true;
    }

    return false;
}
add_filter( \'is_email\', \'my_email_validation\', 99, 3 );
因此,您的代码不起作用,因为您错误地使用了这个过滤器(您注册它,因为它应该有4个参数,而您的过滤器函数只需要一个参数,依此类推)。