summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYury German <blueknight@gentoo.org>2022-06-15 12:23:54 -0400
committerYury German <blueknight@gentoo.org>2022-06-15 12:23:54 -0400
commitd70aabe9576a2aa12d55e8649f04c3a853de902a (patch)
tree31baa2d7c7bf8acddc5d5e307ad6b6dda6fc23c2 /plugins/akismet/class.akismet.php
parentOpenid-3.6.1 and jetpack-11.0 upgrade (diff)
downloadblogs-gentoo-master.tar.gz
blogs-gentoo-master.tar.bz2
blogs-gentoo-master.zip
update akismet 4.2.4HEADmaster
Signed-off-by: Yury German <blueknight@gentoo.org>
Diffstat (limited to 'plugins/akismet/class.akismet.php')
-rw-r--r--plugins/akismet/class.akismet.php80
1 files changed, 66 insertions, 14 deletions
diff --git a/plugins/akismet/class.akismet.php b/plugins/akismet/class.akismet.php
index 1681d0e1..3ca53391 100644
--- a/plugins/akismet/class.akismet.php
+++ b/plugins/akismet/class.akismet.php
@@ -64,6 +64,14 @@ class Akismet {
add_filter( 'wpcf7_form_elements', array( 'Akismet', 'append_custom_form_fields' ) );
add_filter( 'wpcf7_akismet_parameters', array( 'Akismet', 'prepare_custom_form_values' ) );
+ // Formidable Forms
+ add_filter( 'frm_filter_final_form', array( 'Akismet', 'inject_custom_form_fields' ) );
+ add_filter( 'frm_akismet_values', array( 'Akismet', 'prepare_custom_form_values' ) );
+
+ // Fluent Forms
+ add_filter( 'fluentform_form_element_start', array( 'Akismet', 'output_custom_form_fields' ) );
+ add_filter( 'fluentform_akismet_fields', array( 'Akismet', 'prepare_custom_form_values' ), 10, 2 );
+
add_action( 'update_option_wordpress_api_key', array( 'Akismet', 'updated_option' ), 10, 2 );
add_action( 'add_option_wordpress_api_key', array( 'Akismet', 'added_option' ), 10, 2 );
@@ -410,8 +418,12 @@ class Akismet {
$wpdb->queries = array();
+ $comments = array();
+
foreach ( $comment_ids as $comment_id ) {
- do_action( 'delete_comment', $comment_id );
+ $comments[ $comment_id ] = get_comment( $comment_id );
+
+ do_action( 'delete_comment', $comment_id, $comments[ $comment_id ] );
do_action( 'akismet_batch_delete_count', __FUNCTION__ );
}
@@ -421,12 +433,13 @@ class Akismet {
$wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->comments} WHERE comment_id IN ( " . $format_string . " )", $comment_ids ) );
$wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->commentmeta} WHERE comment_id IN ( " . $format_string . " )", $comment_ids ) );
- clean_comment_cache( $comment_ids );
- do_action( 'akismet_delete_comment_batch', count( $comment_ids ) );
-
foreach ( $comment_ids as $comment_id ) {
- do_action( 'deleted_comment', $comment_id );
+ do_action( 'deleted_comment', $comment_id, $comments[ $comment_id ] );
+ unset( $comments[ $comment_id ] );
}
+
+ clean_comment_cache( $comment_ids );
+ do_action( 'akismet_delete_comment_batch', count( $comment_ids ) );
}
if ( apply_filters( 'akismet_optimize_table', ( mt_rand(1, 5000) == 11), $wpdb->comments ) ) // lucky number
@@ -504,11 +517,38 @@ class Akismet {
public static function get_user_comments_approved( $user_id, $comment_author_email, $comment_author, $comment_author_url ) {
global $wpdb;
- if ( !empty( $user_id ) )
- return (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM {$wpdb->comments} WHERE user_id = %d AND comment_approved = 1", $user_id ) );
+ /**
+ * Which comment types should be ignored when counting a user's approved comments?
+ *
+ * Some plugins add entries to the comments table that are not actual
+ * comments that could have been checked by Akismet. Allow these comments
+ * to be excluded from the "approved comment count" query in order to
+ * avoid artificially inflating the approved comment count.
+ *
+ * @param array $comment_types An array of comment types that won't be considered
+ * when counting a user's approved comments.
+ *
+ * @since 4.2.2
+ */
+ $excluded_comment_types = apply_filters( 'akismet_excluded_comment_types', array() );
+
+ $comment_type_where = '';
- if ( !empty( $comment_author_email ) )
- return (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM {$wpdb->comments} WHERE comment_author_email = %s AND comment_author = %s AND comment_author_url = %s AND comment_approved = 1", $comment_author_email, $comment_author, $comment_author_url ) );
+ if ( is_array( $excluded_comment_types ) && ! empty( $excluded_comment_types ) ) {
+ $excluded_comment_types = array_unique( $excluded_comment_types );
+
+ foreach ( $excluded_comment_types as $excluded_comment_type ) {
+ $comment_type_where .= $wpdb->prepare( ' AND comment_type <> %s ', $excluded_comment_type );
+ }
+ }
+
+ if ( ! empty( $user_id ) ) {
+ return (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM {$wpdb->comments} WHERE user_id = %d AND comment_approved = 1" . $comment_type_where, $user_id ) );
+ }
+
+ if ( ! empty( $comment_author_email ) ) {
+ return (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM {$wpdb->comments} WHERE comment_author_email = %s AND comment_author = %s AND comment_author_url = %s AND comment_approved = 1" . $comment_type_where, $comment_author_email, $comment_author, $comment_author_url ) );
+ }
return 0;
}
@@ -1327,8 +1367,14 @@ class Akismet {
$fields .= '<label>&#916;<textarea name="' . $prefix . 'hp_textarea" cols="45" rows="8" maxlength="100"></textarea></label>';
if ( ! function_exists( 'amp_is_request' ) || ! amp_is_request() ) {
- $fields .= '<input type="hidden" id="ak_js" name="' . $prefix . 'js" value="' . mt_rand( 0, 250 ) . '"/>';
- $fields .= '<script>document.getElementById( "ak_js" ).setAttribute( "value", ( new Date() ).getTime() );</script>';
+ // Keep track of how many ak_js fields are in this page so that we don't re-use
+ // the same ID.
+ static $field_count = 0;
+
+ $field_count++;
+
+ $fields .= '<input type="hidden" id="ak_js_' . $field_count . '" name="' . $prefix . 'js" value="' . mt_rand( 0, 250 ) . '"/>';
+ $fields .= '<script>document.getElementById( "ak_js_' . $field_count . '" ).setAttribute( "value", ( new Date() ).getTime() );</script>';
}
$fields .= '</p>';
@@ -1357,9 +1403,16 @@ class Akismet {
* Ensure that any Akismet-added form fields are included in the comment-check call.
*
* @param array $form
+ * @param array $data Some plugins will supply the POST data via the filter, since they don't
+ * read it directly from $_POST.
* @return array $form
*/
- public static function prepare_custom_form_values( $form ) {
+ public static function prepare_custom_form_values( $form, $data = null ) {
+ if ( is_null( $data ) ) {
+ // phpcs:ignore WordPress.Security.NonceVerification.Missing
+ $data = $_POST;
+ }
+
$prefix = 'ak_';
// Contact Form 7 uses _wpcf7 as a prefix to know which fields to exclude from comment_content.
@@ -1367,8 +1420,7 @@ class Akismet {
$prefix = '_wpcf7_ak_';
}
- // phpcs:ignore WordPress.Security.NonceVerification.Missing
- foreach ( $_POST as $key => $val ) {
+ foreach ( $data as $key => $val ) {
if ( 0 === strpos( $key, $prefix ) ) {
$form[ 'POST_ak_' . substr( $key, strlen( $prefix ) ) ] = $val;
}