Ticket #3395: 3395.4.diff
File 3395.4.diff, 6.3 KB (added by , 4 years ago) |
---|
-
src/includes/extend/akismet.php
966 966 } 967 967 968 968 /** 969 * Deletes old spam topics & replies from the queue after 15 days 970 * (determined by `_bbp_akismet_delete_spam_interval` filter). 969 * Get the number of rows to delete in a single clean-up query. 971 970 * 972 * @since 2.6. 7 bbPress (r7203)971 * @since 2.6.9 bbPress (r7225) 973 972 * 974 * @global wpdb $wpdb 973 * @param string $filter The name of the filter to run 974 * @return int 975 975 */ 976 public function delete_old_spam() { 977 global $wpdb; 976 public function get_delete_limit( $filter = '' ) { 978 977 978 // Default filter 979 if ( empty( $filter ) ) { 980 $filter = '_bbp_akismet_delete_spam_limit'; 981 } 982 979 983 /** 980 * Determines how many posts will be deleted in each batch.984 * Determines how many rows will be deleted in each batch. 981 985 * 982 986 * @param int The default as defined by AKISMET_DELETE_LIMIT (also used 983 * in Akismet WordPress plugin). 987 * in Akismet WordPress plugin). Default 1000. 984 988 */ 985 $delete_limit = (int) apply_filters( '_bbp_akismet_delete_spam_limit',989 $delete_limit = (int) apply_filters( $filter, 986 990 defined( 'AKISMET_DELETE_LIMIT' ) 987 991 ? AKISMET_DELETE_LIMIT 988 : 1000 0992 : 1000 989 993 ); 990 994 991 // Validate the deletion limit 992 $delete_limit = max( 1, intval( $delete_limit ) ); 995 // Validate and return the deletion limit 996 return max( 1, $delete_limit ); 997 } 993 998 999 /** 1000 * Get the interval (in days) for spam to remain in the queue. 1001 * 1002 * @since 2.6.9 bbPress (r7225) 1003 * 1004 * @param string $filter The name of the filter to run 1005 * @return int 1006 */ 1007 public function get_delete_interval( $filter = '' ) { 1008 1009 // Default filter 1010 if ( empty( $filter ) ) { 1011 $filter = '_bbp_akismet_delete_spam_interval'; 1012 } 1013 994 1014 /** 995 1015 * Determines how many days a piece of spam will be left in the Spam 996 1016 * queue before being deleted. 997 1017 * 998 * @param int The default number of days.1018 * @param int The number of days. Default 15. 999 1019 */ 1000 $delete_interval = (int) apply_filters( '_bbp_akismet_delete_spam_interval', 15 );1020 $delete_interval = (int) apply_filters( $filter, 15 ); 1001 1021 1002 // Validate the deletion interval 1003 $delete_interval = max( 1, intval( $delete_interval ) ); 1022 // Validate and return the deletion interval 1023 return max( 1, $delete_interval ); 1024 } 1004 1025 1026 /** 1027 * Deletes old spam topics & replies from the queue after 15 days 1028 * (determined by `_bbp_akismet_delete_spam_interval` filter). 1029 * 1030 * @since 2.6.7 bbPress (r7203) 1031 * 1032 * @global wpdb $wpdb 1033 */ 1034 public function delete_old_spam() { 1035 global $wpdb; 1036 1037 // Get the deletion limit & interval 1038 $delete_limit = $this->get_delete_limit( '_bbp_akismet_delete_spam_limit' ); 1039 $delete_interval = $this->get_delete_interval( '_bbp_akismet_delete_spam_interval' ); 1040 1005 1041 // Setup the query 1006 1042 $sql = "SELECT id FROM {$wpdb->posts} WHERE post_type IN ('topic', 'reply') AND post_status = 'spam' AND DATE_SUB(NOW(), INTERVAL %d DAY) > post_date_gmt LIMIT %d"; 1007 1043 … … 1034 1070 1035 1071 // Prepared as strings since id is an unsigned BIGINT, and using % 1036 1072 // will constrain the value to the maximum signed BIGINT. 1037 $format_string = implode( ", ", array_fill( 0, count( $spam_ids ), '%s' ) );1073 $format_string = implode( ', ', array_fill( 0, count( $spam_ids ), '%s' ) ); 1038 1074 1039 1075 // Run the delete queries 1040 $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->posts} WHERE post_id IN ( " . $format_string . ")", $spam_ids ) );1041 $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->postmeta} WHERE post_id IN ( " . $format_string . ")", $spam_ids ) );1076 $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->posts} WHERE ID IN ( {$format_string} )", $spam_ids ) ); 1077 $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->postmeta} WHERE post_id IN ( {$format_string} )", $spam_ids ) ); 1042 1078 1043 1079 // Clean the post cache for these topics & replies 1044 1080 clean_post_cache( $spam_ids ); … … 1078 1114 public function delete_old_spam_meta() { 1079 1115 global $wpdb; 1080 1116 1081 /** 1082 * Determines how many days a piece of spam will be left in the Spam 1083 * queue before being deleted. 1084 * 1085 * @param int The default number of days. 1086 */ 1087 $interval = (int) apply_filters( '_bbp_akismet_delete_spam_meta_interval', 15 ); 1117 // Get the deletion limit & interval 1118 $delete_limit = $this->get_delete_limit( '_bbp_akismet_delete_spam_meta_limit' ); 1119 $delete_interval = $this->get_delete_interval( '_bbp_akismet_delete_spam_meta_interval' ); 1088 1120 1089 // Validate the deletion interval1090 $interval = max( 1, intval( $interval ) );1091 1092 1121 // Setup the query 1093 $sql = "SELECT m.post_id FROM {$wpdb->postmeta} as m INNER JOIN {$wpdb->posts} as p ON m.post_id = p. id WHERE m.meta_key = '_bbp_akismet_as_submitted' AND DATE_SUB(NOW(), INTERVAL %d DAY) > p.post_date_gmt LIMIT 10000";1122 $sql = "SELECT m.post_id FROM {$wpdb->postmeta} as m INNER JOIN {$wpdb->posts} as p ON m.post_id = p.ID WHERE m.meta_key = '_bbp_akismet_as_submitted' AND DATE_SUB(NOW(), INTERVAL %d DAY) > p.post_date_gmt LIMIT %d"; 1094 1123 1095 1124 // Query loop of topic & reply IDs 1096 while ( $spam_ids = $wpdb->get_col( $wpdb->prepare( $sql, $ interval) ) ) {1125 while ( $spam_ids = $wpdb->get_col( $wpdb->prepare( $sql, $delete_interval, $delete_limit ) ) ) { 1097 1126 1098 1127 // Exit loop if no spam IDs 1099 1128 if ( empty( $spam_ids ) ) { … … 1143 1172 public function delete_orphaned_spam_meta() { 1144 1173 global $wpdb; 1145 1174 1175 // Get the deletion limit 1176 $delete_limit = $this->get_delete_limit( '_bbp_akismet_delete_spam_orphaned_limit' ); 1177 1178 // Default last meta ID 1146 1179 $last_meta_id = 0; 1147 1180 1148 1181 // Start time (float) … … 1154 1187 $max_exec_time = (float) max( ini_get( 'max_execution_time' ) - 5, 3 ); 1155 1188 1156 1189 // Setup the query 1157 $sql = "SELECT m.meta_id, m.post_id, m.meta_key FROM {$wpdb->postmeta} as m LEFT JOIN {$wpdb->posts} as p ON m.post_id = p. id WHERE p.id IS NULL AND m.meta_id > %d ORDER BY m.meta_id LIMIT 1000";1190 $sql = "SELECT m.meta_id, m.post_id, m.meta_key FROM {$wpdb->postmeta} as m LEFT JOIN {$wpdb->posts} as p ON m.post_id = p.ID WHERE p.ID IS NULL AND m.meta_id > %d ORDER BY m.meta_id LIMIT %d"; 1158 1191 1159 1192 // Query loop of topic & reply IDs 1160 while ( $spam_meta_results = $wpdb->get_results( $wpdb->prepare( $sql, $last_meta_id ) ) ) {1193 while ( $spam_meta_results = $wpdb->get_results( $wpdb->prepare( $sql, $last_meta_id, $delete_limit ) ) ) { 1161 1194 1162 1195 // Exit loop if no spam IDs 1163 1196 if ( empty( $spam_meta_results ) ) {