为什么Akismet在密钥验证时返回失败?

时间:2017-08-24 15:53:30

标签: wordpress dry akismet

在自安装版本4.8.1的新安装中,具有2017默认主题的网站我已使用API​​密钥激活了Akismet插件。修改后的single.php

if (function_exists('akismet_verify_key')) :
    $testing = akismet_verify_key(akismet_get_key(), site_url());
    echo $testing;
endif;

但它总是回来failed。我确保站点域名包含在Akismet仪表板中,但无论出于何种原因,在阅读[密钥验证文档] [1]并检测到存在的功能后,它将不会返回true

如果我复制PHP示例并将函数的命名约定更改为akismet_check

function akismet_check($key, $blog) {
    $blog           = urlencode($blog);
    $request        = 'key='. $key .'&blog='. $blog;
    $host           = $http_host = 'rest.akismet.com';
    $path           = '/1.1/verify-key';
    $port           = 443;
    $akismet_ua     = "WordPress/4.4.1 | Akismet/3.1.7";
    $content_length = strlen( $request );
    $http_request   = "POST $path HTTP/1.0\r\n";
    $http_request   .= "Host: $host\r\n";
    $http_request   .= "Content-Type: application/x-www-form-urlencoded\r\n";
    $http_request   .= "Content-Length: {$content_length}\r\n";
    $http_request   .= "User-Agent: {$akismet_ua}\r\n";
    $http_request   .= "\r\n";
    $http_request   .= $request;
    $response       = '';
    if (false != ( $fs = @fsockopen( 'ssl://' . $http_host, $port, $errno, $errstr, 10))) :
        fwrite( $fs, $http_request );
        while ( !feof( $fs ) )
            $response .= fgets( $fs, 1160 ); // One TCP-IP packet
            fclose( $fs );
            $response = explode( "\r\n\r\n", $response, 2 );
    endif;
    if ( 'valid' == $response[1] ) :
        return true;
    else :
        return false;
    endif;
}

并通过它:

echo 'Akismet shows ' . $result = akismet_check(akismet_get_key(), site_url());

我不明白该功能是否已经存在,我可以发现它为什么会出现故障。 Akismet是否可以替代密钥验证,因此如果akismet_verify_key不起作用或者我做错了什么,我不必重新编写整个函数来执行似乎已存在的函数?

1 个答案:

答案 0 :(得分:0)

akismet_verify_key()的第二个参数不是您的网站网址,而是您要连接的Akismet API服务器的IP。它在Akismet_Admin::check_server_ip_connectivity()中用于帮助网站在无法始终连接到API时进行故障排除。

将您的通话更改为$testing = akismet_verify_key( akismet_get_key() );应该有效。

旁注:为什么要验证主题中的Akismet API密钥?或者这仅仅是一个展示问题的简化示例?