Search code examples
phpwordpressspam-preventionakismet

How to integrate Akismet in wordpress/php programmatically


I would like to check a custom form against spam using Akismet. I searched the web and the only simple way I found is this (see code excerpt below): http://www.binarymoon.co.uk/2010/03/akismet-plugin-theme-stop-spam-dead/. Unfortunately $isSpam returns true!

Does anyone know how to do the magic? I appreciate your help.

function akismet_isSpam ($content) {

// innocent until proven guilty
$isSpam = FALSE;

$content = (array) $content;

if (function_exists('akismet_init')) {

    $wpcom_api_key = get_option('wordpress_api_key');

    if (!empty($wpcom_api_key)) {

        global $akismet_api_host, $akismet_api_port;

        // set remaining required values for akismet api
        $content['user_ip'] = preg_replace( '/[^0-9., ]/', '', $_SERVER['REMOTE_ADDR'] );
        $content['user_agent'] = $_SERVER['HTTP_USER_AGENT'];
        $content['referrer'] = $_SERVER['HTTP_REFERER'];
        $content['blog'] = get_option('home');

        if (empty($content['referrer'])) {
            $content['referrer'] = get_permalink();
        }

        $queryString = '';

        foreach ($content as $key => $data) {
            if (!empty($data)) {
                $queryString .= $key . '=' . urlencode(stripslashes($data)) . '&';
            }
        }

        $response = akismet_http_post($queryString, $akismet_api_host, '/1.1/comment-check', $akismet_api_port);
        smart_dump($response, true);

        if ($response[1] == 'true') {
            update_option('akismet_spam_count', get_option('akismet_spam_count') + 1);
            $isSpam = TRUE;
        }

    }

}

return $isSpam;

}


Solution

  • First , you can assume akismet is installed and API key verified, that will allow you to use the akismet_http_post function directly to post the data to servers ..

    // Like above mentioned, We assume that :
    // Akismet is installed with the corresponding API key
    if( function_exists( 'akismet_http_post' ) )
    {   
        global $akismet_api_host, $akismet_api_port;
    
        // data to be delivered to Akismet (This is what you need Modify this to your needs)
        $data = array( 
            'comment_author'        => 'Spammer Spammy',
            'comment_author_email'  => '[email protected]',
            'comment_author_url'    => 'spamming.com',
            'comment_content'       => 'my Spam',
            'user_ip'               => '99.99.99.99',
            'user_agent'            => '',
            'referrer'              => '',
            'blog'                  => 'http://example.com',
            'blog_lang'             => 'en_US',
            'blog_charset'          => 'UTF-8',
            'permalink'             => 'http://example.com/my-link',
            'is_test'               => TRUE,
        );
    
        // Now we need to construct the query string
        $query_string = http_build_query( $data );
        // and then post it to Akismet
        $response = akismet_http_post( $query_string, $akismet_api_host, '/1.1/comment-check', $akismet_api_port );
        // ..and check the results        
        $result = ( is_array( $response ) && isset( $response[1] ) ) ? $response[1] : 'false';
        // display the result ( 'true', 'false' or any error message you want )    
        printf( 'Spam check according to Akismet :%s', $result );
    }
    

    This was not thoroughly tested , but should work..

    Note that the blog, user_ip and user_agent parameters are required for the akismet_http_post function.

    Also, it would be nice to mention that Akismet has libraries and good API documents .