lists_contacts_db->get_all_contacts_count( 0, false );
break;
case 'subscribed':
return ES()->lists_contacts_db->get_subscribed_contacts_count( 0, false );
break;
case 'unsubscribed':
return ES()->lists_contacts_db->get_unsubscribed_contacts_count( 0, false );
break;
case 'confirmed':
return ES()->lists_contacts_db->get_confirmed_contacts_count( 0, false );
break;
case 'unconfirmed':
return ES()->lists_contacts_db->get_unconfirmed_contacts_count( 0, false );
break;
case 'select_list':
default:
return '-';
break;
}
}
/**
* Allow for custom query variables
*/
public function query_vars( $query_vars ) {
$query_vars[] = 'download_report';
return $query_vars;
}
/**
* Parse the request
*/
public function parse_request( &$wp ) {
if ( array_key_exists( 'download_report', $wp->query_vars ) ) {
$this->download_report();
exit;
}
}
/**
* Download report
*/
public function download_report() {
?>
Download Report
lists_contacts_db->get_all_contacts();
} elseif ( 'subscribed' === $status ) {
$results = ES()->lists_contacts_db->get_all_subscribed_contacts();
} elseif ( 'unsubscribed' === $status ) {
$results = ES()->lists_contacts_db->get_all_unsubscribed_contacts();
} elseif ( 'confirmed' === $status ) {
$results = ES()->lists_contacts_db->get_all_confirmed_contacts();
} elseif ( 'unconfirmed' === $status ) {
$results = ES()->lists_contacts_db->get_all_unconfirmed_contacts();
} elseif ( 'select_list' === $status ) {
$list_id = absint( $list_id );
$results = ES()->lists_contacts_db->get_all_contacts_from_list( $list_id );
}
$subscribers = array();
if ( count( $results ) > 0 ) {
$contact_list_map = array();
$contact_ids = array();
foreach ( $results as $result ) {
if ( ! in_array( $result['contact_id'], $contact_ids, true ) ) {
$contact_ids[] = $result['contact_id'];
}
$contact_list_map[ $result['contact_id'] ][] = array(
'status' => $result['status'],
'list_id' => $result['list_id'],
'optin_type' => $result['optin_type'],
);
}
$contact_ids_str = implode( ',', $contact_ids );
$select_columns = array(
'id',
'first_name',
'last_name',
'email',
'created_at',
);
$custom_fields = ES()->custom_fields_db->get_custom_fields();
if ( ! empty( $custom_fields ) ) {
foreach ( $custom_fields as $field ) {
$select_columns[] = $field['slug'];
}
}
$query = 'SELECT ' . implode( ',', $select_columns ) . " FROM {$wpbd->prefix}ig_contacts WHERE id IN ({$contact_ids_str})";
$subscribers = $wpbd->get_results( $query, ARRAY_A );
}
$csv_output = '';
if ( count( $subscribers ) > 0 ) {
$headers = array(
__( 'First Name', 'email-subscribers' ),
__( 'Last Name', 'email-subscribers' ),
__( 'Email', 'email-subscribers' ),
__( 'List', 'email-subscribers' ),
__( 'Status', 'email-subscribers' ),
__( 'Opt-In Type', 'email-subscribers' ),
__( 'Created On', 'email-subscribers' ),
);
if ( ! empty( $custom_fields ) ) {
foreach ( $custom_fields as $field ) {
$headers[] = $field['label'];
}
}
$lists_id_name_map = ES()->lists_db->get_list_id_name_map();
$csv_output .= implode( ',', $headers );
foreach ( $subscribers as $key => $subscriber ) {
$data = array();
$data['first_name'] = trim( str_replace( '"', '""', $this->escape_data( $subscriber['first_name'] ) ) );
$data['last_name'] = trim( str_replace( '"', '""', $this->escape_data( $subscriber['last_name'] ) ) );
$data['email'] = trim( str_replace( '"', '""', $this->escape_data( $subscriber['email'] ) ) );
$contact_id = $subscriber['id'];
if ( ! empty( $contact_list_map[ $contact_id ] ) ) {
foreach ( $contact_list_map[ $contact_id ] as $list_details ) {
$data['list'] = $lists_id_name_map[ $list_details['list_id'] ];
$data['status'] = ucfirst( $list_details['status'] );
$data['optin_type'] = ( 1 == $list_details['optin_type'] ) ? 'Single Opt-In' : 'Double Opt-In';
$data['created_at'] = $subscriber['created_at'];
if ( ! empty( $custom_fields ) ) {
foreach ( $custom_fields as $field ) {
$column_name = $field['slug'];
$data[ $column_name ] = $subscriber[ $column_name ];
}
}
$csv_output .= "\n";
$csv_output .= '"' . implode( '","', $data ) . '"';
}
}
}
}
return $csv_output;
}
/**
* Escape a string to be used in a CSV context
*
* Malicious input can inject formulas into CSV files, opening up the possibility
* for phishing attacks and disclosure of sensitive information.
*
* Additionally, Excel exposes the ability to launch arbitrary commands through
* the DDE protocol.
*
* @see http://www.contextis.com/resources/blog/comma-separated-vulnerabilities/
* @see https://hackerone.com/reports/72785
*
* @since 5.5.3
* @param string $data CSV field to escape.
* @return string
*/
public function escape_data( $data ) {
$active_content_triggers = array( '=', '+', '-', '@' );
if ( in_array( mb_substr( $data, 0, 1 ), $active_content_triggers, true ) ) {
$data = "'" . $data;
}
return $data;
}
}