table_name = Hustle_Db::entries_table(); $this->table_meta_name = Hustle_Db::entries_meta_table(); if ( is_numeric( $entry_id ) && $entry_id > 0 ) { $this->get( $entry_id ); // get connected addons // if ( ! empty( $this->module_id ) ) { // self::get_connected_addons( $this->module_id ); // } } } /** * Load an entry by its id. * After load, set entry to cache. * * @since 4.0 * * @param int $entry_id - the entry id * @return bool|mixed */ public function get( $entry_id ) { global $wpdb; $cache_key = get_class( $this ); $entry_object_cache = wp_cache_get( $entry_id, $cache_key ); if ( $entry_object_cache ) { $this->entry_id = $entry_object_cache->entry_id; $this->entry_type = $entry_object_cache->entry_type; $this->module_id = $entry_object_cache->module_id; $this->date_created_sql = $entry_object_cache->date_created_sql; $this->date_created = $entry_object_cache->date_created; $this->time_created = $entry_object_cache->time_created; $this->meta_data = $entry_object_cache->meta_data; return $entry_object_cache; } else { $sql = "SELECT `entry_type`, `module_id`, `date_created` FROM {$this->table_name} WHERE `entry_id` = %d"; $entry = $wpdb->get_row( $wpdb->prepare( $sql, $entry_id ) ); // WPCS: unprepared SQL ok. false positive if ( $entry ) { $this->entry_id = $entry_id; $this->entry_type = $entry->entry_type; $this->module_id = $entry->module_id; $this->date_created_sql = $entry->date_created; $this->date_created = date_i18n( 'j M Y', strtotime( $entry->date_created ) ); $this->time_created = date_i18n( 'j M Y @ H:i A', strtotime( $entry->date_created ) ); $this->load_meta(); // TODO: check if the cache behaves properly when the module's form fields are updated. wp_cache_set( $entry_id, $this, $cache_key ); } } } /** * Set entry fields. * * @since 4.0 * * @param array $meta_array { * Array of data to be saved * * @type key - string the meta key * @type value - string the meta value * } * @param string $date_created Created date, default null will be completed. * * @return bool */ public function set_fields( $meta_array, $date_created = null ) { global $wpdb; if ( $meta_array && ! is_array( $meta_array ) && ! empty( $meta_array ) ) { return false; } // Set the meta_data values even though entry_id is null for object reference for its usage in the future. // entry_id has null value is the outcome of failed to save or local list is disabled. if ( ! $this->entry_id ) { foreach ( $meta_array as $meta ) { if ( isset( $meta['name'] ) && isset( $meta['value'] ) ) { $key = $meta['name']; $value = $meta['value']; $key = wp_unslash( $key ); $value = wp_unslash( $value ); $this->meta_data[ $key ] = array( 'id' => $key, 'value' => $value, ); } } return false; } if ( empty( $date_created ) ) { $date_created = Hustle_Time_Helper::get_current_date(); } // clear cache first $cache_key = get_class( $this ); wp_cache_delete( $this->entry_id, $cache_key ); foreach ( $meta_array as $meta ) { if ( isset( $meta['name'] ) && isset( $meta['value'] ) ) { $key = $meta['name']; $value = $meta['value']; $key = wp_unslash( $key ); $value = wp_unslash( $value ); $value = maybe_serialize( $value ); $meta_id = $wpdb->insert( $this->table_meta_name, array( 'entry_id' => $this->entry_id, 'meta_key' => $key, 'meta_value' => $value, 'date_created' => $date_created, ) ); // Set meta data for later usage if ( $meta_id ) { $this->meta_data[ $key ] = array( 'id' => $meta_id, 'value' => is_array( $value ) ? array_map( 'maybe_unserialize', $value ) : maybe_unserialize( $value ), ); } } } return true; } /** * Load all meta data for entry * * @since 4.0 * * @param object|bool $db - the WP_Db object */ public function load_meta( $db = false ) { if ( ! $db ) { global $wpdb; $db = $wpdb; } $this->meta_data = array(); $sql = "SELECT `meta_id`, `meta_key`, `meta_value` FROM {$this->table_meta_name} WHERE `entry_id` = %d"; $results = $db->get_results( $db->prepare( $sql, $this->entry_id ) ); foreach ( $results as $result ) { $this->meta_data[ $result->meta_key ] = array( 'id' => $result->meta_id, 'value' => is_array( $result->meta_value ) ? array_map( 'maybe_unserialize', $result->meta_value ) : maybe_unserialize( $result->meta_value ), ); } } /** * Get Meta * * @since 4.0 * * @param string $meta_key - the meta key * @param bool|object $default_value - the default value * * @return bool|string */ public function get_meta( $meta_key, $default_value = false ) { if ( ! empty( $this->meta_data ) && isset( $this->meta_data[ $meta_key ] ) ) { return $this->meta_data[ $meta_key ]['value']; } return $default_value; } /** * Update Meta * * @since 4.0.2 * * @param $meta_id * @param string $meta_key - the meta key * @param bool|object $default_value - the default value * @param string $date_updated * @param string $date_created * * @return bool|string */ public function update_meta( $meta_id, $meta_key, $default_value = false, $date_updated = '', $date_created = '' ) { global $wpdb; $updated_meta = array( 'entry_id' => $this->entry_id, 'meta_key' => $meta_key, 'meta_value' => $default_value, ); if ( ! empty( $date_updated ) ) { $updated_meta['date_updated'] = $date_updated; } if ( ! empty( $date_created ) ) { $updated_meta['date_created'] = $date_created; } $wpdb->update( $this->table_meta_name, $updated_meta, array( 'meta_id' => $meta_id, ) ); $cache_key = get_class( $this ); wp_cache_delete( $this->entry_id, $cache_key ); $this->get( $this->entry_id ); } /** * Save entry * * @since 4.0 * * @param string $date_created Created date, default null will be completed. * * @return bool */ public function save( $date_created = null ) { global $wpdb; if ( empty( $date_created ) ) { $date_created = Hustle_Time_Helper::get_current_date(); } $result = $wpdb->insert( $this->table_name, array( 'entry_type' => $this->entry_type, 'module_id' => $this->module_id, 'date_created' => $date_created, ) ); if ( ! $result ) { return false; } wp_cache_delete( $this->module_id, 'hustle_total_entries' ); wp_cache_delete( 'all_module_types', 'hustle_total_entries' ); wp_cache_delete( $this->entry_type . '_module_type', 'hustle_total_entries' ); $this->entry_id = (int) $wpdb->insert_id; return true; } /** * Custom Query entries * * @since 4.0 * * @param array $args * @param int $count pass by reference for get count * * @return array Hustle_Entry_Model[] */ public static function query_entries( $args, &$count ) { global $wpdb; /** * $args * [ * module_id => X, * date_created=> array(), * search = '', * min_id => * max_id => * orderby => 'x', * order => 'DESC', * per_page => '10' * offset => 0 * ] */ if ( ! isset( $args['per_page'] ) ) { $args['per_page'] = 10; } if ( ! isset( $args['offset'] ) ) { $args['offset'] = 0; } if ( ! isset( $args['order'] ) ) { $args['order'] = 'DESC'; } $entries_table_name = Hustle_Db::entries_table(); $entries_meta_table_name = Hustle_Db::entries_meta_table(); $entries = array(); // Building where $where = 'WHERE 1=1'; // exclude Addon meta $where .= $wpdb->prepare( ' AND metas.meta_key NOT LIKE %s', $wpdb->esc_like( 'hustle_provider_' ) . '%' ); if ( isset( $args['module_id'] ) ) { $where .= $wpdb->prepare( ' AND entries.module_id = %d', $args['module_id'] ); } if ( isset( $args['date_created'] ) ) { $date_created = $args['date_created']; if ( is_array( $date_created ) && isset( $date_created[0] ) && isset( $date_created[1] ) ) { $date_created[1] = $date_created[1] . ' 23:59:00'; $where .= $wpdb->prepare( ' AND ( entries.date_created >= %s AND entries.date_created <= %s )', $date_created[0], $date_created[1] ); } } if ( isset( $args['search_email'] ) ) { $where .= $wpdb->prepare( ' AND metas.meta_value LIKE %s', '%' . $wpdb->esc_like( $args['search_email'] ) . '%' ); } // group $group_by = 'GROUP BY entries.entry_id'; $group_by = apply_filters( 'hustle_query_entries_group_by', $group_by, $args ); // order by $order_by = 'ORDER BY entries.entry_id'; if ( isset( $args['order_by'] ) ) { $order_by = 'ORDER BY ' . $args['order_by']; // unesacaped } $order_by = apply_filters( 'hustle_query_entries_order_by', $order_by, $args ); // order (DESC/ASC) $order = $args['order']; $order = apply_filters( 'hustle_query_entries_order', $order, $args ); // limit $limit = $wpdb->prepare( 'LIMIT %d, %d', $args['offset'], $args['per_page'] ); $limit = apply_filters( 'hustle_query_entries_limit', $limit, $args ); // sql count $sql_count = "SELECT count(DISTINCT entries.entry_id) as total_entries FROM {$entries_table_name} AS entries INNER JOIN {$entries_meta_table_name} AS metas ON (entries.entry_id = metas.entry_id) {$where} "; $sql_count = apply_filters( 'hustle_query_entries_sql_count', $sql_count, $args ); $count = intval( $wpdb->get_var( $sql_count ) ); // WPCS: unprepared SQL ok. false positive if ( $count > 0 ) { // sql $sql = "SELECT entries.entry_id AS entry_id FROM {$entries_table_name} AS entries INNER JOIN {$entries_meta_table_name} AS metas ON (entries.entry_id = metas.entry_id) {$where} {$group_by} {$order_by} {$order} {$limit} "; $sql = apply_filters( 'hustle_query_entries_sql', $sql, $args ); $results = $wpdb->get_results( $sql ); // WPCS: unprepared SQL ok. false positive foreach ( $results as $result ) { $entries[] = new Hustle_Entry_Model( $result->entry_id ); } } return $entries; } /** * Count entries by module * * @since 4.0 * * @param int $module_id * @return int - total entries */ public static function count_entries( $module_id, $db = false ) { if ( ! $db ) { global $wpdb; $db = $wpdb; } $cache_key = 'hustle_total_entries'; $entries_cache = wp_cache_get( $module_id, $cache_key ); if ( $entries_cache ) { return $entries_cache; } else { $table_name = Hustle_Db::entries_table(); $sql = "SELECT count(`entry_id`) FROM {$table_name} WHERE `module_id` = %d"; $entries = $db->get_var( $db->prepare( $sql, $module_id ) ); if ( $entries ) { wp_cache_set( $module_id, $entries, $cache_key ); return $entries; } } return 0; } /** * Get global count entries * * @since 4.0 * * @return int - total entries */ public static function global_count_entries() { global $wpdb; $cache_group = 'hustle_total_entries'; $cache_key = 'global_count'; $entries_cache = wp_cache_get( $cache_key, $cache_group ); if ( $entries_cache ) { $global_count = $entries_cache; } else { $table_name = Hustle_Db::entries_table(); $global_count = (int) $wpdb->get_var( "SELECT count(`entry_id`) FROM {$table_name}" ); // WPCS: unprepared SQL ok. false positive wp_cache_set( $cache_key, $global_count, $cache_group ); } return $global_count; } /** * Ignored fields * Fields not saved nor shown in submissions or export. * * @since 4.0 * * @return array */ public static function ignored_fields() { return apply_filters( 'hustle_entry_ignored_fields', array( 'recaptcha', 'submit' ) ); } /** * Get all entries from a module. * * @since 4.0.1 * * @param int $module_id * @return Hustle_Entry_Model[] */ public static function get_entries( $module_id ) { global $wpdb; $entries = array(); $table_name = Hustle_Db::entries_table(); $sql = "SELECT `entry_id` FROM {$table_name} WHERE `module_id` = %d ORDER BY `entry_id` DESC"; $results = $wpdb->get_results( $wpdb->prepare( $sql, $module_id ) ); // WPCS: unprepared SQL ok. false positive if ( ! empty( $results ) ) { foreach ( $results as $result ) { $entries[] = new Hustle_Entry_Model( $result->entry_id ); } } return $entries; } /** * Delete entries by a string of comma separated entres ids * * @since 4.0 * * @param $module_id * @param array $entries * @param bool|wpdb $db * * @return bool */ public static function delete_by_entries( $module_id, $entries, $db = false ) { // get connected addons // self::get_connected_addons( $module_id ); if ( ! $db ) { global $wpdb; $db = $wpdb; } if ( ! $entries && ! empty( $entries ) ) { return false; } $table_name = Hustle_Db::entries_table(); $table_meta_name = Hustle_Db::entries_meta_table(); if ( ! empty( $entries ) && is_array( $entries ) ) { foreach ( $entries as $entry_id ) { $module_id = (int) $module_id; $entry_id = (int) $entry_id; $entry_model = new Hustle_Entry_Model( $entry_id ); // self::attach_addons_on_before_delete_entry( $module_id, $entry_model ); } } $prepared_placeholders = implode( ', ', array_fill( 0, count( $entries ), '%s' ) ); /** * Fires just before an entry getting deleted * * @since 4.0 */ do_action_ref_array( 'hustle_before_delete_entries', array( $module_id, $entries ) ); $sql = $db->prepare( "DELETE FROM {$table_meta_name} WHERE `entry_id` IN ($prepared_placeholders)", $entries ); $db->query( $sql ); $sql = $db->prepare( "DELETE FROM {$table_name} WHERE `entry_id` IN ($prepared_placeholders)", $entries ); $db->query( $sql ); wp_cache_delete( $module_id, 'hustle_total_entries' ); wp_cache_delete( 'all_module_types', 'hustle_total_entries' ); $module_type = Hustle_Model::get_module_type_by_module_id( $module_id ); if ( ! is_wp_error( $module_type ) ) { wp_cache_delete( $module_type . '_module_type', 'hustle_total_entries' ); } } /** * Delete by entry. * * @since 4.0 * * @param int $module_id * @param int $entry_id * @param bool|object - the WP_Object optional param */ public static function delete_by_entry( $module_id, $entry_id, $db = false ) { if ( ! $db ) { global $wpdb; $db = $wpdb; } $table_name = Hustle_Db::entries_table(); $table_meta_name = Hustle_Db::entries_meta_table(); $cache_key = __CLASS__; $module_id = (int) $module_id; $entry_id = (int) $entry_id; // do_action_ref_array( 'hustle_before_delete_entry', array( $module_id, $entry_id ) ); $entry_model = new Hustle_Entry_Model( $entry_id ); // self::attach_addons_on_before_delete_entry( $module_id, $entry_model ); $sql = "DELETE FROM {$table_meta_name} WHERE `entry_id` = %d"; $db->query( $db->prepare( $sql, $entry_id ) ); $sql = "DELETE FROM {$table_name} WHERE `entry_id` = %d"; $db->query( $db->prepare( $sql, $entry_id ) ); wp_cache_delete( $entry_id, $cache_key ); wp_cache_delete( $module_id, 'hustle_total_entries' ); wp_cache_delete( 'all_module_types', 'hustle_total_entries' ); wp_cache_delete( $entry_model->entry_type . '_module_type', 'hustle_total_entries' ); } public static function delete_entries( $module_id ) { global $wpdb; $entires_table = Hustle_Db::entries_table(); $entires_meta_table = Hustle_Db::entries_meta_table(); $entires = $wpdb->get_col( $wpdb->prepare( "SELECT `entry_id` FROM {$entires_table} WHERE `module_id` = %d", //phpcs:ignore $module_id ) ); if ( $entires ) { // delete entries meta data $wpdb->query( "DELETE FROM {$entires_meta_table} WHERE `entry_id` IN ('" . implode( "','", $entires ) . "')" //phpcs:ignore ); // delete entries data $wpdb->delete( $entires_table, array( 'module_id' => $module_id, ), array( '%d', ) ); wp_cache_delete( $module_id, 'hustle_total_entries' ); wp_cache_delete( 'all_module_types', 'hustle_total_entries' ); $available_entry_types = self::available_entry_types(); foreach ( $available_entry_types as $type ) { wp_cache_delete( $type . '_module_type', 'hustle_total_entries' ); } $cache_key = __CLASS__; foreach ( $entires as $entry_id ) { wp_cache_delete( $entry_id, $cache_key ); } } } /** * Convert meta value to string. * Useful for displaying metadata without PHP warnings on conversion. * * @since 4.0 * * @param $field_type * @param $meta_value * @param bool $allow_html * @param int $truncate truncate returned string (usefull if display container is limited) * * @return string */ public static function meta_value_to_string( $field_type, $meta_value, $allow_html = false, $truncate = PHP_INT_MAX ) { switch ( $field_type ) { case 'email': if ( ! empty( $meta_value ) ) { $string_value = $meta_value; // truncate if ( $allow_html ) { // make link $email = $string_value; // truncate if ( strlen( $email ) > $truncate ) { $email = substr( $email, 0, $truncate ) . '...'; } $string_value = '' . $email . ''; } else { // truncate url if ( strlen( $string_value ) > $truncate ) { $string_value = substr( $string_value, 0, $truncate ) . '...'; } } } else { $string_value = ''; } break; case 'url': if ( ! empty( $meta_value ) ) { $string_value = $meta_value; // truncate if ( $allow_html ) { // make link $website = $string_value; // truncate if ( strlen( $website ) > $truncate ) { $website = substr( $website, 0, $truncate ) . '...'; } $string_value = '' . $website . ''; } else { // truncate url if ( strlen( $string_value ) > $truncate ) { $string_value = substr( $string_value, 0, $truncate ) . '...'; } } } else { $string_value = ''; } break; default: // base flattener // implode on array if ( is_array( $meta_value ) ) { $string_value = implode( ', ', $meta_value ); } else { // or juggling to string $string_value = (string) $meta_value; } // truncate if ( strlen( $string_value ) > $truncate ) { $string_value = substr( $string_value, 0, $truncate ) . '...'; } break; } return $string_value; } /** * Get the stored number of entries. * * @since 4.0 * @return int */ public static function get_total_entries_count() { global $wpdb; $table_name = Hustle_Db::entries_table(); $sql = "SELECT COUNT(`entry_id`) FROM {$table_name}"; return $wpdb->get_var( $sql ); } private static function available_entry_types() { $available_entry_types = array( 'popup', 'slidein', 'embedded', 'all', ); return $available_entry_types; } /** * Get latest entry * * @since 4.0 * * @param string $entry_type * @return Hustle_Entry_Model|null */ public static function get_latest_entry( $entry_type = 'popup' ) { $available_entry_types = self::available_entry_types(); if ( ! in_array( $entry_type, $available_entry_types, true ) ) { return null; } global $wpdb; $entry = null; $table_name = Hustle_Db::entries_table(); if ( 'all' !== $entry_type ) { $sql = "SELECT `entry_id` FROM {$table_name} WHERE `entry_type` = %s ORDER BY `date_created` DESC"; $sql = $wpdb->prepare( $sql, $entry_type ); // WPCS: unprepared SQL ok. false positive } else { $sql = "SELECT `entry_id` FROM {$table_name} ORDER BY `date_created` DESC"; } $entry_id = $wpdb->get_var( $sql ); // WPCS: unprepared SQL ok. false positive if ( ! empty( $entry_id ) ) { $entry = new Hustle_Entry_Model( $entry_id ); } return $entry; } /** * Get Latest Entry by module_id * * @since 4.0 * * @param $module_id * @return Hustle_Entry_Model|null */ public static function get_latest_entry_by_module_id( $module_id ) { global $wpdb; $entry = null; $table_name = Hustle_Db::entries_table(); $sql = "SELECT `entry_id` FROM {$table_name} WHERE `module_id` = %d ORDER BY `date_created` DESC"; $entry_id = $wpdb->get_var( $wpdb->prepare( $sql, $module_id ) ); // WPCS: unprepared SQL ok. false positive if ( ! empty( $entry_id ) ) { $entry = new Hustle_Entry_Model( $entry_id ); } return $entry; } /** * Get entries newer than $date_created * Previously get_newer_entry_ids * * @since 4.0 * * @param $entry_type * @param $date_created * * @return array */ public static function count_newer_entries_by_module_type( $entry_type, $date_created ) { global $wpdb; $entry_table_name = Hustle_Db::entries_table(); $sql = "SELECT count(`entry_id`) FROM {$entry_table_name} WHERE `entry_type` = %s AND `date_created` > %s"; $entries = $wpdb->get_var( $wpdb->prepare( $sql, $entry_type, $date_created ) ); // WPCS: unprepared SQL ok. false positive return $entries; } /** * Check if there's a subscription with this email in this module. * * @since 4.0 * * @param int $module_id * @param string $email * @return bool */ public static function is_email_subscribed_to_module_id( $module_id, $email ) { global $wpdb; $entries_table = Hustle_Db::entries_table(); $entries_meta_table = Hustle_Db::entries_meta_table(); $query = "SELECT COUNT(*) FROM {$entries_table} e INNER JOIN {$entries_meta_table} m ON e.entry_id = m.entry_id AND e.module_id = %d AND m.meta_key = 'email' AND m.meta_value = %s"; $query = $wpdb->prepare( $query, $module_id, $email ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared $count = $wpdb->get_var( $query ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared $is_subscribed = apply_filters( 'hustle_is_email_in_module_local_list', ! empty( $count ), $module_id, $email ); return $is_subscribed; } /** * Get email if there's a subscription with in this module. * * @since 4.0 * * @param int $module_id * @param string $email * @return bool */ public static function get_email_subscribed_to_module_id( $module_id, $email ) { global $wpdb; $entries_table = Hustle_Db::entries_table(); $entries_meta_table = Hustle_Db::entries_meta_table(); $query = "SELECT e.entry_id FROM {$entries_table} e INNER JOIN {$entries_meta_table} m ON e.entry_id = m.entry_id AND e.module_id = %d AND m.meta_key = 'email' AND m.meta_value = %s"; $query = $wpdb->prepare( $query, $module_id, $email ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared $id = $wpdb->get_var( $query ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared $is_subscribed = apply_filters( 'hustle_email_entry_id_in_module_local_list', $id ); return $is_subscribed; } /** * Returns an array with the IDs of the modules to which the given email is subscribed to the local list. * * @since 4.0.0 * * @param string $email * @return array */ public function get_modules_id_by_email_in_local_list( $email ) { global $wpdb; $cache_key = get_class( $this ); $id = wp_cache_get( 'local_' . $email, $cache_key ); if ( empty( $id ) ) { $query = $wpdb->prepare( 'SELECT DISTINCT `module_id` FROM ' . Hustle_Db::entries_table() . ' e INNER JOIN ' . Hustle_Db::entries_meta_table() . " m ON e.entry_id = m.entry_id AND m.meta_key = 'email' AND m.meta_value = %s", $email ); $id = $wpdb->get_col( $query );//phpcs:ignore wp_cache_set( 'local_' . $email, $id, $cache_key ); } return $id; } /** * Does the actual email unsubscription. * * @since 4.0.0 * @param string $email Email to be unsubscribed. * @param string $nonce Nonce associated with the email for the unsubscription. * @return boolean */ public function unsubscribe_email( $email, $nonce ) { $data = get_option( Hustle_Module_Model::KEY_UNSUBSCRIBE_NONCES, false ); if ( ! $data ) { return false; } if ( ! isset( $data[ $email ] ) || ! isset( $data[ $email ]['nonce'] ) || ! isset( $data[ $email ]['lists_id'] ) ) { return false; } $email_data = $data[ $email ]; if ( ! hash_equals( (string) $email_data['nonce'], $nonce ) ) { return false; } // Nonce expired. Remove it. Currently giving 1 day of life span. if ( ( time() - (int) $email_data['date_created'] ) > DAY_IN_SECONDS ) { unset( $data[ $email ] ); update_option( Hustle_Module_Model::KEY_UNSUBSCRIBE_NONCES, $data ); return false; } // Proceed to unsubscribe foreach ( $email_data['lists_id'] as $id ) { $unsubscribed = $this->remove_local_subscription_by_email_and_module_id( $email, $id ); } // Clear cache after unsubscription. $cache_key = get_class( $this ); $id = wp_cache_delete( 'local_' . $email, $cache_key ); // The email was unsubscribed and the nonce was used. Remove it from the saved list. unset( $data[ $email ] ); update_option( Hustle_Module_Model::KEY_UNSUBSCRIBE_NONCES, $data ); return true; } /** * Removes the given email from the local list of the given module id. * * @since 4.0.0 * * @param string $email * @param int $module_id * @return array */ public function remove_local_subscription_by_email_and_module_id( $email, $module_id ) { global $wpdb; $query = sprintf( 'SELECT DISTINCT e.`entry_id` FROM %s e INNER JOIN %s m ON e.`entry_id` = m.`entry_id` AND m.`meta_key` = \'email\' AND m.`meta_value` = %%s WHERE e.`module_id` = %%d', Hustle_Db::entries_table(), Hustle_Db::entries_meta_table() ); $query = $wpdb->prepare( $query, $email, $module_id ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared $entries = $wpdb->get_col( $query ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared if ( empty( $entries ) ) { return; } self::delete_by_entries( $module_id, $entries ); } /** * Get entries older than $date_created * * @since 4.0.2 * * @param $date_created * * @return array */ public static function get_older_entry_ids( $date_created ) { global $wpdb; $entries_table = Hustle_Db::entries_table(); $query = "SELECT e.entry_id AS entry_id FROM {$entries_table} e WHERE e.date_created < %s"; // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared $query = $wpdb->prepare( $query, $date_created ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared return $wpdb->get_col( $query ); } /** * Get entries by email * * @since 4.0.2 * * @param $email * * @return array */ public static function get_entries_by_email( $email ) { global $wpdb; $meta_table = Hustle_Db::entries_meta_table(); $query = "SELECT m.entry_id AS entry_id FROM {$meta_table} m WHERE (m.meta_key LIKE %s) AND m.meta_value = %s GROUP BY m.entry_id"; // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared $query = $wpdb->prepare( $query, 'email', $email ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared return $wpdb->get_col( $query ); } /** * Delete all IP * * @since 4.0.0 */ public function delete_all_ips() { global $wpdb; $wpdb->delete( $this->table_meta_name, array( 'meta_key' => 'hustle_ip' ) ); } /** * Delete selected IPs * * @since 4.0.0 * * @param array $ips Array of IPs to remove. */ public function delete_selected_ips( $ips ) { if ( empty( $ips ) || ! is_array( $ips ) ) { return; } global $wpdb; $in = array(); $ranges = array(); foreach ( $ips as $one ) { if ( is_array( $one ) ) { $ranges[] = sprintf( '( INET_ATON( `meta_value` ) BETWEEN %d AND %d )', $one[0], $one[1] ); } else { $in[] = $one; } } $query = sprintf( 'DELETE FROM `%s` WHERE `meta_key` = \'hustle_ip\' AND ( ', Hustle_Db::entries_meta_table() ); if ( ! empty( $in ) ) { $formatted_in_array = array_map( function( $a ) { return sprintf( '\'%s\'', $a ); }, $in ); $query .= sprintf( '`meta_value` IN ( %s ) ', implode( ', ', $formatted_in_array ) ); if ( ! empty( $ranges ) ) { $query .= 'OR '; } } if ( ! empty( $ranges ) ) { $query .= implode( ' OR ', $ranges ); } $query .= ' )'; $wpdb->query( $query ); } }