| [ Root ] [ Index ] |
PHP Cross Reference of WordPress 2.9.2Provided by Yoast |
[Summary view] [Print] [Text view]
1 <?php 2 /* 3 Plugin Name: Akismet 4 Plugin URI: http://akismet.com/ 5 Description: Akismet checks your comments against the Akismet web service to see if they look like spam or not. You need a <a href="http://akismet.com/get/">WordPress.com API key</a> to use it. You can review the spam it catches under "Comments." To show off your Akismet stats just put <code><?php akismet_counter(); ?></code> in your template. See also: <a href="http://wordpress.org/extend/plugins/stats/">WP Stats plugin</a>. 6 Version: 2.2.7 7 Author: Matt Mullenweg 8 Author URI: http://ma.tt/ 9 */ 10 11 define('AKISMET_VERSION', '2.2.7'); 12 13 // If you hardcode a WP.com API key here, all key config screens will be hidden 14 if ( defined('WPCOM_API_KEY') ) 15 $wpcom_api_key = constant('WPCOM_API_KEY'); 16 else 17 $wpcom_api_key = ''; 18 19 function akismet_init() { 20 global $wpcom_api_key, $akismet_api_host, $akismet_api_port; 21 22 if ( $wpcom_api_key ) 23 $akismet_api_host = $wpcom_api_key . '.rest.akismet.com'; 24 else 25 $akismet_api_host = get_option('wordpress_api_key') . '.rest.akismet.com'; 26 27 $akismet_api_port = 80; 28 add_action('admin_menu', 'akismet_config_page'); 29 add_action('admin_menu', 'akismet_stats_page'); 30 akismet_admin_warnings(); 31 } 32 add_action('init', 'akismet_init'); 33 34 function akismet_admin_init() { 35 if ( function_exists( 'get_plugin_page_hook' ) ) 36 $hook = get_plugin_page_hook( 'akismet-stats-display', 'index.php' ); 37 else 38 $hook = 'dashboard_page_akismet-stats-display'; 39 add_action('admin_head-'.$hook, 'akismet_stats_script'); 40 } 41 add_action('admin_init', 'akismet_admin_init'); 42 43 if ( !function_exists('wp_nonce_field') ) { 44 function akismet_nonce_field($action = -1) { return; } 45 $akismet_nonce = -1; 46 } else { 47 function akismet_nonce_field($action = -1) { return wp_nonce_field($action); } 48 $akismet_nonce = 'akismet-update-key'; 49 } 50 51 if ( !function_exists('number_format_i18n') ) { 52 function number_format_i18n( $number, $decimals = null ) { return number_format( $number, $decimals ); } 53 } 54 55 function akismet_config_page() { 56 if ( function_exists('add_submenu_page') ) 57 add_submenu_page('plugins.php', __('Akismet Configuration'), __('Akismet Configuration'), 'manage_options', 'akismet-key-config', 'akismet_conf'); 58 59 } 60 61 function akismet_conf() { 62 global $akismet_nonce, $wpcom_api_key; 63 64 if ( isset($_POST['submit']) ) { 65 if ( function_exists('current_user_can') && !current_user_can('manage_options') ) 66 die(__('Cheatin’ uh?')); 67 68 check_admin_referer( $akismet_nonce ); 69 $key = preg_replace( '/[^a-h0-9]/i', '', $_POST['key'] ); 70 71 if ( empty($key) ) { 72 $key_status = 'empty'; 73 $ms[] = 'new_key_empty'; 74 delete_option('wordpress_api_key'); 75 } else { 76 $key_status = akismet_verify_key( $key ); 77 } 78 79 if ( $key_status == 'valid' ) { 80 update_option('wordpress_api_key', $key); 81 $ms[] = 'new_key_valid'; 82 } else if ( $key_status == 'invalid' ) { 83 $ms[] = 'new_key_invalid'; 84 } else if ( $key_status == 'failed' ) { 85 $ms[] = 'new_key_failed'; 86 } 87 88 if ( isset( $_POST['akismet_discard_month'] ) ) 89 update_option( 'akismet_discard_month', 'true' ); 90 else 91 update_option( 'akismet_discard_month', 'false' ); 92 } elseif ( isset($_POST['check']) ) { 93 akismet_get_server_connectivity(0); 94 } 95 96 if ( $key_status != 'valid' ) { 97 $key = get_option('wordpress_api_key'); 98 if ( empty( $key ) ) { 99 if ( $key_status != 'failed' ) { 100 if ( akismet_verify_key( '1234567890ab' ) == 'failed' ) 101 $ms[] = 'no_connection'; 102 else 103 $ms[] = 'key_empty'; 104 } 105 $key_status = 'empty'; 106 } else { 107 $key_status = akismet_verify_key( $key ); 108 } 109 if ( $key_status == 'valid' ) { 110 $ms[] = 'key_valid'; 111 } else if ( $key_status == 'invalid' ) { 112 delete_option('wordpress_api_key'); 113 $ms[] = 'key_empty'; 114 } else if ( !empty($key) && $key_status == 'failed' ) { 115 $ms[] = 'key_failed'; 116 } 117 } 118 119 $messages = array( 120 'new_key_empty' => array('color' => 'aa0', 'text' => __('Your key has been cleared.')), 121 'new_key_valid' => array('color' => '2d2', 'text' => __('Your key has been verified. Happy blogging!')), 122 'new_key_invalid' => array('color' => 'd22', 'text' => __('The key you entered is invalid. Please double-check it.')), 123 'new_key_failed' => array('color' => 'd22', 'text' => __('The key you entered could not be verified because a connection to akismet.com could not be established. Please check your server configuration.')), 124 'no_connection' => array('color' => 'd22', 'text' => __('There was a problem connecting to the Akismet server. Please check your server configuration.')), 125 'key_empty' => array('color' => 'aa0', 'text' => sprintf(__('Please enter an API key. (<a href="%s" style="color:#fff">Get your key.</a>)'), 'http://akismet.com/get/')), 126 'key_valid' => array('color' => '2d2', 'text' => __('This key is valid.')), 127 'key_failed' => array('color' => 'aa0', 'text' => __('The key below was previously validated but a connection to akismet.com can not be established at this time. Please check your server configuration.'))); 128 ?> 129 <?php if ( !empty($_POST['submit'] ) ) : ?> 130 <div id="message" class="updated fade"><p><strong><?php _e('Options saved.') ?></strong></p></div> 131 <?php endif; ?> 132 <div class="wrap"> 133 <h2><?php _e('Akismet Configuration'); ?></h2> 134 <div class="narrow"> 135 <form action="" method="post" id="akismet-conf" style="margin: auto; width: 400px; "> 136 <?php if ( !$wpcom_api_key ) { ?> 137 <p><?php printf(__('For many people, <a href="%1$s">Akismet</a> will greatly reduce or even completely eliminate the comment and trackback spam you get on your site. If one does happen to get through, simply mark it as "spam" on the moderation screen and Akismet will learn from the mistakes. If you don\'t have a WordPress.com account yet, you can get one at <a href="%2$s">Akismet.com</a>.'), 'http://akismet.com/', 'http://akismet.com/get/'); ?></p> 138 139 <?php akismet_nonce_field($akismet_nonce) ?> 140 <h3><label for="key"><?php _e('WordPress.com API Key'); ?></label></h3> 141 <?php foreach ( $ms as $m ) : ?> 142 <p style="padding: .5em; background-color: #<?php echo $messages[$m]['color']; ?>; color: #fff; font-weight: bold;"><?php echo $messages[$m]['text']; ?></p> 143 <?php endforeach; ?> 144 <p><input id="key" name="key" type="text" size="15" maxlength="12" value="<?php echo get_option('wordpress_api_key'); ?>" style="font-family: 'Courier New', Courier, mono; font-size: 1.5em;" /> (<?php _e('<a href="http://faq.wordpress.com/2005/10/19/api-key/">What is this?</a>'); ?>)</p> 145 <?php if ( $invalid_key ) { ?> 146 <h3><?php _e('Why might my key be invalid?'); ?></h3> 147 <p><?php _e('This can mean one of two things, either you copied the key wrong or that the plugin is unable to reach the Akismet servers, which is most often caused by an issue with your web host around firewalls or similar.'); ?></p> 148 <?php } ?> 149 <?php } ?> 150 <p><label><input name="akismet_discard_month" id="akismet_discard_month" value="true" type="checkbox" <?php if ( get_option('akismet_discard_month') == 'true' ) echo ' checked="checked" '; ?> /> <?php _e('Automatically discard spam comments on posts older than a month.'); ?></label></p> 151 <p class="submit"><input type="submit" name="submit" value="<?php _e('Update options »'); ?>" /></p> 152 </form> 153 154 <form action="" method="post" id="akismet-connectivity" style="margin: auto; width: 400px; "> 155 156 <h3><?php _e('Server Connectivity'); ?></h3> 157 <?php 158 if ( !function_exists('fsockopen') || !function_exists('gethostbynamel') ) { 159 ?> 160 <p style="padding: .5em; background-color: #d22; color: #fff; font-weight:bold;"><?php _e('Network functions are disabled.'); ?></p> 161 <p><?php echo sprintf( __('Your web host or server administrator has disabled PHP\'s <code>fsockopen</code> or <code>gethostbynamel</code> functions. <strong>Akismet cannot work correctly until this is fixed.</strong> Please contact your web host or firewall administrator and give them <a href="%s" target="_blank">this information about Akismet\'s system requirements</a>.'), 'http://blog.akismet.com/akismet-hosting-faq/'); ?></p> 162 <?php 163 } else { 164 $servers = akismet_get_server_connectivity(); 165 $fail_count = count($servers) - count( array_filter($servers) ); 166 if ( is_array($servers) && count($servers) > 0 ) { 167 // some connections work, some fail 168 if ( $fail_count > 0 && $fail_count < count($servers) ) { ?> 169 <p style="padding: .5em; background-color: #aa0; color: #fff; font-weight:bold;"><?php _e('Unable to reach some Akismet servers.'); ?></p> 170 <p><?php echo sprintf( __('A network problem or firewall is blocking some connections from your web server to Akismet.com. Akismet is working but this may cause problems during times of network congestion. Please contact your web host or firewall administrator and give them <a href="%s" target="_blank">this information about Akismet and firewalls</a>.'), 'http://blog.akismet.com/akismet-hosting-faq/'); ?></p> 171 <?php 172 // all connections fail 173 } elseif ( $fail_count > 0 ) { ?> 174 <p style="padding: .5em; background-color: #d22; color: #fff; font-weight:bold;"><?php _e('Unable to reach any Akismet servers.'); ?></p> 175 <p><?php echo sprintf( __('A network problem or firewall is blocking all connections from your web server to Akismet.com. <strong>Akismet cannot work correctly until this is fixed.</strong> Please contact your web host or firewall administrator and give them <a href="%s" target="_blank">this information about Akismet and firewalls</a>.'), 'http://blog.akismet.com/akismet-hosting-faq/'); ?></p> 176 <?php 177 // all connections work 178 } else { ?> 179 <p style="padding: .5em; background-color: #2d2; color: #fff; font-weight:bold;"><?php _e('All Akismet servers are available.'); ?></p> 180 <p><?php _e('Akismet is working correctly. All servers are accessible.'); ?></p> 181 <?php 182 } 183 } else { 184 ?> 185 <p style="padding: .5em; background-color: #d22; color: #fff; font-weight:bold;"><?php _e('Unable to find Akismet servers.'); ?></p> 186 <p><?php echo sprintf( __('A DNS problem or firewall is preventing all access from your web server to Akismet.com. <strong>Akismet cannot work correctly until this is fixed.</strong> Please contact your web host or firewall administrator and give them <a href="%s" target="_blank">this information about Akismet and firewalls</a>.'), 'http://blog.akismet.com/akismet-hosting-faq/'); ?></p> 187 <?php 188 } 189 } 190 191 if ( !empty($servers) ) { 192 ?> 193 <table style="width: 100%;"> 194 <thead><th><?php _e('Akismet server'); ?></th><th><?php _e('Network Status'); ?></th></thead> 195 <tbody> 196 <?php 197 asort($servers); 198 foreach ( $servers as $ip => $status ) { 199 $color = ( $status ? '#2d2' : '#d22'); 200 ?> 201 <tr> 202 <td><?php echo htmlspecialchars($ip); ?></td> 203 <td style="padding: 0 .5em; font-weight:bold; color: #fff; background-color: <?php echo $color; ?>"><?php echo ($status ? __('No problems') : __('Obstructed') ); ?></td> 204 205 <?php 206 } 207 } 208 ?> 209 </tbody> 210 </table> 211 <p><?php if ( get_option('akismet_connectivity_time') ) echo sprintf( __('Last checked %s ago.'), human_time_diff( get_option('akismet_connectivity_time') ) ); ?></p> 212 <p class="submit"><input type="submit" name="check" value="<?php _e('Check network status »'); ?>" /></p> 213 </form> 214 215 </div> 216 </div> 217 <?php 218 } 219 220 function akismet_stats_page() { 221 if ( function_exists('add_submenu_page') ) 222 add_submenu_page('index.php', __('Akismet Stats'), __('Akismet Stats'), 'manage_options', 'akismet-stats-display', 'akismet_stats_display'); 223 224 } 225 226 function akismet_stats_script() { 227 ?> 228 <script type="text/javascript"> 229 function resizeIframe() { 230 var height = document.documentElement.clientHeight; 231 height -= document.getElementById('akismet-stats-frame').offsetTop; 232 height += 100; // magic padding 233 234 document.getElementById('akismet-stats-frame').style.height = height +"px"; 235 236 }; 237 function resizeIframeInit() { 238 document.getElementById('akismet-stats-frame').onload = resizeIframe; 239 window.onresize = resizeIframe; 240 } 241 addLoadEvent(resizeIframeInit); 242 </script><?php 243 } 244 245 246 function akismet_stats_display() { 247 global $akismet_api_host, $akismet_api_port, $wpcom_api_key; 248 $blog = urlencode( get_option('home') ); 249 $url = "http://".akismet_get_key().".web.akismet.com/1.0/user-stats.php?blog={$blog}"; 250 ?> 251 <div class="wrap"> 252 <iframe src="<?php echo $url; ?>" width="100%" height="100%" frameborder="0" id="akismet-stats-frame"></iframe> 253 </div> 254 <?php 255 } 256 257 function akismet_get_key() { 258 global $wpcom_api_key; 259 if ( !empty($wpcom_api_key) ) 260 return $wpcom_api_key; 261 return get_option('wordpress_api_key'); 262 } 263 264 function akismet_verify_key( $key, $ip = null ) { 265 global $akismet_api_host, $akismet_api_port, $wpcom_api_key; 266 $blog = urlencode( get_option('home') ); 267 if ( $wpcom_api_key ) 268 $key = $wpcom_api_key; 269 $response = akismet_http_post("key=$key&blog=$blog", 'rest.akismet.com', '/1.1/verify-key', $akismet_api_port, $ip); 270 if ( !is_array($response) || !isset($response[1]) || $response[1] != 'valid' && $response[1] != 'invalid' ) 271 return 'failed'; 272 return $response[1]; 273 } 274 275 // Check connectivity between the WordPress blog and Akismet's servers. 276 // Returns an associative array of server IP addresses, where the key is the IP address, and value is true (available) or false (unable to connect). 277 function akismet_check_server_connectivity() { 278 global $akismet_api_host, $akismet_api_port, $wpcom_api_key; 279 280 $test_host = 'rest.akismet.com'; 281 282 // Some web hosts may disable one or both functions 283 if ( !function_exists('fsockopen') || !function_exists('gethostbynamel') ) 284 return array(); 285 286 $ips = gethostbynamel($test_host); 287 if ( !$ips || !is_array($ips) || !count($ips) ) 288 return array(); 289 290 $servers = array(); 291 foreach ( $ips as $ip ) { 292 $response = akismet_verify_key( akismet_get_key(), $ip ); 293 // even if the key is invalid, at least we know we have connectivity 294 if ( $response == 'valid' || $response == 'invalid' ) 295 $servers[$ip] = true; 296 else 297 $servers[$ip] = false; 298 } 299 300 return $servers; 301 } 302 303 // Check the server connectivity and store the results in an option. 304 // Cached results will be used if not older than the specified timeout in seconds; use $cache_timeout = 0 to force an update. 305 // Returns the same associative array as akismet_check_server_connectivity() 306 function akismet_get_server_connectivity( $cache_timeout = 86400 ) { 307 $servers = get_option('akismet_available_servers'); 308 if ( (time() - get_option('akismet_connectivity_time') < $cache_timeout) && $servers !== false ) 309 return $servers; 310 311 // There's a race condition here but the effect is harmless. 312 $servers = akismet_check_server_connectivity(); 313 update_option('akismet_available_servers', $servers); 314 update_option('akismet_connectivity_time', time()); 315 return $servers; 316 } 317 318 // Returns true if server connectivity was OK at the last check, false if there was a problem that needs to be fixed. 319 function akismet_server_connectivity_ok() { 320 // skip the check on WPMU because the status page is hidden 321 global $wpcom_api_key; 322 if ( $wpcom_api_key ) 323 return true; 324 $servers = akismet_get_server_connectivity(); 325 return !( empty($servers) || !count($servers) || count( array_filter($servers) ) < count($servers) ); 326 } 327 328 function akismet_admin_warnings() { 329 global $wpcom_api_key; 330 if ( !get_option('wordpress_api_key') && !$wpcom_api_key && !isset($_POST['submit']) ) { 331 function akismet_warning() { 332 echo " 333 <div id='akismet-warning' class='updated fade'><p><strong>".__('Akismet is almost ready.')."</strong> ".sprintf(__('You must <a href="%1$s">enter your WordPress.com API key</a> for it to work.'), "plugins.php?page=akismet-key-config")."</p></div> 334 "; 335 } 336 add_action('admin_notices', 'akismet_warning'); 337 return; 338 } elseif ( get_option('akismet_connectivity_time') && empty($_POST) && is_admin() && !akismet_server_connectivity_ok() ) { 339 function akismet_warning() { 340 echo " 341 <div id='akismet-warning' class='updated fade'><p><strong>".__('Akismet has detected a problem.')."</strong> ".sprintf(__('A server or network problem is preventing Akismet from working correctly. <a href="%1$s">Click here for more information</a> about how to fix the problem.'), "plugins.php?page=akismet-key-config")."</p></div> 342 "; 343 } 344 add_action('admin_notices', 'akismet_warning'); 345 return; 346 } 347 } 348 349 function akismet_get_host($host) { 350 // if all servers are accessible, just return the host name. 351 // if not, return an IP that was known to be accessible at the last check. 352 if ( akismet_server_connectivity_ok() ) { 353 return $host; 354 } else { 355 $ips = akismet_get_server_connectivity(); 356 // a firewall may be blocking access to some Akismet IPs 357 if ( count($ips) > 0 && count(array_filter($ips)) < count($ips) ) { 358 // use DNS to get current IPs, but exclude any known to be unreachable 359 $dns = (array)gethostbynamel( rtrim($host, '.') . '.' ); 360 $dns = array_filter($dns); 361 foreach ( $dns as $ip ) { 362 if ( array_key_exists( $ip, $ips ) && empty( $ips[$ip] ) ) 363 unset($dns[$ip]); 364 } 365 // return a random IP from those available 366 if ( count($dns) ) 367 return $dns[ array_rand($dns) ]; 368 369 } 370 } 371 // if all else fails try the host name 372 return $host; 373 } 374 375 // Returns array with headers in $response[0] and body in $response[1] 376 function akismet_http_post($request, $host, $path, $port = 80, $ip=null) { 377 global $wp_version; 378 379 $akismet_version = constant('AKISMET_VERSION'); 380 381 $http_request = "POST $path HTTP/1.0\r\n"; 382 $http_request .= "Host: $host\r\n"; 383 $http_request .= "Content-Type: application/x-www-form-urlencoded; charset=" . get_option('blog_charset') . "\r\n"; 384 $http_request .= "Content-Length: " . strlen($request) . "\r\n"; 385 $http_request .= "User-Agent: WordPress/$wp_version | Akismet/$akismet_version\r\n"; 386 $http_request .= "\r\n"; 387 $http_request .= $request; 388 389 $http_host = $host; 390 // use a specific IP if provided - needed by akismet_check_server_connectivity() 391 if ( $ip && long2ip(ip2long($ip)) ) { 392 $http_host = $ip; 393 } else { 394 $http_host = akismet_get_host($host); 395 } 396 397 $response = ''; 398 if( false != ( $fs = @fsockopen($http_host, $port, $errno, $errstr, 10) ) ) { 399 fwrite($fs, $http_request); 400 401 while ( !feof($fs) ) 402 $response .= fgets($fs, 1160); // One TCP-IP packet 403 fclose($fs); 404 $response = explode("\r\n\r\n", $response, 2); 405 } 406 return $response; 407 } 408 409 // filter handler used to return a spam result to pre_comment_approved 410 function akismet_result_spam( $approved ) { 411 // bump the counter here instead of when the filter is added to reduce the possibility of overcounting 412 if ( $incr = apply_filters('akismet_spam_count_incr', 1) ) 413 update_option( 'akismet_spam_count', get_option('akismet_spam_count') + $incr ); 414 return 'spam'; 415 } 416 417 function akismet_auto_check_comment( $comment ) { 418 global $akismet_api_host, $akismet_api_port; 419 420 $comment['user_ip'] = $_SERVER['REMOTE_ADDR']; 421 $comment['user_agent'] = $_SERVER['HTTP_USER_AGENT']; 422 $comment['referrer'] = $_SERVER['HTTP_REFERER']; 423 $comment['blog'] = get_option('home'); 424 $comment['blog_lang'] = get_locale(); 425 $comment['blog_charset'] = get_option('blog_charset'); 426 $comment['permalink'] = get_permalink($comment['comment_post_ID']); 427 428 $ignore = array( 'HTTP_COOKIE' ); 429 430 foreach ( $_SERVER as $key => $value ) 431 if ( !in_array( $key, $ignore ) && is_string($value) ) 432 $comment["$key"] = $value; 433 434 $query_string = ''; 435 foreach ( $comment as $key => $data ) 436 $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&'; 437 438 $response = akismet_http_post($query_string, $akismet_api_host, '/1.1/comment-check', $akismet_api_port); 439 if ( 'true' == $response[1] ) { 440 // akismet_spam_count will be incremented later by akismet_result_spam() 441 add_filter('pre_comment_approved', 'akismet_result_spam'); 442 443 do_action( 'akismet_spam_caught' ); 444 445 $post = get_post( $comment['comment_post_ID'] ); 446 $last_updated = strtotime( $post->post_modified_gmt ); 447 $diff = time() - $last_updated; 448 $diff = $diff / 86400; 449 450 if ( $post->post_type == 'post' && $diff > 30 && get_option( 'akismet_discard_month' ) == 'true' ) { 451 // akismet_result_spam() won't be called so bump the counter here 452 if ( $incr = apply_filters('akismet_spam_count_incr', 1) ) 453 update_option( 'akismet_spam_count', get_option('akismet_spam_count') + $incr ); 454 die; 455 } 456 } 457 akismet_delete_old(); 458 return $comment; 459 } 460 461 function akismet_delete_old() { 462 global $wpdb; 463 $now_gmt = current_time('mysql', 1); 464 $wpdb->query("DELETE FROM $wpdb->comments WHERE DATE_SUB('$now_gmt', INTERVAL 15 DAY) > comment_date_gmt AND comment_approved = 'spam'"); 465 $n = mt_rand(1, 5000); 466 if ( $n == 11 ) // lucky number 467 $wpdb->query("OPTIMIZE TABLE $wpdb->comments"); 468 } 469 470 function akismet_submit_nonspam_comment ( $comment_id ) { 471 global $wpdb, $akismet_api_host, $akismet_api_port, $current_user, $current_site; 472 $comment_id = (int) $comment_id; 473 474 $comment = $wpdb->get_row("SELECT * FROM $wpdb->comments WHERE comment_ID = '$comment_id'"); 475 if ( !$comment ) // it was deleted 476 return; 477 $comment->blog = get_option('home'); 478 $comment->blog_lang = get_locale(); 479 $comment->blog_charset = get_option('blog_charset'); 480 $comment->permalink = get_permalink($comment->comment_post_ID); 481 if ( is_object($current_user) ) { 482 $comment->reporter = $current_user->user_login; 483 } 484 if ( is_object($current_site) ) { 485 $comment->site_domain = $current_site->domain; 486 } 487 $query_string = ''; 488 foreach ( $comment as $key => $data ) 489 $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&'; 490 491 $response = akismet_http_post($query_string, $akismet_api_host, "/1.1/submit-ham", $akismet_api_port); 492 } 493 494 function akismet_submit_spam_comment ( $comment_id ) { 495 global $wpdb, $akismet_api_host, $akismet_api_port, $current_user, $current_site; 496 $comment_id = (int) $comment_id; 497 498 $comment = $wpdb->get_row("SELECT * FROM $wpdb->comments WHERE comment_ID = '$comment_id'"); 499 if ( !$comment ) // it was deleted 500 return; 501 if ( 'spam' != $comment->comment_approved ) 502 return; 503 $comment->blog = get_option('home'); 504 $comment->blog_lang = get_locale(); 505 $comment->blog_charset = get_option('blog_charset'); 506 $comment->permalink = get_permalink($comment->comment_post_ID); 507 if ( is_object($current_user) ) { 508 $comment->reporter = $current_user->user_login; 509 } 510 if ( is_object($current_site) ) { 511 $comment->site_domain = $current_site->domain; 512 } 513 $query_string = ''; 514 foreach ( $comment as $key => $data ) 515 $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&'; 516 517 $response = akismet_http_post($query_string, $akismet_api_host, "/1.1/submit-spam", $akismet_api_port); 518 } 519 520 add_action('preprocess_comment', 'akismet_auto_check_comment', 1); 521 522 // For old versions of WP only 523 function akismet_set_comment_status( $comment_id, $status ) { 524 if ( $status == 'spam' ) { 525 akismet_submit_spam_comment( $comment_id ); 526 } elseif ( $status == 'approve' ) { 527 akismet_submit_nonspam_comment( $comment_id ); 528 } 529 } 530 531 // For WP 2.7+ 532 function akismet_transition_comment_status( $new_status, $old_status, $comment ) { 533 if ( $new_status == $old_status ) 534 return; 535 536 if ( $new_status == 'spam' ) { 537 akismet_submit_spam_comment( $comment->comment_ID ); 538 } elseif ( $old_status == 'spam' ) { 539 akismet_submit_nonspam_comment( $comment->comment_ID ); 540 } 541 } 542 543 function akismet_spamtoham( $comment ) { akismet_submit_nonspam_comment( $comment->comment_ID ); } 544 545 if ( function_exists( 'wp_transition_comment_status' ) ) { 546 add_action( 'transition_comment_status', 'akismet_transition_comment_status', 10, 3 ); 547 } else { 548 add_action('wp_set_comment_status', 'akismet_set_comment_status', 10, 2); 549 add_action('edit_comment', 'akismet_submit_spam_comment'); 550 add_filter( 'comment_spam_to_approved', 'akismet_spamtoham' ); 551 add_filter( 'comment_spam_to_unapproved', 'akismet_spamtoham' ); 552 } 553 // Total spam in queue 554 // get_option( 'akismet_spam_count' ) is the total caught ever 555 function akismet_spam_count( $type = false ) { 556 global $wpdb; 557 558 if ( !$type ) { // total 559 $count = wp_cache_get( 'akismet_spam_count', 'widget' ); 560 if ( false === $count ) { 561 if ( function_exists('wp_count_comments') ) { 562 $count = wp_count_comments(); 563 $count = $count->spam; 564 } else { 565 $count = (int) $wpdb->get_var("SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_approved = 'spam'"); 566 } 567 wp_cache_set( 'akismet_spam_count', $count, 'widget', 3600 ); 568 } 569 return $count; 570 } elseif ( 'comments' == $type || 'comment' == $type ) { // comments 571 $type = ''; 572 } else { // pingback, trackback, ... 573 $type = $wpdb->escape( $type ); 574 } 575 576 return (int) $wpdb->get_var("SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_approved = 'spam' AND comment_type='$type'"); 577 } 578 579 function akismet_spam_comments( $type = false, $page = 1, $per_page = 50 ) { 580 global $wpdb; 581 582 $page = (int) $page; 583 if ( $page < 2 ) 584 $page = 1; 585 586 $per_page = (int) $per_page; 587 if ( $per_page < 1 ) 588 $per_page = 50; 589 590 $start = ( $page - 1 ) * $per_page; 591 $end = $start + $per_page; 592 593 if ( $type ) { 594 if ( 'comments' == $type || 'comment' == $type ) 595 $type = ''; 596 else 597 $type = $wpdb->escape( $type ); 598 return $wpdb->get_results( "SELECT * FROM $wpdb->comments WHERE comment_approved = 'spam' AND comment_type='$type' ORDER BY comment_date DESC LIMIT $start, $end"); 599 } 600 601 // All 602 return $wpdb->get_results( "SELECT * FROM $wpdb->comments WHERE comment_approved = 'spam' ORDER BY comment_date DESC LIMIT $start, $end"); 603 } 604 605 // Totals for each comment type 606 // returns array( type => count, ... ) 607 function akismet_spam_totals() { 608 global $wpdb; 609 $totals = $wpdb->get_results( "SELECT comment_type, COUNT(*) AS cc FROM $wpdb->comments WHERE comment_approved = 'spam' GROUP BY comment_type" ); 610 $return = array(); 611 foreach ( $totals as $total ) 612 $return[$total->comment_type ? $total->comment_type : 'comment'] = $total->cc; 613 return $return; 614 } 615 616 function akismet_manage_page() { 617 global $wpdb, $submenu, $wp_db_version; 618 619 // WP 2.7 has its own spam management page 620 if ( 8645 <= $wp_db_version ) 621 return; 622 623 $count = sprintf(__('Akismet Spam (%s)'), akismet_spam_count()); 624 if ( isset( $submenu['edit-comments.php'] ) ) 625 add_submenu_page('edit-comments.php', __('Akismet Spam'), $count, 'moderate_comments', 'akismet-admin', 'akismet_caught' ); 626 elseif ( function_exists('add_management_page') ) 627 add_management_page(__('Akismet Spam'), $count, 'moderate_comments', 'akismet-admin', 'akismet_caught'); 628 } 629 630 function akismet_caught() { 631 global $wpdb, $comment, $akismet_caught, $akismet_nonce; 632 633 akismet_recheck_queue(); 634 if (isset($_POST['submit']) && 'recover' == $_POST['action'] && ! empty($_POST['not_spam'])) { 635 check_admin_referer( $akismet_nonce ); 636 if ( function_exists('current_user_can') && !current_user_can('moderate_comments') ) 637 die(__('You do not have sufficient permission to moderate comments.')); 638 639 $i = 0; 640 foreach ($_POST['not_spam'] as $comment): 641 $comment = (int) $comment; 642 if ( function_exists('wp_set_comment_status') ) 643 wp_set_comment_status($comment, 'approve'); 644 else 645 $wpdb->query("UPDATE $wpdb->comments SET comment_approved = '1' WHERE comment_ID = '$comment'"); 646 akismet_submit_nonspam_comment($comment); 647 ++$i; 648 endforeach; 649 $to = add_query_arg( 'recovered', $i, $_SERVER['HTTP_REFERER'] ); 650 wp_redirect( $to ); 651 exit; 652 } 653 if ('delete' == $_POST['action']) { 654 check_admin_referer( $akismet_nonce ); 655 if ( function_exists('current_user_can') && !current_user_can('moderate_comments') ) 656 die(__('You do not have sufficient permission to moderate comments.')); 657 658 $delete_time = $wpdb->escape( $_POST['display_time'] ); 659 $nuked = $wpdb->query( "DELETE FROM $wpdb->comments WHERE comment_approved = 'spam' AND '$delete_time' > comment_date_gmt" ); 660 wp_cache_delete( 'akismet_spam_count', 'widget' ); 661 $to = add_query_arg( 'deleted', 'all', $_SERVER['HTTP_REFERER'] ); 662 wp_redirect( $to ); 663 exit; 664 } 665 666 if ( isset( $_GET['recovered'] ) ) { 667 $i = (int) $_GET['recovered']; 668 echo '<div class="updated"><p>' . sprintf(__('%1$s comments recovered.'), $i) . "</p></div>"; 669 } 670 671 if (isset( $_GET['deleted'] ) ) 672 echo '<div class="updated"><p>' . __('All spam deleted.') . '</p></div>'; 673 674 if ( isset( $GLOBALS['submenu']['edit-comments.php'] ) ) 675 $link = 'edit-comments.php'; 676 else 677 $link = 'edit.php'; 678 ?> 679 <style type="text/css"> 680 .akismet-tabs { 681 list-style: none; 682 margin: 0; 683 padding: 0; 684 clear: both; 685 border-bottom: 1px solid #ccc; 686 height: 31px; 687 margin-bottom: 20px; 688 background: #ddd; 689 border-top: 1px solid #bdbdbd; 690 } 691 .akismet-tabs li { 692 float: left; 693 margin: 5px 0 0 20px; 694 } 695 .akismet-tabs a { 696 display: block; 697 padding: 4px .5em 3px; 698 border-bottom: none; 699 color: #036; 700 } 701 .akismet-tabs .active a { 702 background: #fff; 703 border: 1px solid #ccc; 704 border-bottom: none; 705 color: #000; 706 font-weight: bold; 707 padding-bottom: 4px; 708 } 709 #akismetsearch { 710 float: right; 711 margin-top: -.5em; 712 } 713 714 #akismetsearch p { 715 margin: 0; 716 padding: 0; 717 } 718 </style> 719 <div class="wrap"> 720 <h2><?php _e('Caught Spam') ?></h2> 721 <?php 722 $count = get_option( 'akismet_spam_count' ); 723 if ( $count ) { 724 ?> 725 <p><?php printf(__('Akismet has caught <strong>%1$s spam</strong> for you since you first installed it.'), number_format_i18n($count) ); ?></p> 726 <?php 727 } 728 729 $spam_count = akismet_spam_count(); 730 731 if ( 0 == $spam_count ) { 732 echo '<p>'.__('You have no spam currently in the queue. Must be your lucky day. :)').'</p>'; 733 echo '</div>'; 734 } else { 735 echo '<p>'.__('You can delete all of the spam from your database with a single click. This operation cannot be undone, so you may wish to check to ensure that no legitimate comments got through first. Spam is automatically deleted after 15 days, so don’t sweat it.').'</p>'; 736 ?> 737 <?php if ( !isset( $_POST['s'] ) ) { ?> 738 <form method="post" action="<?php echo attribute_escape( add_query_arg( 'noheader', 'true' ) ); ?>"> 739 <?php akismet_nonce_field($akismet_nonce) ?> 740 <input type="hidden" name="action" value="delete" /> 741 <?php printf(__('There are currently %1$s comments identified as spam.'), $spam_count); ?> <input type="submit" class="button delete" name="Submit" value="<?php _e('Delete all'); ?>" /> 742 <input type="hidden" name="display_time" value="<?php echo current_time('mysql', 1); ?>" /> 743 </form> 744 <?php } ?> 745 </div> 746 <div class="wrap"> 747 <?php if ( isset( $_POST['s'] ) ) { ?> 748 <h2><?php _e('Search'); ?></h2> 749 <?php } else { ?> 750 <?php echo '<p>'.__('These are the latest comments identified as spam by Akismet. If you see any mistakes, simply mark the comment as "not spam" and Akismet will learn from the submission. If you wish to recover a comment from spam, simply select the comment, and click Not Spam. After 15 days we clean out the junk for you.').'</p>'; ?> 751 <?php } ?> 752 <?php 753 if ( isset( $_POST['s'] ) ) { 754 $s = $wpdb->escape($_POST['s']); 755 $comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE 756 (comment_author LIKE '%$s%' OR 757 comment_author_email LIKE '%$s%' OR 758 comment_author_url LIKE ('%$s%') OR 759 comment_author_IP LIKE ('%$s%') OR 760 comment_content LIKE ('%$s%') ) AND 761 comment_approved = 'spam' 762 ORDER BY comment_date DESC"); 763 } else { 764 if ( isset( $_GET['apage'] ) ) 765 $page = (int) $_GET['apage']; 766 else 767 $page = 1; 768 769 if ( $page < 2 ) 770 $page = 1; 771 772 $current_type = false; 773 if ( isset( $_GET['ctype'] ) ) 774 $current_type = preg_replace( '|[^a-z]|', '', $_GET['ctype'] ); 775 776 $comments = akismet_spam_comments( $current_type, $page ); 777 $total = akismet_spam_count( $current_type ); 778 $totals = akismet_spam_totals(); 779 ?> 780 <ul class="akismet-tabs"> 781 <li <?php if ( !isset( $_GET['ctype'] ) ) echo ' class="active"'; ?>><a href="edit-comments.php?page=akismet-admin"><?php _e('All'); ?></a></li> 782 <?php 783 foreach ( $totals as $type => $type_count ) { 784 if ( 'comment' == $type ) { 785 $type = 'comments'; 786 $show = __('Comments'); 787 } else { 788 $show = ucwords( $type ); 789 } 790 $type_count = number_format_i18n( $type_count ); 791 $extra = $current_type === $type ? ' class="active"' : ''; 792 echo "<li $extra><a href='edit-comments.php?page=akismet-admin&ctype=$type'>$show ($type_count)</a></li>"; 793 } 794 do_action( 'akismet_tabs' ); // so plugins can add more tabs easily 795 ?> 796 </ul> 797 <?php 798 } 799 800 if ($comments) { 801 ?> 802 <form method="post" action="<?php echo attribute_escape("$link?page=akismet-admin"); ?>" id="akismetsearch"> 803 <p> <input type="text" name="s" value="<?php if (isset($_POST['s'])) echo attribute_escape($_POST['s']); ?>" size="17" /> 804 <input type="submit" class="button" name="submit" value="<?php echo attribute_escape(__('Search Spam »')) ?>" /> </p> 805 </form> 806 <?php if ( $total > 50 ) { 807 $total_pages = ceil( $total / 50 ); 808 $r = ''; 809 if ( 1 < $page ) { 810 $args['apage'] = ( 1 == $page - 1 ) ? '' : $page - 1; 811 $r .= '<a class="prev" href="' . clean_url(add_query_arg( $args )) . '">'. __('« Previous Page') .'</a>' . "\n"; 812 } 813 if ( ( $total_pages = ceil( $total / 50 ) ) > 1 ) { 814 for ( $page_num = 1; $page_num <= $total_pages; $page_num++ ) : 815 if ( $page == $page_num ) : 816 $r .= "<strong>$page_num</strong>\n"; 817 else : 818 $p = false; 819 if ( $page_num < 3 || ( $page_num >= $page - 3 && $page_num <= $page + 3 ) || $page_num > $total_pages - 3 ) : 820 $args['apage'] = ( 1 == $page_num ) ? '' : $page_num; 821 $r .= '<a class="page-numbers" href="' . clean_url(add_query_arg($args)) . '">' . ( $page_num ) . "</a>\n"; 822 $in = true; 823 elseif ( $in == true ) : 824 $r .= "...\n"; 825 $in = false; 826 endif; 827 endif; 828 endfor; 829 } 830 if ( ( $page ) * 50 < $total || -1 == $total ) { 831 $args['apage'] = $page + 1; 832 $r .= '<a class="next" href="' . clean_url(add_query_arg($args)) . '">'. __('Next Page »') .'</a>' . "\n"; 833 } 834 echo "<p>$r</p>"; 835 ?> 836 837 <?php } ?> 838 <form style="clear: both;" method="post" action="<?php echo attribute_escape( add_query_arg( 'noheader', 'true' ) ); ?>"> 839 <?php akismet_nonce_field($akismet_nonce) ?> 840 <input type="hidden" name="action" value="recover" /> 841 <ul id="spam-list" class="commentlist" style="list-style: none; margin: 0; padding: 0;"> 842 <?php 843 $i = 0; 844 foreach($comments as $comment) { 845 $i++; 846 $comment_date = mysql2date(get_option("date_format") . " @ " . get_option("time_format"), $comment->comment_date); 847 $post = get_post($comment->comment_post_ID); 848 $post_title = $post->post_title; 849 if ($i % 2) $class = 'class="alternate"'; 850 else $class = ''; 851 echo "\n\t<li id='comment-$comment->comment_ID' $class>"; 852 ?> 853 854 <p><strong><?php comment_author() ?></strong> <?php if ($comment->comment_author_email) { ?>| <?php comment_author_email_link() ?> <?php } if ($comment->comment_author_url && 'http://' != $comment->comment_author_url) { ?> | <?php comment_author_url_link() ?> <?php } ?>| <?php _e('IP:') ?> <a href="http://ws.arin.net/cgi-bin/whois.pl?queryinput=<?php comment_author_IP() ?>"><?php comment_author_IP() ?></a></p> 855 856 <?php comment_text() ?> 857 858 <p><label for="spam-<?php echo $comment->comment_ID; ?>"> 859 <input type="checkbox" id="spam-<?php echo $comment->comment_ID; ?>" name="not_spam[]" value="<?php echo $comment->comment_ID; ?>" /> 860 <?php _e('Not Spam') ?></label> — <?php comment_date('M j, g:i A'); ?> — [ 861 <?php 862 $post = get_post($comment->comment_post_ID); 863 $post_title = wp_specialchars( $post->post_title, 'double' ); 864 $post_title = ('' == $post_title) ? "# $comment->comment_post_ID" : $post_title; 865 ?> 866 <a href="<?php echo get_permalink($comment->comment_post_ID); ?>" title="<?php echo $post_title; ?>"><?php _e('View Post') ?></a> ] </p> 867 868 869 <?php 870 } 871 ?> 872 </ul> 873 <?php if ( $total > 50 ) { 874 $total_pages = ceil( $total / 50 ); 875 $r = ''; 876 if ( 1 < $page ) { 877 $args['apage'] = ( 1 == $page - 1 ) ? '' : $page - 1; 878 $r .= '<a class="prev" href="' . clean_url(add_query_arg( $args )) . '">'. __('« Previous Page') .'</a>' . "\n"; 879 } 880 if ( ( $total_pages = ceil( $total / 50 ) ) > 1 ) { 881 for ( $page_num = 1; $page_num <= $total_pages; $page_num++ ) : 882 if ( $page == $page_num ) : 883 $r .= "<strong>$page_num</strong>\n"; 884 else : 885 $p = false; 886 if ( $page_num < 3 || ( $page_num >= $page - 3 && $page_num <= $page + 3 ) || $page_num > $total_pages - 3 ) : 887 $args['apage'] = ( 1 == $page_num ) ? '' : $page_num; 888 $r .= '<a class="page-numbers" href="' . clean_url(add_query_arg($args)) . '">' . ( $page_num ) . "</a>\n"; 889 $in = true; 890 elseif ( $in == true ) : 891 $r .= "...\n"; 892 $in = false; 893 endif; 894 endif; 895 endfor; 896 } 897 if ( ( $page ) * 50 < $total || -1 == $total ) { 898 $args['apage'] = $page + 1; 899 $r .= '<a class="next" href="' . clean_url(add_query_arg($args)) . '">'. __('Next Page »') .'</a>' . "\n"; 900 } 901 echo "<p>$r</p>"; 902 } 903 ?> 904 <p class="submit"> 905 <input type="submit" name="submit" value="<?php echo attribute_escape(__('De-spam marked comments »')); ?>" /> 906 </p> 907 <p><?php _e('Comments you de-spam will be submitted to Akismet as mistakes so it can learn and get better.'); ?></p> 908 </form> 909 <?php 910 } else { 911 ?> 912 <p><?php _e('No results found.'); ?></p> 913 <?php } ?> 914 915 <?php if ( !isset( $_POST['s'] ) ) { ?> 916 <form method="post" action="<?php echo attribute_escape( add_query_arg( 'noheader', 'true' ) ); ?>"> 917 <?php akismet_nonce_field($akismet_nonce) ?> 918 <p><input type="hidden" name="action" value="delete" /> 919 <?php printf(__('There are currently %1$s comments identified as spam.'), $spam_count); ?> <input type="submit" name="Submit" class="button" value="<?php echo attribute_escape(__('Delete all')); ?>" /> 920 <input type="hidden" name="display_time" value="<?php echo current_time('mysql', 1); ?>" /></p> 921 </form> 922 <?php } ?> 923 </div> 924 <?php 925 } 926 } 927 928 add_action('admin_menu', 'akismet_manage_page'); 929 930 // WP < 2.5 931 function akismet_stats() { 932 if ( !function_exists('did_action') || did_action( 'rightnow_end' ) ) // We already displayed this info in the "Right Now" section 933 return; 934 if ( !$count = get_option('akismet_spam_count') ) 935 return; 936 $path = plugin_basename(__FILE__); 937 echo '<h3>'.__('Spam').'</h3>'; 938 global $submenu; 939 if ( isset( $submenu['edit-comments.php'] ) ) 940 $link = 'edit-comments.php'; 941 else 942 $link = 'edit.php'; 943 echo '<p>'.sprintf(__('<a href="%1$s">Akismet</a> has protected your site from <a href="%2$s">%3$s spam comments</a>.'), 'http://akismet.com/', clean_url("$link?page=akismet-admin"), number_format_i18n($count) ).'</p>'; 944 } 945 946 add_action('activity_box_end', 'akismet_stats'); 947 948 // WP 2.5+ 949 function akismet_rightnow() { 950 global $submenu, $wp_db_version; 951 952 if ( 8645 < $wp_db_version ) // 2.7 953 $link = 'edit-comments.php?comment_status=spam'; 954 elseif ( isset( $submenu['edit-comments.php'] ) ) 955 $link = 'edit-comments.php?page=akismet-admin'; 956 else 957 $link = 'edit.php?page=akismet-admin'; 958 959 if ( $count = get_option('akismet_spam_count') ) { 960 $intro = sprintf( __ngettext( 961 '<a href="%1$s">Akismet</a> has protected your site from %2$s spam comment already,', 962 '<a href="%1$s">Akismet</a> has protected your site from %2$s spam comments already,', 963 $count 964 ), 'http://akismet.com/', number_format_i18n( $count ) ); 965 } else { 966 $intro = sprintf( __('<a href="%1$s">Akismet</a> blocks spam from getting to your blog,'), 'http://akismet.com/' ); 967 } 968 969 if ( $queue_count = akismet_spam_count() ) { 970 $queue_text = sprintf( __ngettext( 971 'and there\'s <a href="%2$s">%1$s comment</a> in your spam queue right now.', 972 'and there are <a href="%2$s">%1$s comments</a> in your spam queue right now.', 973 $queue_count 974 ), number_format_i18n( $queue_count ), clean_url($link) ); 975 } else { 976 $queue_text = sprintf( __( "but there's nothing in your <a href='%1\$s'>spam queue</a> at the moment." ), clean_url($link) ); 977 } 978 979 $text = sprintf( _c( '%1$s %2$s|akismet_rightnow' ), $intro, $queue_text ); 980 981 echo "<p class='akismet-right-now'>$text</p>\n"; 982 } 983 984 add_action('rightnow_end', 'akismet_rightnow'); 985 986 // For WP <= 2.3.x 987 global $pagenow; 988 989 if ( 'moderation.php' == $pagenow ) { 990 function akismet_recheck_button( $page ) { 991 global $submenu; 992 if ( isset( $submenu['edit-comments.php'] ) ) 993 $link = 'edit-comments.php'; 994 else 995 $link = 'edit.php'; 996 $button = "<a href='$link?page=akismet-admin&recheckqueue=true&noheader=true' style='display: block; width: 100px; position: absolute; right: 7%; padding: 5px; font-size: 14px; text-decoration: underline; background: #fff; border: 1px solid #ccc;'>" . __('Recheck Queue for Spam') . "</a>"; 997 $page = str_replace( '<div class="wrap">', '<div class="wrap">' . $button, $page ); 998 return $page; 999 } 1000 1001 if ( $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->comments WHERE comment_approved = '0'" ) ) 1002 ob_start( 'akismet_recheck_button' ); 1003 } 1004 1005 // For WP >= 2.5 1006 function akismet_check_for_spam_button($comment_status) { 1007 if ( 'approved' == $comment_status ) 1008 return; 1009 if ( function_exists('plugins_url') ) 1010 $link = 'admin.php?action=akismet_recheck_queue'; 1011 else 1012 $link = 'edit-comments.php?page=akismet-admin&recheckqueue=true&noheader=true'; 1013 echo "</div><div class='alignleft'><a class='button-secondary checkforspam' href='$link'>" . __('Check for Spam') . "</a>"; 1014 } 1015 add_action('manage_comments_nav', 'akismet_check_for_spam_button'); 1016 1017 function akismet_recheck_queue() { 1018 global $wpdb, $akismet_api_host, $akismet_api_port; 1019 1020 if ( ! ( isset( $_GET['recheckqueue'] ) || ( isset( $_REQUEST['action'] ) && 'akismet_recheck_queue' == $_REQUEST['action'] ) ) ) 1021 return; 1022 1023 $moderation = $wpdb->get_results( "SELECT * FROM $wpdb->comments WHERE comment_approved = '0'", ARRAY_A ); 1024 foreach ( (array) $moderation as $c ) { 1025 $c['user_ip'] = $c['comment_author_IP']; 1026 $c['user_agent'] = $c['comment_agent']; 1027 $c['referrer'] = ''; 1028 $c['blog'] = get_option('home'); 1029 $c['blog_lang'] = get_locale(); 1030 $c['blog_charset'] = get_option('blog_charset'); 1031 $c['permalink'] = get_permalink($c['comment_post_ID']); 1032 $id = (int) $c['comment_ID']; 1033 1034 $query_string = ''; 1035 foreach ( $c as $key => $data ) 1036 $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&'; 1037 1038 $response = akismet_http_post($query_string, $akismet_api_host, '/1.1/comment-check', $akismet_api_port); 1039 if ( 'true' == $response[1] ) { 1040 $wpdb->query( "UPDATE $wpdb->comments SET comment_approved = 'spam' WHERE comment_ID = $id" ); 1041 } 1042 } 1043 wp_redirect( $_SERVER['HTTP_REFERER'] ); 1044 exit; 1045 } 1046 1047 add_action('admin_action_akismet_recheck_queue', 'akismet_recheck_queue'); 1048 1049 function akismet_check_db_comment( $id ) { 1050 global $wpdb, $akismet_api_host, $akismet_api_port; 1051 1052 $id = (int) $id; 1053 $c = $wpdb->get_row( "SELECT * FROM $wpdb->comments WHERE comment_ID = '$id'", ARRAY_A ); 1054 if ( !$c ) 1055 return; 1056 1057 $c['user_ip'] = $c['comment_author_IP']; 1058 $c['user_agent'] = $c['comment_agent']; 1059 $c['referrer'] = ''; 1060 $c['blog'] = get_option('home'); 1061 $c['blog_lang'] = get_locale(); 1062 $c['blog_charset'] = get_option('blog_charset'); 1063 $c['permalink'] = get_permalink($c['comment_post_ID']); 1064 $id = $c['comment_ID']; 1065 1066 $query_string = ''; 1067 foreach ( $c as $key => $data ) 1068 $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&'; 1069 1070 $response = akismet_http_post($query_string, $akismet_api_host, '/1.1/comment-check', $akismet_api_port); 1071 return $response[1]; 1072 } 1073 1074 // This option causes tons of FPs, was removed in 2.1 1075 function akismet_kill_proxy_check( $option ) { return 0; } 1076 add_filter('option_open_proxy_check', 'akismet_kill_proxy_check'); 1077 1078 // Widget stuff 1079 function widget_akismet_register() { 1080 if ( function_exists('register_sidebar_widget') ) : 1081 function widget_akismet($args) { 1082 extract($args); 1083 $options = get_option('widget_akismet'); 1084 $count = number_format_i18n(get_option('akismet_spam_count')); 1085 ?> 1086 <?php echo $before_widget; ?> 1087 <?php echo $before_title . $options['title'] . $after_title; ?> 1088 <div id="akismetwrap"><div id="akismetstats"><a id="aka" href="http://akismet.com" title=""><?php printf( __( '%1$s %2$sspam comments%3$s %4$sblocked by%5$s<br />%6$sAkismet%7$s' ), '<div id="akismet1"><span id="akismetcount">' . $count . '</span>', '<span id="akismetsc">', '</span></div>', '<div id="akismet2"><span id="akismetbb">', '</span>', '<span id="akismeta">', '</span></div>' ); ?></a></div></div> 1089 <?php echo $after_widget; ?> 1090 <?php 1091 } 1092 1093 function widget_akismet_style() { 1094 ?> 1095 <style type="text/css"> 1096 #aka,#aka:link,#aka:hover,#aka:visited,#aka:active{color:#fff;text-decoration:none} 1097 #aka:hover{border:none;text-decoration:none} 1098 #aka:hover #akismet1{display:none} 1099 #aka:hover #akismet2,#akismet1{display:block} 1100 #akismet2{display:none;padding-top:2px} 1101 #akismeta{font-size:16px;font-weight:bold;line-height:18px;text-decoration:none} 1102 #akismetcount{display:block;font:15px Verdana,Arial,Sans-Serif;font-weight:bold;text-decoration:none} 1103 #akismetwrap #akismetstats{background:url(<?php echo get_option('siteurl'); ?>/wp-content/plugins/akismet/akismet.gif) no-repeat top left;border:none;color:#fff;font:11px 'Trebuchet MS','Myriad Pro',sans-serif;height:40px;line-height:100%;overflow:hidden;padding:8px 0 0;text-align:center;width:120px} 1104 </style> 1105 <?php 1106 } 1107 1108 function widget_akismet_control() { 1109 $options = $newoptions = get_option('widget_akismet'); 1110 if ( $_POST["akismet-submit"] ) { 1111 $newoptions['title'] = strip_tags(stripslashes($_POST["akismet-title"])); 1112 if ( empty($newoptions['title']) ) $newoptions['title'] = 'Spam Blocked'; 1113 } 1114 if ( $options != $newoptions ) { 1115 $options = $newoptions; 1116 update_option('widget_akismet', $options); 1117 } 1118 $title = htmlspecialchars($options['title'], ENT_QUOTES); 1119 ?> 1120 <p><label for="akismet-title"><?php _e('Title:'); ?> <input style="width: 250px;" id="akismet-title" name="akismet-title" type="text" value="<?php echo $title; ?>" /></label></p> 1121 <input type="hidden" id="akismet-submit" name="akismet-submit" value="1" /> 1122 <?php 1123 } 1124 1125 register_sidebar_widget('Akismet', 'widget_akismet', null, 'akismet'); 1126 register_widget_control('Akismet', 'widget_akismet_control', null, 75, 'akismet'); 1127 if ( is_active_widget('widget_akismet') ) 1128 add_action('wp_head', 'widget_akismet_style'); 1129 endif; 1130 } 1131 1132 add_action('init', 'widget_akismet_register'); 1133 1134 // Counter for non-widget users 1135 function akismet_counter() { 1136 ?> 1137 <style type="text/css"> 1138 #akismetwrap #aka,#aka:link,#aka:hover,#aka:visited,#aka:active{color:#fff;text-decoration:none} 1139 #aka:hover{border:none;text-decoration:none} 1140 #aka:hover #akismet1{display:none} 1141 #aka:hover #akismet2,#akismet1{display:block} 1142 #akismet2{display:none;padding-top:2px} 1143 #akismeta{font-size:16px;font-weight:bold;line-height:18px;text-decoration:none} 1144 #akismetcount{display:block;font:15px Verdana,Arial,Sans-Serif;font-weight:bold;text-decoration:none} 1145 #akismetwrap #akismetstats{background:url(<?php echo get_option('siteurl'); ?>/wp-content/plugins/akismet/akismet.gif) no-repeat top left;border:none;color:#fff;font:11px 'Trebuchet MS','Myriad Pro',sans-serif;height:40px;line-height:100%;overflow:hidden;padding:8px 0 0;text-align:center;width:120px} 1146 </style> 1147 <?php 1148 $count = number_format_i18n(get_option('akismet_spam_count')); 1149 ?> 1150 <div id="akismetwrap"><div id="akismetstats"><a id="aka" href="http://akismet.com" title=""><div id="akismet1"><span id="akismetcount"><?php echo $count; ?></span> <span id="akismetsc"><?php _e('spam comments') ?></span></div> <div id="akismet2"><span id="akismetbb"><?php _e('blocked by') ?></span><br /><span id="akismeta">Akismet</span></div></a></div></div> 1151 <?php 1152 } 1153 1154 ?>
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
| Generated: Mon May 3 09:12:34 2010 | Cross-referenced by PHPXref 0.7 |