Akismet()
Description #
Akismet addon class.
Source #
File: addons/akismet/akismet.php
class Akismet extends \AnsPress\Singleton {
/**
* Refers to a single instance of this class.
*
* @var null|object
* @since 4.1.8
*/
public static $instance = null;
/**
* Initialize the class.
*/
protected function __construct() {
// Return if akisment is not enabled.
if ( ! class_exists( 'Akismet' ) ) {
return;
}
ap_add_default_options( array( 'spam_post_action' => 'moderate' ) );
anspress()->add_filter( 'ap_settings_menu_features_groups', $this, 'add_to_settings_page' );
anspress()->add_filter( 'ap_form_options_features_akismet', $this, 'option_form' );
anspress()->add_action( 'ap_after_question_form_processed', $this, 'new_question_answer' );
anspress()->add_action( 'ap_after_answer_form_processed', $this, 'new_question_answer' );
anspress()->add_action( 'admin_action_ap_mark_spam', $this, 'submit_spam' );
anspress()->add_action( 'post_row_actions', $this, 'row_actions', 10, 2 );
}
/**
* Add tags settings to features settings page.
*
* @param array $groups Features settings group.
* @return array
* @since 4.2.0
*/
public function add_to_settings_page( $groups ) {
$groups['akismet'] = array(
'label' => __( 'Akismet', 'anspress-question-answer' ),
);
return $groups;
}
/**
* Register options of Avatar addon.
*
* @return array
* @since 4.1.0
*/
public static function option_form() {
$opt = ap_opt();
$form = array(
'submit_label' => __( 'Save add-on options', 'anspress-question-answer' ),
'fields' => array(
'spam_post_action' => array(
'label' => __( 'What to do when post is a spam?', 'anspress-question-answer' ),
'type' => 'select',
'options' => array(
'moderate' => __( 'Change status to moderate', 'anspress-question-answer' ),
'trash' => __( 'Trash the post', 'anspress-question-answer' ),
),
'value' => $opt['spam_post_action'],
),
),
);
return $form;
}
/**
* Check post for spam, if spam then hold it for moderation.
*
* @param integer $post_id Post id.
* @param boolean $submit Submit.
*/
private function api_request( $post_id, $submit = false ) {
$post = ap_get_post( $post_id );
$comment_type = 'question' === $post->post_type ? 'forum-post' : 'replay';
// Set default arguments to pass.
$defaults = array(
'blog' => home_url( '/' ),
'user_ip' => get_post_meta( $post->ID, 'create_ip', true ),
'user_agent' => ! empty( $_SERVER['HTTP_USER_AGENT'] ) ? sanitize_text_field( wp_unslash( $_SERVER['HTTP_USER_AGENT'] ) ) : '',
'referrer' => ! empty( $_SERVER['HTTP_REFERER'] ) ? sanitize_text_field( wp_unslash( $_SERVER['HTTP_REFERER'] ) ) : '',
'permalink' => get_permalink( $post->ID ),
'comment_type' => $comment_type,
'comment_author' => get_the_author_meta( 'nicename', $post->post_author ),
'comment_author_email' => get_the_author_meta( 'user_email', $post->post_author ),
'comment_author_url' => get_the_author_meta( 'url', $post->post_author ),
'comment_content' => $post->post_title . "\n\n" . $post->post_content,
);
$akismet_ua = sprintf( 'WordPress/%s | AnsPress/%s', $GLOBALS['wp_version'], AP_VERSION );
$akismet_ua = apply_filters( 'akismet_ua', $akismet_ua );
$api_key = \Akismet::get_api_key();
$host = \Akismet::API_HOST;
if ( ! empty( $api_key ) ) {
$host = $api_key . '.' . $host;
}
$http_host = $host;
$http_args = array(
'body' => $defaults,
'headers' => array(
'Content-Type' => 'application/x-www-form-urlencoded; charset=' . get_option( 'blog_charset' ),
'Host' => $host,
'User-Agent' => $akismet_ua,
),
'httpversion' => '1.0',
'timeout' => 15,
);
$http_akismet_url = "http://{$http_host}/1.1/";
$akismet_url = $http_akismet_url;
if ( false === $submit ) {
$akismet_url .= 'comment-check';
} else {
$akismet_url .= 'submit-spam';
}
$akismet_url = set_url_scheme( $akismet_url, 'https' );
$response = wp_remote_post( $akismet_url, $http_args );
\Akismet::log( compact( 'akismet_url', 'http_args', 'response' ) );
if ( is_wp_error( $response ) ) {
// Intermittent connection problems may cause the first HTTPS
// request to fail and subsequent HTTP requests to succeed randomly.
// Retry the HTTPS request once before disabling SSL for a time.
$response = wp_remote_post( $akismet_url, $http_args );
\Akismet::log( compact( 'akismet_url', 'http_args', 'response' ) );
if ( is_wp_error( $response ) ) {
// Try the request again without SSL.
$response = wp_remote_post( $http_akismet_url, $http_args );
\Akismet::log( compact( 'http_akismet_url', 'http_args', 'response' ) );
}
}
if ( is_wp_error( $response ) ) {
return array( '', '' );
}
// Lastly if true mark it as spam.
if ( 'true' === $response['body'] || 'Thanks for making the web a better place.' === $response['body'] ) {
$this->spam_post_action( $post_id );
update_post_meta( $post_id, '__ap_spam', current_time( 'timestamp' ) ); // phpcs:ignore
}
}
/**
* Action to do when post is marked as a spam.
*
* @param integer $post_id Post id.
* @return void
*/
public function spam_post_action( $post_id ) {
$opt = ap_opt( 'spam_post_action' );
wp_update_post(
array(
'ID' => $post_id,
'post_status' => $opt,
)
);
}
/**
* Check for spam in content after submission from frontend.
*
* @param integer $post_id Post id.
* @return void
*/
public function new_question_answer( $post_id ) {
$_post = ap_get_post( $post_id );
// Return if already a spam or user is admin.
if ( 'moderate' === $_post->post_status || user_can( $_post->post_author, 'manage_options' ) ) {
return;
}
$this->api_request( $post_id );
}
/**
* Submit spam to akismet.
*
* @return void
*/
public function submit_spam() {
// Check role.
if ( ! current_user_can( 'manage_options' ) || ! wp_verify_nonce( ap_sanitize_unslash( 'nonce', 'r' ), 'send_spam' ) ) {
die( esc_attr__( 'Cheating', 'anspress-question-answer' ) );
}
$post_id = ap_sanitize_unslash( 'post_id', 'r' );
$this->api_request( $post_id, true );
// Redirect.
wp_safe_redirect( admin_url( 'edit.php?post_type=question' ) );
die();
}
/**
* Add post row action to mark a post as a spam.
*
* @param array $actions List of actions.
* @param \WP_Post $post Post object.
* @return array
*/
public function row_actions( $actions, $post ) {
if ( ! ap_is_cpt( $post ) || 'moderate' === $post->post_status ) {
return $actions;
}
$nonce = wp_create_nonce( 'send_spam' );
$actions['report_spam'] = '<a href="' . admin_url( 'admin.php?action=ap_mark_spam&post_id=' . $post->ID . '&nonce=' . $nonce ) . '" aria-label="' . __( 'Mark this post as a spam', 'anspress-question-answer' ) . '">' . __( 'Mark as spam', 'anspress-question-answer' ) . '</a>';
return $actions;
}
}
Expand full source code Collapse full source code View on GitHub: addons/akismet/akismet.php:37
6ye45