summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/akismet/class.akismet.php')
-rw-r--r--plugins/akismet/class.akismet.php66
1 files changed, 53 insertions, 13 deletions
diff --git a/plugins/akismet/class.akismet.php b/plugins/akismet/class.akismet.php
index 02d994d1..32b23ea8 100644
--- a/plugins/akismet/class.akismet.php
+++ b/plugins/akismet/class.akismet.php
@@ -37,6 +37,7 @@ class Akismet {
add_action( 'admin_head-edit-comments.php', array( 'Akismet', 'load_form_js' ) );
add_action( 'comment_form', array( 'Akismet', 'load_form_js' ) );
add_action( 'comment_form', array( 'Akismet', 'inject_ak_js' ) );
+ add_filter( 'script_loader_tag', array( 'Akismet', 'set_form_js_async' ), 10, 3 );
add_filter( 'comment_moderation_recipients', array( 'Akismet', 'disable_moderation_emails_if_unreachable' ), 1000, 2 );
add_filter( 'pre_comment_approved', array( 'Akismet', 'last_comment_status' ), 10, 2 );
@@ -533,24 +534,36 @@ class Akismet {
if ( get_comment_meta( $comment->comment_ID, 'akismet_rechecking' ) )
return;
- global $current_user;
- $reporter = '';
- if ( is_object( $current_user ) )
- $reporter = $current_user->user_login;
-
// Assumption alert:
// We want to submit comments to Akismet only when a moderator explicitly spams or approves it - not if the status
// is changed automatically by another plugin. Unfortunately WordPress doesn't provide an unambiguous way to
// determine why the transition_comment_status action was triggered. And there are several different ways by which
// to spam and unspam comments: bulk actions, ajax, links in moderation emails, the dashboard, and perhaps others.
// We'll assume that this is an explicit user action if certain POST/GET variables exist.
- if ( ( isset( $_POST['status'] ) && in_array( $_POST['status'], array( 'spam', 'unspam' ) ) ) ||
- ( isset( $_POST['spam'] ) && (int) $_POST['spam'] == 1 ) ||
- ( isset( $_POST['unspam'] ) && (int) $_POST['unspam'] == 1 ) ||
- ( isset( $_POST['comment_status'] ) && in_array( $_POST['comment_status'], array( 'spam', 'unspam' ) ) ) ||
- ( isset( $_GET['action'] ) && in_array( $_GET['action'], array( 'spam', 'unspam', 'spamcomment', 'unspamcomment', ) ) ) ||
- ( isset( $_POST['action'] ) && in_array( $_POST['action'], array( 'editedcomment' ) ) ) ||
- ( isset( $_GET['for'] ) && ( 'jetpack' == $_GET['for'] ) ) // Moderation via WP.com notifications/WP app/etc.
+ if (
+ // status=spam: Marking as spam via the REST API or...
+ // status=unspam: I'm not sure. Maybe this used to be used instead of status=approved? Or the UI for removing from spam but not approving has been since removed?...
+ // status=approved: Unspamming via the REST API (Calypso) or...
+ ( isset( $_POST['status'] ) && in_array( $_POST['status'], array( 'spam', 'unspam', 'approved', ) ) )
+ // spam=1: Clicking "Spam" underneath a comment in wp-admin and allowing the AJAX request to happen.
+ || ( isset( $_POST['spam'] ) && (int) $_POST['spam'] == 1 )
+ // unspam=1: Clicking "Not Spam" underneath a comment in wp-admin and allowing the AJAX request to happen. Or, clicking "Undo" after marking something as spam.
+ || ( isset( $_POST['unspam'] ) && (int) $_POST['unspam'] == 1 )
+ // comment_status=spam/unspam: It's unclear where this is happening.
+ || ( isset( $_POST['comment_status'] ) && in_array( $_POST['comment_status'], array( 'spam', 'unspam' ) ) )
+ // action=spam: Choosing "Mark as Spam" from the Bulk Actions dropdown in wp-admin (or the "Spam it" link in notification emails).
+ // action=unspam: Choosing "Not Spam" from the Bulk Actions dropdown in wp-admin.
+ // action=spamcomment: Following the "Spam" link below a comment in wp-admin (not allowing AJAX request to happen).
+ // action=unspamcomment: Following the "Not Spam" link below a comment in wp-admin (not allowing AJAX request to happen).
+ || ( isset( $_GET['action'] ) && in_array( $_GET['action'], array( 'spam', 'unspam', 'spamcomment', 'unspamcomment', ) ) )
+ // action=editedcomment: Editing a comment via wp-admin (and possibly changing its status).
+ || ( isset( $_POST['action'] ) && in_array( $_POST['action'], array( 'editedcomment' ) ) )
+ // for=jetpack: Moderation via the WordPress app, Calypso, anything powered by the Jetpack connection.
+ || ( isset( $_GET['for'] ) && ( 'jetpack' == $_GET['for'] ) && ( ! defined( 'IS_WPCOM' ) || ! IS_WPCOM ) )
+ // Certain WordPress.com API requests
+ || ( defined( 'REST_API_REQUEST' ) && REST_API_REQUEST )
+ // WordPress.org REST API requests
+ || ( defined( 'REST_REQUEST' ) && REST_REQUEST )
) {
if ( $new_status == 'spam' && ( $old_status == 'approved' || $old_status == 'unapproved' || !$old_status ) ) {
return self::submit_spam_comment( $comment->comment_ID );
@@ -1104,6 +1117,19 @@ class Akismet {
wp_enqueue_script( 'akismet-form' );
}
+ /**
+ * Mark form.js as async. Because nothing depends on it, it can run at any time
+ * after it's loaded, and the browser won't have to wait for it to load to continue
+ * parsing the rest of the page.
+ */
+ public static function set_form_js_async( $tag, $handle, $src ) {
+ if ( 'akismet-form' !== $handle ) {
+ return $tag;
+ }
+
+ return preg_replace( '/^<script /i', '<script async="async" ', $tag );
+ }
+
public static function inject_ak_js( $fields ) {
echo '<p style="display: none;">';
echo '<input type="hidden" id="ak_js" name="ak_js" value="' . mt_rand( 0, 250 ) . '"/>';
@@ -1184,7 +1210,21 @@ p {
* @static
*/
public static function plugin_deactivation( ) {
- return self::deactivate_key( self::get_api_key() );
+ self::deactivate_key( self::get_api_key() );
+
+ // Remove any scheduled cron jobs.
+ $akismet_cron_events = array(
+ 'akismet_schedule_cron_recheck',
+ 'akismet_scheduled_delete',
+ );
+
+ foreach ( $akismet_cron_events as $akismet_cron_event ) {
+ $timestamp = wp_next_scheduled( $akismet_cron_event );
+
+ if ( $timestamp ) {
+ wp_unschedule_event( $timestamp, $akismet_cron_event );
+ }
+ }
}
/**