angelovcom.net

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

class.akismet-cli.php (4663B)


      1 <?php
      2 
      3 WP_CLI::add_command( 'akismet', 'Akismet_CLI' );
      4 
      5 /**
      6  * Filter spam comments.
      7  */
      8 class Akismet_CLI extends WP_CLI_Command {
      9 	/**
     10 	 * Checks one or more comments against the Akismet API.
     11 	 *
     12 	 * ## OPTIONS
     13 	 * <comment_id>...
     14 	 * : The ID(s) of the comment(s) to check.
     15 	 *
     16 	 * [--noaction]
     17 	 * : Don't change the status of the comment. Just report what Akismet thinks it is.
     18 	 *
     19 	 * ## EXAMPLES
     20 	 *
     21 	 *     wp akismet check 12345
     22 	 *
     23 	 * @alias comment-check
     24 	 */
     25 	public function check( $args, $assoc_args ) {
     26 		foreach ( $args as $comment_id ) {
     27 			if ( isset( $assoc_args['noaction'] ) ) {
     28 				// Check the comment, but don't reclassify it.
     29 				$api_response = Akismet::check_db_comment( $comment_id, 'wp-cli' );
     30 			}
     31 			else {
     32 				$api_response = Akismet::recheck_comment( $comment_id, 'wp-cli' );
     33 			}
     34 			
     35 			if ( 'true' === $api_response ) {
     36 				WP_CLI::line( sprintf( __( "Comment #%d is spam.", 'akismet' ), $comment_id ) );
     37 			}
     38 			else if ( 'false' === $api_response ) {
     39 				WP_CLI::line( sprintf( __( "Comment #%d is not spam.", 'akismet' ), $comment_id ) );
     40 			}
     41 			else {
     42 				if ( false === $api_response ) {
     43 					WP_CLI::error( __( "Failed to connect to Akismet.", 'akismet' ) );
     44 				}
     45 				else if ( is_wp_error( $api_response ) ) {
     46 					WP_CLI::warning( sprintf( __( "Comment #%d could not be checked.", 'akismet' ), $comment_id ) );
     47 				}
     48 			}
     49 		}
     50 	}
     51 	
     52 	/**
     53 	 * Recheck all comments in the Pending queue.
     54 	 *
     55 	 * ## EXAMPLES
     56 	 *
     57 	 *     wp akismet recheck_queue
     58 	 *
     59 	 * @alias recheck-queue
     60 	 */
     61 	public function recheck_queue() {
     62 		$batch_size = 100;
     63 		$start = 0;
     64 		
     65 		$total_counts = array();
     66 		
     67 		do {
     68 			$result_counts = Akismet_Admin::recheck_queue_portion( $start, $batch_size );
     69 			
     70 			if ( $result_counts['processed'] > 0 ) {
     71 				foreach ( $result_counts as $key => $count ) {
     72 					if ( ! isset( $total_counts[ $key ] ) ) {
     73 						$total_counts[ $key ] = $count;
     74 					}
     75 					else {
     76 						$total_counts[ $key ] += $count;
     77 					}
     78 				}
     79 				$start += $batch_size;
     80 				$start -= $result_counts['spam']; // These comments will have been removed from the queue.
     81 			}
     82 		} while ( $result_counts['processed'] > 0 );
     83 		
     84 		WP_CLI::line( sprintf( _n( "Processed %d comment.", "Processed %d comments.", $total_counts['processed'], 'akismet' ), number_format( $total_counts['processed'] ) ) );
     85 		WP_CLI::line( sprintf( _n( "%d comment moved to Spam.", "%d comments moved to Spam.", $total_counts['spam'], 'akismet' ), number_format( $total_counts['spam'] ) ) );
     86 		
     87 		if ( $total_counts['error'] ) {
     88 			WP_CLI::line( sprintf( _n( "%d comment could not be checked.", "%d comments could not be checked.", $total_counts['error'], 'akismet' ), number_format( $total_counts['error'] ) ) );
     89 		}
     90 	}
     91 	
     92 	/**
     93 	 * Fetches stats from the Akismet API.
     94 	 *
     95 	 * ## OPTIONS
     96 	 *
     97 	 * [<interval>]
     98 	 * : The time period for which to retrieve stats.
     99 	 * ---
    100 	 * default: all
    101 	 * options:
    102 	 *  - days
    103 	 *  - months
    104 	 *  - all
    105 	 * ---
    106 	 *
    107 	 * [--format=<format>]
    108 	 * : Allows overriding the output of the command when listing connections.
    109 	 * ---
    110 	 * default: table
    111 	 * options:
    112 	 *  - table
    113 	 *  - json
    114 	 *  - csv
    115 	 *  - yaml
    116 	 *  - count
    117 	 * ---
    118 	 *
    119 	 * [--summary]
    120 	 * : When set, will display a summary of the stats.
    121 	 *
    122 	 * ## EXAMPLES
    123 	 *
    124 	 * wp akismet stats
    125 	 * wp akismet stats all
    126 	 * wp akismet stats days
    127 	 * wp akismet stats months
    128 	 * wp akismet stats all --summary
    129 	 */
    130 	public function stats( $args, $assoc_args ) {
    131 		$api_key = Akismet::get_api_key();
    132  
    133 		if ( empty( $api_key ) ) {
    134 			WP_CLI::error( __( 'API key must be set to fetch stats.', 'akismet' ) );
    135 		}
    136  
    137 		switch ( $args[0] ) {
    138 			case 'days':
    139 				$interval = '60-days';
    140 				break;
    141 			case 'months':
    142 				$interval = '6-months';
    143 				break;
    144 			default:
    145 				$interval = 'all';
    146 				break;
    147 		}
    148  
    149 		$response = Akismet::http_post(
    150 			Akismet::build_query( array(
    151 				'blog' => get_option( 'home' ),
    152 				'key'  => $api_key,
    153 				'from' => $interval,
    154 			) ),
    155 			'get-stats'
    156 		);
    157  
    158 		if ( empty( $response[1] ) ) {
    159 			WP_CLI::error( __( 'Currently unable to fetch stats. Please try again.', 'akismet' ) );
    160 		}
    161  
    162 		$response_body = json_decode( $response[1], true );
    163 		
    164 		if ( is_null( $response_body ) ) {
    165 			WP_CLI::error( __( 'Stats response could not be decoded.', 'akismet' ) );
    166 		}
    167  
    168 		if ( isset( $assoc_args['summary'] ) ) {
    169 			$keys = array(
    170 				'spam',
    171 				'ham',
    172 				'missed_spam',
    173 				'false_positives',
    174 				'accuracy',
    175 				'time_saved',
    176 			);
    177  
    178 			WP_CLI\Utils\format_items( $assoc_args['format'], array( $response_body ), $keys );
    179 		}
    180 		else {
    181 			$stats = $response_body['breakdown'];
    182 			WP_CLI\Utils\format_items( $assoc_args['format'], $stats, array_keys( end( $stats ) ) );
    183 		}
    184 	}
    185 }