Files
wp-blog/wp-content/themes/Beginning/functions/class-anti-spam.php
T
2018-05-08 11:22:54 +08:00

187 lines
3.4 KiB
PHP

<?php
/**
* 垃圾评论防御类
*
* @package WordPress
* @subpackage Beginning
* @since Beginning 4.0.2
*/
/**
* 垃圾评论防御
*
* @since Unknown
* @since Beginning 4.0.2 从 `functions/comment.php` 移动至此。
*
* @warning 不要继承此类!因为历史兼容原因,无法直接添加 final 关键字,但后续更新不会保证
* 其继承后的兼容性。
*/
class Bing_Anti_Spam {
/**
* 此对象
*
* @since Beginning 4.0.2
* @var object
*/
public static $object;
/**
* 是否需要拦截此评论
*
* @since Unknown
* @since Beginning 4.0.2 从公开改为私有属性。
*
* @var bool
*/
private $spam = false;
/**
* 是否已经检测过评论数据
*
* @since Beginning 4.0.2
* @var bool
*/
private $checked = false;
/**
* 初始化
*
* @since Unknown
* @since Beginning 4.0.2 检测是否启用的逻辑移走,并且将实例化的对象存储到静态属性中。
*/
public static function init() {
if ( isset( self::$object ) )
return;
if ( !self::is_active() )
return;
self::$object = new self();
}
/**
* 检测是否启用垃圾评论防御
*
* @since Beginning 4.0.2
*/
private static function is_active() {
if ( !Bing_mpanel( 'comment_anti' ) )
return false;
if ( is_user_logged_in() )
return false;
return true;
}
/**
* 构造函数
*/
public function __construct() {
$this->check();
add_filter( 'comment_form_field_comment', array( $this, 'change_form' ), 16 );
add_filter( 'pre_comment_approved', array( $this, 'check_comment' ), 10, 2 );
}
/**
* 检测评论数据
*
* @since Unknown
* @since Beginning 4.0.2 添加判断,避免重复进行数据检测。
*/
public function check() {
if ( $this->checked )
return;
else
$this->checked = true;
if ( !isset( $_POST['comment'] ) )
return;
if ( isset( $_POST['person-comment'] ) ) {
$_POST['comment'] = $_POST['person-comment'];
unset( $_POST['person-comment'] );
$_REQUEST = array_merge( $_GET, $_POST );
} else {
$this->spam = true;
}
}
/**
* 修改评论表单
*/
public function change_form( $field ) {
$search = array(
'name="comment"',
'</textarea>'
);
$replace = array(
'name="person-comment"',
'</textarea><textarea name="comment" style="display: none;"></textarea>'
);
return str_replace( $search, $replace, $field );
}
/**
* 拦截垃圾评论
*
* @since Unknown
* @since Beginning 4.0.2 修复评论类型判断成功后返回 `$comment` 的问题,已修正为 `$approved`。
*/
public function check_comment( $approved, $comment ) {
if ( $this->spam ) {
if ( in_array( $comment['comment_type'], array( 'pingback', 'trackback' ) ) )
return $approved;
wp_die( __( '检测为机器人评论,请在网站评论表单处提交您的评论', 'Bing' ) );
}
return $approved;
}
/**
* 获取属性
*
* @since Beginning 4.0.2
*/
public function __get( $name ) {
return $this->$name;
}
/**
* 设置属性
*
* @since Beginning 4.0.2
* @since Beginning 4.0.4 取消无效的返回值。
*/
public function __set( $name, $value ) {
$this->$name = $value;
}
/**
* 检测属性是否已经设置
*
* @since Beginning 4.0.2
*/
public function __isset( $name ) {
return isset( $this->$name );
}
/**
* 销毁属性
*
* @since Beginning 4.0.2
*/
public function __unset( $name ) {
unset( $this->$name );
}
}
// End of page.