nonce_array( 'adcmdr-do_delete_stats', 'stats' ); if ( check_admin_referer( $delete_stats_nonce['action'], $delete_stats_nonce['name'] ) && current_user_can( AdCommander::capability() ) ) { ?>

nonce_array( 'adcmdr-do_delete_stats', 'stats' ); if ( check_admin_referer( $delete_stats_nonce['action'], $delete_stats_nonce['name'] ) && current_user_can( AdCommander::capability() ) ) { ?>

( $success ) ? Util::ns( 'delete_stats_success' ) : Util::ns( 'delete_stats_fail' ), 'delete_type' => $type, $nonce['name'] => wp_create_nonce( $nonce['action'] ), 'tab' => 'adcmdr_delete_stats', ), $url ); wp_safe_redirect( sanitize_url( $url ) ); exit; } /** * Delete stats for a specific ad. * * @return bool|void */ public function do_delete_ad_stats() { $delete_stats_nonce = $this->nonce_array( 'adcmdr-do_delete_ad_stats', 'stats' ); $redirect_nonce = $this->nonce_array( 'adcmdr-do_delete_stats', 'stats' ); if ( ! isset( $_REQUEST['action'] ) || ! check_admin_referer( $delete_stats_nonce['action'], $delete_stats_nonce['name'] ) || ! current_user_can( AdCommander::capability() ) ) { wp_die(); } if ( sanitize_text_field( wp_unslash( $_REQUEST['action'] ) ) !== Util::ns( 'do_delete_ad_stats' ) ) { return false; } if ( ! isset( $_REQUEST['adcmdr_confirm_action'] ) || ( isset( $_REQUEST['adcmdr_confirm_action'] ) && ! Util::truthy( sanitize_text_field( wp_unslash( $_REQUEST['adcmdr_confirm_action'] ) ) ) ) || ! isset( $_REQUEST['adcmdr_ad_id'] ) || ( isset( $_REQUEST['adcmdr_ad_id'] ) && intval( $_REQUEST['adcmdr_ad_id'] ) <= 0 ) ) { $this->redirect( $redirect_nonce, 'delete_ad', false ); } $ad_id = intval( $_REQUEST['adcmdr_ad_id'] ); global $wpdb; $wpdb->query( $wpdb->prepare( 'DELETE FROM %i WHERE ad_id = %d', array( TrackingLocal::get_tracking_table( 'impressions' ), $ad_id ) ) ); $wpdb->query( $wpdb->prepare( 'DELETE FROM %i WHERE ad_id = %d', array( TrackingLocal::get_tracking_table( 'clicks' ), $ad_id ) ) ); $this->redirect( $redirect_nonce, 'delete_ad' ); } /** * Delete all stats. * * @return bool|void */ public function do_delete_all_stats() { $delete_stats_nonce = $this->nonce_array( 'adcmdr-do_delete_all_stats', 'stats' ); $redirect_nonce = $this->nonce_array( 'adcmdr-do_delete_stats', 'stats' ); if ( ! isset( $_REQUEST['action'] ) || ! check_admin_referer( $delete_stats_nonce['action'], $delete_stats_nonce['name'] ) || ! current_user_can( AdCommander::capability() ) ) { wp_die(); } if ( sanitize_text_field( wp_unslash( $_REQUEST['action'] ) ) !== Util::ns( 'do_delete_all_stats' ) ) { return false; } if ( ! isset( $_REQUEST['adcmdr_confirm_action'] ) || ( isset( $_REQUEST['adcmdr_confirm_action'] ) && ! Util::truthy( sanitize_text_field( wp_unslash( $_REQUEST['adcmdr_confirm_action'] ) ) ) ) ) { $this->redirect( $redirect_nonce, 'delete_all', false ); } global $wpdb; $wpdb->query( $wpdb->prepare( 'TRUNCATE TABLE %i', TrackingLocal::get_tracking_table( 'impressions' ) ) ); $wpdb->query( $wpdb->prepare( 'TRUNCATE TABLE %i', TrackingLocal::get_tracking_table( 'clicks' ) ) ); $this->redirect( $redirect_nonce, 'delete_all' ); } /** * Delete stats for ads that no longer exist. * * @return bool|void */ public function do_delete_rogue_stats() { $delete_stats_nonce = $this->nonce_array( 'adcmdr-do_delete_rogue_stats', 'stats' ); $redirect_nonce = $this->nonce_array( 'adcmdr-do_delete_stats', 'stats' ); if ( ! isset( $_REQUEST['action'] ) || ! check_admin_referer( $delete_stats_nonce['action'], $delete_stats_nonce['name'] ) || ! current_user_can( AdCommander::capability() ) ) { wp_die(); } if ( sanitize_text_field( wp_unslash( $_REQUEST['action'] ) ) !== Util::ns( 'do_delete_rogue_stats' ) ) { return false; } if ( ! isset( $_REQUEST['adcmdr_confirm_action'] ) || ( isset( $_REQUEST['adcmdr_confirm_action'] ) && ! Util::truthy( sanitize_text_field( wp_unslash( $_REQUEST['adcmdr_confirm_action'] ) ) ) ) ) { $this->redirect( $redirect_nonce, 'delete_rogue', false ); } $rogue = self::find_rogue_entries(); if ( $rogue && ! empty( $rogue ) ) { global $wpdb; if ( isset( $rogue['impressions'] ) && ! empty( $rogue['impressions'] ) ) { $ad_ids = array_map( 'absint', array_unique( wp_list_pluck( $rogue['impressions'], 'ad_id' ) ) ); $ad_ids_placeholder = implode( ', ', array_fill( 0, count( $ad_ids ), '%d' ) ); $args = array_merge( array( TrackingLocal::get_tracking_table( 'impressions' ) ), $ad_ids ); $wpdb->query( $wpdb->prepare( "DELETE FROM %i WHERE ad_id IN ($ad_ids_placeholder)", $args ) ); } if ( isset( $rogue['clicks'] ) && ! empty( $rogue['clicks'] ) ) { $ad_ids = array_map( 'absint', array_unique( wp_list_pluck( $rogue['clicks'], 'ad_id' ) ) ); $ad_ids_placeholder = implode( ', ', array_fill( 0, count( $ad_ids ), '%d' ) ); $args = array_merge( array( TrackingLocal::get_tracking_table( 'clicks' ) ), $ad_ids ); $wpdb->query( $wpdb->prepare( "DELETE FROM %i WHERE ad_id IN ($ad_ids_placeholder)", $args ) ); } } $this->redirect( $redirect_nonce, 'delete_rogue' ); } /** * Find stat entries that are not for existing ads. * * @return array */ public static function find_rogue_entries() { global $wpdb; $ads = Query::ads( 'ID', 'asc', Util::any_post_status() ); if ( ! empty( $ads ) ) { $ad_ids = array_map( 'absint', wp_list_pluck( $ads, 'ID' ) ); $ad_ids_placeholder = implode( ', ', array_fill( 0, count( $ad_ids ), '%d' ) ); $impressions = $wpdb->get_results( $wpdb->prepare( "SELECT tbl.timestamp, tbl.ad_id FROM %i as tbl WHERE ad_id NOT IN ($ad_ids_placeholder)", array_merge( array( TrackingLocal::get_tracking_table( 'impressions' ) ), $ad_ids ) ) ); $clicks = $wpdb->get_results( $wpdb->prepare( "SELECT tbl.timestamp, tbl.ad_id FROM %i as tbl WHERE ad_id NOT IN ($ad_ids_placeholder)", array_merge( array( TrackingLocal::get_tracking_table( 'clicks' ) ), $ad_ids ) ) ); } else { /** * Everything is rogue. */ $impressions = $wpdb->get_results( $wpdb->prepare( 'SELECT tbl.timestamp, tbl.ad_id FROM %i as tbl', TrackingLocal::get_tracking_table( 'impressions' ) ) ); $clicks = $wpdb->get_results( $wpdb->prepare( 'SELECT tbl.timestamp, tbl.ad_id FROM %i as tbl', TrackingLocal::get_tracking_table( 'clicks' ) ) ); } return array( 'impressions' => ( ! $impressions || is_wp_error( $impressions ) ) ? array() : $impressions, 'clicks' => ( ! $clicks || is_wp_error( $clicks ) ) ? array() : $clicks, ); } }