diff options
Diffstat (limited to 'wp-content/plugins/akismet/class.akismet.php')
-rw-r--r-- | wp-content/plugins/akismet/class.akismet.php | 65 |
1 files changed, 63 insertions, 2 deletions
diff --git a/wp-content/plugins/akismet/class.akismet.php b/wp-content/plugins/akismet/class.akismet.php index 951142e..7a89f61 100644 --- a/wp-content/plugins/akismet/class.akismet.php +++ b/wp-content/plugins/akismet/class.akismet.php @@ -642,7 +642,14 @@ class Akismet { return 0; } - // get the full comment history for a given comment, as an array in reverse chronological order + /** + * Get the full comment history for a given comment, as an array in reverse chronological order. + * Each entry will have an 'event', a 'time', and possible a 'message' member (if the entry is old enough). + * Some entries will also have a 'user' or 'meta' member. + * + * @param int $comment_id The relevant comment ID. + * @return array|bool An array of history events, or false if there is no history. + */ public static function get_comment_history( $comment_id ) { $history = get_comment_meta( $comment_id, 'akismet_history', false ); if ( empty( $history ) || empty( $history[ 0 ] ) ) { @@ -681,6 +688,10 @@ class Akismet { $history[] = array( 'time' => 445856425, 'event' => 'status-spam', 'user' => 'sam' ); $history[] = array( 'time' => 445856426, 'event' => 'status-hold', 'user' => 'sam' ); $history[] = array( 'time' => 445856427, 'event' => 'status-approve', 'user' => 'sam' ); + $history[] = array( 'time' => 445856427, 'event' => 'webhook-spam' ); + $history[] = array( 'time' => 445856427, 'event' => 'webhook-ham' ); + $history[] = array( 'time' => 445856427, 'event' => 'webhook-spam-noaction' ); + $history[] = array( 'time' => 445856427, 'event' => 'webhook-ham-noaction' ); */ usort( $history, array( 'Akismet', '_cmp_time' ) ); @@ -819,6 +830,17 @@ class Akismet { if ( get_comment_meta( $comment->comment_ID, 'akismet_rechecking' ) ) return; + if ( function_exists( 'getallheaders' ) ) { + $request_headers = getallheaders(); + + foreach ( $request_headers as $header => $value ) { + if ( strtolower( $header ) == 'x-akismet-webhook' ) { + // This change is due to a webhook request. + return; + } + } + } + // Assumption alert: // We want to submit comments to Akismet only when a moderator explicitly spams or approves it - not if the status // is changed automatically by another plugin. Unfortunately WordPress doesn't provide an unambiguous way to @@ -1583,7 +1605,7 @@ p { public static function view( $name, array $args = array() ) { $args = apply_filters( 'akismet_view_arguments', $args, $name ); - foreach ( $args AS $key => $val ) { + foreach ( $args as $key => $val ) { $$key = $val; } @@ -1871,4 +1893,43 @@ p { return $return_value; } + + /** + * Was the last entry in the comment history created by Akismet? + * + * @param int $comment_id The ID of the comment. + * @return bool + */ + public static function last_comment_status_change_came_from_akismet( $comment_id ) { + $history = self::get_comment_history( $comment_id ); + + if ( empty( $history ) ) { + return false; + } + + $most_recent_history_event = $history[0]; + + if ( ! isset( $most_recent_history_event['event'] ) ) { + return false; + } + + $akismet_history_events = array( + 'check-error', + 'cron-retry-ham', + 'cron-retry-spam', + 'check-ham', + 'check-spam', + 'recheck-error', + 'recheck-ham', + 'recheck-spam', + 'webhook-ham', + 'webhook-spam', + ); + + if ( in_array( $most_recent_history_event['event'], $akismet_history_events ) ) { + return true; + } + + return false; + } } |