<?php /** ** Akismet Filter ** Akismet API: http://akismet.com/development/api/ **/ add_filter( 'wpcf7_spam', 'wpcf7_akismet', 10, 2 ); function wpcf7_akismet( $spam, $submission ) { if ( $spam ) { return $spam; } if ( ! wpcf7_akismet_is_available() ) { return false; } if ( ! $params = wpcf7_akismet_submitted_params() ) { return false; } $c = array(); $c['comment_author'] = $params['author']; $c['comment_author_email'] = $params['author_email']; $c['comment_author_url'] = $params['author_url']; $c['comment_content'] = $params['content']; $c['blog'] = get_option( 'home' ); $c['blog_lang'] = get_locale(); $c['blog_charset'] = get_option( 'blog_charset' ); $c['user_ip'] = $_SERVER['REMOTE_ADDR']; $c['user_agent'] = $_SERVER['HTTP_USER_AGENT']; $c['referrer'] = $_SERVER['HTTP_REFERER']; $c['comment_type'] = 'contact-form'; $datetime = date_create_immutable( '@' . $submission->get_meta( 'timestamp' ) ); if ( $datetime ) { $c['comment_date_gmt'] = $datetime->format( DATE_ATOM ); } if ( $permalink = get_permalink() ) { $c['permalink'] = $permalink; } $ignore = array( 'HTTP_COOKIE', 'HTTP_COOKIE2', 'PHP_AUTH_PW' ); foreach ( $_SERVER as $key => $value ) { if ( ! in_array( $key, (array) $ignore ) ) { $c["$key"] = $value; } } $c = apply_filters( 'wpcf7_akismet_parameters', $c ); if ( wpcf7_akismet_comment_check( $c ) ) { $spam = true; $submission->add_spam_log( array( 'agent' => 'akismet', 'reason' => __( "Akismet returns a spam response.", 'contact-form-7' ), ) ); } else { $spam = false; } return $spam; } /** * Returns true if Akismet is active and has a valid API key. */ function wpcf7_akismet_is_available() { if ( is_callable( array( 'Akismet', 'get_api_key' ) ) ) { return (bool) Akismet::get_api_key(); } return false; } /** * Returns an array of parameters based on the current form submission. * Returns false if Akismet is not active on the contact form. */ function wpcf7_akismet_submitted_params() { $akismet_tags = array_filter( wpcf7_scan_form_tags(), function ( $tag ) { $akismet_option = $tag->get_option( 'akismet', '(author|author_email|author_url)', true ); return (bool) $akismet_option; } ); if ( ! $akismet_tags ) { // Akismet is not active on this contact form. return false; } $params = array( 'author' => '', 'author_email' => '', 'author_url' => '', 'content' => '', ); foreach ( (array) $_POST as $key => $val ) { if ( '_wpcf7' == substr( $key, 0, 6 ) or '_wpnonce' == $key ) { continue; } $vals = array_filter( wpcf7_array_flatten( $val ), function ( $val ) { return '' !== trim( $val ); } ); if ( empty( $vals ) ) { continue; } if ( $tags = wpcf7_scan_form_tags( array( 'name' => $key ) ) ) { $tag = $tags[0]; $akismet_option = $tag->get_option( 'akismet', '(author|author_email|author_url)', true ); if ( 'author' === $akismet_option ) { $params['author'] = sprintf( '%s %s', $params['author'], implode( ' ', $vals ) ); continue; } if ( 'author_email' === $akismet_option and '' === $params['author_email'] ) { $params['author_email'] = $vals[0]; continue; } if ( 'author_url' === $akismet_option and '' === $params['author_url'] ) { $params['author_url'] = $vals[0]; continue; } $vals = array_filter( $vals, function ( $val ) use ( $tag ) { if ( wpcf7_form_tag_supports( $tag->type, 'selectable-values' ) and in_array( $val, $tag->labels ) ) { return false; } else { return true; } } ); } if ( $vals ) { $params['content'] .= "\n\n" . implode( ', ', $vals ); } } $params = array_map( 'trim', $params ); return $params; } /** * Sends data to Akismet. * * @param array $comment Submission and environment data. * @return bool True if Akismet called it spam, or false otherwise. */ function wpcf7_akismet_comment_check( $comment ) { $spam = false; $query_string = wpcf7_build_query( $comment ); if ( is_callable( array( 'Akismet', 'http_post' ) ) ) { $response = Akismet::http_post( $query_string, 'comment-check' ); } else { return $spam; } if ( 'true' == $response[1] ) { $spam = true; } if ( $submission = WPCF7_Submission::get_instance() ) { $submission->akismet = array( 'comment' => $comment, 'spam' => $spam ); } return apply_filters( 'wpcf7_akismet_comment_check', $spam, $comment ); }