Completed
Push — master ( c6f286...60de28 )
by Sudar
02:10
created

TableManager::delete_logs()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 10
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
cc 1
eloc 5
nc 1
nop 1
dl 0
loc 10
ccs 0
cts 3
cp 0
crap 2
rs 9.4285
c 0
b 0
f 0
1
<?php namespace EmailLog\Core\DB;
2
/**
3
 * Handle installation and db table creation
4
 */
5
6
use EmailLog\Core\Loadie;
7
8
defined( 'ABSPATH' ) || exit; // Exit if accessed directly.
9
10
/**
11
 * Helper class to create table.
12
 *
13
 * @since 2.0.0
14
 */
15
class TableManager implements Loadie {
16
17
	/* Database table name */
18
	const LOG_TABLE_NAME = 'email_log';
19
20
	/* Database option name */
21
	const DB_OPTION_NAME = 'email-log-db';
22
23
	/* Database version */
24
	const DB_VERSION = '0.1';
25
26
	/**
27
	 * Setup hooks.
28
	 */
29
	public function load() {
30
		add_action( 'wpmu_new_blog', array( $this, 'create_table_for_new_blog' ) );
31
32
		add_filter( 'wpmu_drop_tables', array( $this, 'delete_table_from_deleted_blog' ) );
33
	}
34
35
	/**
36
	 * On plugin activation, create table if needed.
37
	 *
38
	 * @param bool $network_wide True if the plugin was network activated.
39
	 */
40
	public function on_activate( $network_wide ) {
41
		if ( is_multisite() && $network_wide ) {
42
			// Note: if there are more than 10,000 blogs or
43
			// if `wp_is_large_network` filter is set, then this may fail.
44
			// TODO: Take care of the deprecated function.
45
			$sites = wp_get_sites();
46
47
			foreach ( $sites as $site ) {
48
				switch_to_blog( $site['blog_id'] );
49
				$this->create_table();
50
				restore_current_blog();
51
			}
52
		} else {
53
			$this->create_table();
54
		}
55
	}
56
57
	/**
58
	 * Create email log table when a new blog is created.
59
	 *
60
	 * @param int $blog_id Blog Id.
61
	 */
62
	public function create_table_for_new_blog( $blog_id ) {
63
		if ( is_plugin_active_for_network( 'email-log/email-log.php' ) ) {
64
			switch_to_blog( $blog_id );
65
			$this->create_table();
66
			restore_current_blog();
67
		}
68
	}
69
70
	/**
71
	 * Add email log table to the list of tables deleted when a blog is deleted.
72 2
	 *
73 2
	 * @param  array $tables List of tables to be deleted.
74
	 *
75 2
	 * @return string[]  $tables Modified list of tables to be deleted.
76
	 */
77
	public function delete_table_from_deleted_blog( $tables ) {
78
		$tables[] = $this->get_log_table_name();
79
80
		return $tables;
81
	}
82
83 4
	/**
84 4
	 * Get email log table name.
85
	 *
86 4
	 * @return string Email Log Table name.
87
	 */
88
	public function get_log_table_name() {
89
		global $wpdb;
90
91
		return $wpdb->prefix . self::LOG_TABLE_NAME;
92
	}
93
94
	/**
95
	 * Insert log data into DB.
96
	 *
97
	 * @param array $data Data to be inserted.
98
	 */
99
	public function insert_log( $data ) {
100
		global $wpdb;
101
102
		$table_name = $this->get_log_table_name();
103
		$wpdb->insert( $table_name, $data );
104
	}
105
106
	/**
107
	 * Delete log entries by ids.
108
	 *
109
	 * @param string $ids Comma separated list of log ids.
110
	 *
111
	 * @return false|int Number of log entries that got deleted. False on failure.
112
	 */
113
	public function delete_logs( $ids ) {
114
		global $wpdb;
115
116
		$table_name = $this->get_log_table_name();
117
118
		// Can't use wpdb->prepare for the below query. If used it results in this bug // https://github.com/sudar/email-log/issues/13.
119
		$ids = esc_sql( $ids );
120
121
		return $wpdb->query( "DELETE FROM {$table_name} where id IN ( {$ids} )" ); //@codingStandardsIgnoreLine
122
	}
123
124
	/**
125
	 * Delete all log entries.
126
	 *
127
	 * @return false|int Number of log entries that got deleted. False on failure.
128
	 */
129
	public function delete_all_logs() {
130
		global $wpdb;
131
132
		$table_name = $this->get_log_table_name();
133
134
		return $wpdb->query( "DELETE FROM {$table_name}" ); //@codingStandardsIgnoreLine
135
	}
136
137
	/**
138
	 * Deletes Email Logs older than the specified interval.
139
	 *
140
	 * @param  int $interval_in_days No. of days beyond which logs are to be deleted.
141
	 *
142
	 * @return int $deleted_rows_count  Count of rows deleted.
143
	 */
144
	public function delete_logs_older_than( $interval_in_days ) {
145
		global $wpdb;
146
		$table_name = $this->get_log_table_name();
147
148
		$query = $wpdb->prepare( "DELETE FROM {$table_name} WHERE sent_date < DATE_SUB( CURDATE(), INTERVAL %d DAY )", $interval_in_days );
149
		$deleted_rows_count = $wpdb->query( $query );
150
151
		return $deleted_rows_count;
152
	}
153
154
	/**
155
	 * Get message by log id.
156
	 *
157
	 * @param int $id Id of the log whose message is needed.
158
	 *
159
	 * @return null|string Message of the log with $id.
160
	 */
161
	public function get_log_message( $id ) {
162
		global $wpdb;
163
164
		$table_name = $this->get_log_table_name();
165
166
		return $wpdb->get_var( $wpdb->prepare( "SELECT message FROM {$table_name} WHERE id = %d", $id ) ); //@codingStandardsIgnoreLine
167
	}
168
169
	/**
170
	 * Fetch log item by ID.
171
	 *
172
	 * @param array $ids Optional. Array of IDs of the log items to be retrieved.
173
	 *
174
	 * @return array        Log item(s).
175
	 */
176
	public function fetch_log_items_by_id( $ids = array() ) {
177
		global $wpdb;
178
		$table_name = $this->get_log_table_name();
179
180
		$query = "SELECT * FROM {$table_name}";
181
182
		if ( ! empty( $ids ) ) {
183
			$ids = array_map( 'absint', $ids );
184
185
			// Can't use wpdb->prepare for the below query. If used it results in this bug https://github.com/sudar/email-log/issues/13.
186
			$ids_list = esc_sql( implode( ',', $ids ) );
187
188
			$query .= " where id IN ( {$ids_list} )";
189
		}
190
191
		return $wpdb->get_results( $query, 'ARRAY_A' ); //@codingStandardsIgnoreLine
192
	}
193
194
	/**
195
	 * Fetch log items.
196
	 *
197
	 * @param array $request         Request object.
198
	 * @param int   $per_page        Entries per page.
199
	 * @param int   $current_page_no Current page no.
200
	 *
201
	 * @return array Log entries and total items count.
202
	 */
203
	public function fetch_log_items( $request, $per_page, $current_page_no ) {
204
		global $wpdb;
205
		$table_name = $this->get_log_table_name();
206
207
		$query       = 'SELECT * FROM ' . $table_name;
208
		$count_query = 'SELECT count(*) FROM ' . $table_name;
209
		$query_cond  = '';
210
211
		if ( isset( $request['s'] ) && $request['s'] !== '' ) {
212
			$search_term = trim( esc_sql( $request['s'] ) );
213
			$query_cond .= " WHERE ( to_email LIKE '%$search_term%' OR subject LIKE '%$search_term%' ) ";
214
		}
215
216
		if ( isset( $request['d'] ) && $request['d'] !== '' ) {
217
			$search_date = trim( esc_sql( $request['d'] ) );
218
			if ( '' === $query_cond ) {
219
				$query_cond .= " WHERE sent_date BETWEEN '$search_date 00:00:00' AND '$search_date 23:59:59' ";
220
			} else {
221
				$query_cond .= " AND sent_date BETWEEN '$search_date 00:00:00' AND '$search_date 23:59:59' ";
222
			}
223
		}
224
225
		// Ordering parameters.
226
		$orderby = ! empty( $request['orderby'] ) ? esc_sql( $request['orderby'] ) : 'sent_date';
227
		$order   = ! empty( $request['order'] ) ? esc_sql( $request['order'] ) : 'DESC';
228
229
		if ( ! empty( $orderby ) & ! empty( $order ) ) {
230
			$query_cond .= ' ORDER BY ' . $orderby . ' ' . $order;
231
		}
232
233
		// Find total number of items.
234
		$count_query = $count_query . $query_cond;
235
		$total_items = $wpdb->get_var( $count_query );
236
237
		// Adjust the query to take pagination into account.
238
		if ( ! empty( $current_page_no ) && ! empty( $per_page ) ) {
239
			$offset = ( $current_page_no - 1 ) * $per_page;
240
			$query_cond .= ' LIMIT ' . (int) $offset . ',' . (int) $per_page;
241
		}
242
243
		// Fetch the items.
244
		$query = $query . $query_cond;
245
		$items = $wpdb->get_results( $query );
246
247
		return array( $items, $total_items );
248
	}
249
250
	/**
251
	 * Create email log table.
252
	 *
253
	 * @access private
254
	 *
255
	 * @global object $wpdb
256
	 */
257
	private function create_table() {
258
		global $wpdb;
259
260
		$table_name      = $this->get_log_table_name();
261
		$charset_collate = $wpdb->get_charset_collate();
262
263
		if ( $wpdb->get_var( "show tables like '{$table_name}'" ) != $table_name ) {
264
265
			$sql = 'CREATE TABLE ' . $table_name . ' (
266
				id mediumint(9) NOT NULL AUTO_INCREMENT,
267
				to_email VARCHAR(100) NOT NULL,
268
				subject VARCHAR(250) NOT NULL,
269
				message TEXT NOT NULL,
270
				headers TEXT NOT NULL,
271
				attachments TEXT NOT NULL,
272
				sent_date timestamp NOT NULL,
273
				PRIMARY KEY  (id)
274
			) ' . $charset_collate . ' ;';
275
276
			require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
277
			dbDelta( $sql );
278
279
			add_option( self::DB_OPTION_NAME, self::DB_VERSION );
280
		}
281
	}
282
}
283