WordPress匹配和隐藏邮箱地址

电子邮件已经成为了网络中必不可少的重要通信工具,既方便了我们管理网络账户和网络通信,同时也成了广告商眼中的客户资源,已经沦落为垃圾广告集散地,本文内容就告诉大家在WordPress如何自动处理内容中的邮箱地址。

解决思路

通常隐藏网页中的邮箱地址都只是为了防止采集器,而不是真的想隐藏,这种隐藏的方法对网站访客并没有影响,访客一样是可见的,这样的隐藏可以选择把邮箱地址转为HTML实体,或者通过CSS添加部分内容,再或者JS实现,方法众多,但还是所有人可见的。

要真正实现隐藏评论内容中的邮箱地址,最直接有效的方法还是判断用户权限,非评论作者或文章作者或编辑都不可见,直接提示邮箱已被自动隐藏不可见。

实现方法

转为HTML实体

WordPress内置了一个 antispambot 函数来把邮箱地址转为HTML实体,可以直接使用

//~ 处理邮箱地址的回调函数,第二个参数代表编码(0是十进制,1是十六进制)
function dmeng_antispambot_email($matches){
//~ 返回转换后的邮箱地址(当然了,你也可以先做些处理再返回,比如说添加mailto链接)
return antispambot($matches[0], 0);
}
//~ 自动隐藏评论中邮箱
function dmeng_hide_comment_email_address($content){
$content = preg_replace_callback( '#([.0-9a-z_+-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})#i', 'dmeng_antispambot_email', $content );
return $content;
}
add_filter( 'get_comment_text', 'dmeng_hide_comment_email_address' );
//~ 如果也要转换文章内容中的邮箱地址,把这个函数挂到 the_content 钩子即可,如:
add_filter( 'the_content', 'dmeng_hide_comment_email_address' );

使用CSS隐藏

使用CSS伪类添加邮箱的@符号,这样邮件地址扫描软件识别不到,但也复制不了@符号

//~ 自动隐藏评论中邮箱
function dmeng_hide_comment_email_address($content){
$content = preg_replace('#([.0-9a-z_+-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})#i', '\\1<span class="at">\\2</span>', $content);
return $content;
}
add_filter( 'get_comment_text', 'dmeng_hide_comment_email_address' );
//~ 如果也要转换文章内容中的邮箱地址,把这个函数挂到 the_content 钩子即可,如:
add_filter( 'the_content', 'dmeng_hide_comment_email_address' );

别忘了添加名为 .at 的CSS类

<style>.at::before{content:"\0040";}</style>

使用JS隐藏

可以一开始只显示邮箱前缀,然后通过JS的 onclick 动作引导用户点击显示完整地址,这样做需要注意的是要给邮箱和提示文字添加不同其他内容但一样的样式以减低用户识别成本(不得不承认有的用户反应很慢)

//~ 自动隐藏评论中邮箱
function dmeng_hide_comment_email_address($content){
$content = preg_replace('#([.0-9a-z_+-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})#i', '\\1&#64;<span onclick="this.innerHTML=\'\\2\';">点击显示邮箱后缀</span>', $content);
return $content;
}
add_filter( 'get_comment_text', 'dmeng_hide_comment_email_address' );
//~ 如果也要转换文章内容中的邮箱地址,把这个函数挂到 the_content 钩子即可,如:
add_filter( 'the_content', 'dmeng_hide_comment_email_address' );

根据权限隐藏

上面讲的都是面向采集机器人的隐藏,对网站访客仍然可见的,算不上真正意义的隐藏,要保护用户隐私最直接有效的方法应该是判断用户权限,没有权限的直接不显示邮箱地址。

以下代码规定,只有可以管理评论的,或者是该条评论的文章作者,或者是该评论作者,才可见。

//~ 自动隐藏评论中邮箱
function dmeng_hide_comment_email_address($content, $comment){
if( intval(get_option('dmeng_hide_comment_email', 1)) ){
if( !current_user_can('moderate_comments') && !current_user_can('edit_post', $comment->comment_post_ID) && get_current_user_id()!=$comment->user_id ){
$content = preg_replace('#([.0-9a-z_+-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})#i', '<abbr title="'.__('只有评论/文章作者或更高权限的用户才可见','dmeng').'">'.__('邮箱已被自动隐藏','dmeng').'</abbr>', $content);
}
}
return $content;
}
add_filter( 'get_comment_text', 'dmeng_hide_comment_email_address', 10, 2 );
//~ 这个就没必要应用到文章内容里面的邮箱地址了(其他用户不可见发来也没意义)

相关资料

  1. 匹配邮箱地址的正则(#([.0-9a-z_+-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})#i)来自WordPress源代码
  2. 多梦主题隐藏评论中的邮箱设置在:多梦主题设置 > 讨论 > 隐藏邮箱地址