PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.3.0
GiveWP – Donation Plugin and Fundraising Platform v2.3.0
4.16.4 4.16.3 4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 2.3.2 2.30.0 2.31.0 2.31.1 2.32.0 2.33.0 2.33.1 2.33.2 2.33.3 2.33.4 2.33.5 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.5.0 2.5.1 2.5.10 2.5.11 2.5.12 2.5.13 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6.0 2.6.1 2.6.2 2.6.3 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.9.0 2.9.1 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.10.0 3.11.0 3.12.0 3.12.1 3.12.2 3.12.3 3.13.0 3.14.0 3.14.1 3.14.2 3.15.0 3.15.1 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.17.0 3.17.1 3.17.2 3.18.0 3.19.0 3.19.1 3.19.2 3.19.3 3.19.4 3.2.0 3.2.1 3.2.2 3.20.0 3.21.0 3.21.1 3.22.0 3.22.1 3.22.2 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.7.0 3.8.0 3.9.0 4.0.0 4.1.0 4.1.1 4.10.0 4.10.1 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.14.5 4.14.6 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.1 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 trunk 1.9.0 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.2 2.11.3 2.12.0 2.12.1 2.12.2 2.12.3 2.13.0 2.13.1 2.13.2 2.13.3 2.13.4 2.14.0 2.15.0 2.16.0 2.16.1 2.17.0 2.17.1 2.17.3 2.18.0 2.18.1 2.19.1 2.19.2 2.19.3 2.19.4 2.19.5 2.19.6 2.19.7 2.19.8 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.20.0 2.20.1 2.20.2 2.21.0 2.21.1 2.21.2 2.21.3 2.21.4 2.22.0 2.22.1 2.22.2 2.22.3 2.23.0 2.23.1 2.23.2 2.24.0 2.24.1 2.24.2 2.25.0 2.25.1 2.25.2 2.25.3 2.26.0 2.27.0 2.27.1 2.27.2 2.27.3 2.28.0 2.29.0 2.29.1 2.29.2
give / includes / class-give-db-comments.php
give / includes Last commit date
admin 7 years ago api 7 years ago deprecated 7 years ago donors 7 years ago emails 7 years ago forms 7 years ago gateways 7 years ago libraries 7 years ago payments 7 years ago actions.php 7 years ago ajax-functions.php 7 years ago class-give-async-process.php 8 years ago class-give-background-updater.php 7 years ago class-give-cache.php 7 years ago class-give-cli-commands.php 8 years ago class-give-comment.php 7 years ago class-give-cron.php 8 years ago class-give-db-comments-meta.php 7 years ago class-give-db-comments.php 7 years ago class-give-db-donor-meta.php 8 years ago class-give-db-donors.php 7 years ago class-give-db-form-meta.php 8 years ago class-give-db-logs-meta.php 8 years ago class-give-db-logs.php 7 years ago class-give-db-meta.php 7 years ago class-give-db-payment-meta.php 7 years ago class-give-db-sequential-ordering.php 7 years ago class-give-db-sessions.php 7 years ago class-give-db.php 7 years ago class-give-donate-form.php 8 years ago class-give-donor-wall-widget.php 7 years ago class-give-donor.php 7 years ago class-give-email-access.php 7 years ago class-give-html-elements.php 7 years ago class-give-license-handler.php 7 years ago class-give-logging.php 8 years ago class-give-readme-parser.php 8 years ago class-give-roles.php 8 years ago class-give-scripts.php 7 years ago class-give-session.php 7 years ago class-give-stats.php 8 years ago class-give-template-loader.php 8 years ago class-give-tooltips.php 8 years ago class-give-translation.php 8 years ago class-notices.php 7 years ago country-functions.php 7 years ago currency-functions.php 7 years ago error-tracking.php 8 years ago filters.php 7 years ago formatting.php 7 years ago import-functions.php 7 years ago install.php 7 years ago login-register.php 8 years ago misc-functions.php 7 years ago plugin-compatibility.php 8 years ago post-types.php 7 years ago price-functions.php 7 years ago process-donation.php 7 years ago shortcodes.php 7 years ago template-functions.php 8 years ago user-functions.php 7 years ago
class-give-db-comments.php
403 lines
1 <?php
2 /**
3 * Custom Comments & Notes
4 *
5 * @package Give
6 * @subpackage Classes/Give_DB_Comments
7 * @copyright Copyright (c) 2018, WordImpress
8 * @license https://opensource.org/licenses/gpl-license GNU Public License
9 * @since 2.3.0
10 */
11
12 // Exit if accessed directly.
13 if ( ! defined( 'ABSPATH' ) ) {
14 exit;
15 }
16
17 /**
18 * Give_DB_Comments Class
19 *
20 * This class is for interacting with the comment database table.
21 *
22 * @since 2.3.0
23 */
24 class Give_DB_Comments extends Give_DB {
25
26 /**
27 * Give_DB_Comments constructor.
28 *
29 * Set up the Give DB Donor class.
30 *
31 * @since 2.3.0
32 * @access public
33 */
34 public function __construct() {
35 /* @var WPDB $wpdb */
36 global $wpdb;
37
38 $wpdb->give_comments = $this->table_name = $wpdb->prefix . 'give_comments';
39 $this->primary_key = 'comment_ID';
40 $this->version = '1.0';
41
42 // Install table.
43 $this->register_table();
44
45 parent::__construct();
46 }
47
48 /**
49 * Get columns and formats
50 *
51 * @since 2.3.0
52 * @access public
53 *
54 * @return array Columns and formats.
55 */
56 public function get_columns() {
57 return array(
58 'comment_ID' => '%d',
59 'user_id' => '%d',
60 'comment_content' => '%s',
61 'comment_parent' => '%s',
62 'comment_type' => '%s',
63 'comment_date' => '%s',
64 'comment_date_gmt' => '%s',
65 );
66 }
67
68 /**
69 * Get default column values
70 *
71 * @since 2.3.0
72 * @access public
73 *
74 * @return array Default column values.
75 */
76 public function get_column_defaults() {
77 $comment_create_date = current_time( 'mysql', 0 );
78 $comment_create_date_gmt = get_gmt_from_date( $comment_create_date );
79
80 return array(
81 'comment_ID' => 0,
82 'user_id' => 0,
83 'comment_content' => '',
84 'comment_parent' => 0,
85 'comment_type' => '',
86 'comment_date' => $comment_create_date,
87 'comment_date_gmt' => $comment_create_date_gmt,
88 );
89 }
90
91 /**
92 * Add a comment
93 *
94 * @since 2.3.0
95 * @access public
96 *
97 * @param array $data
98 *
99 * @return bool|int
100 */
101 public function add( $data = array() ) {
102 // Valid table columns.
103 $table_columns = array_keys( $this->get_columns() );
104
105 // Filter data.
106 foreach ( $data as $table_column => $column_data ) {
107 if ( ! in_array( $table_column, $table_columns ) ) {
108 unset( $data[ $table_column ] );
109 }
110 }
111
112 // Set default values.
113 $current_comment_data = wp_parse_args( $data, $this->get_column_defaults() );
114
115 // Filter comment content. Filter documented in /wp-includes/comment.php
116 $current_comment_data['comment_content'] = apply_filters( 'pre_comment_content', $current_comment_data['comment_content'] );
117
118 // Strip out backslash for apostrophe and sanitize comment using give_clean.
119 $current_comment_data['comment_content'] = isset( $current_comment_data['comment_content'] )
120 ? wp_unslash( wp_strip_all_tags( $current_comment_data['comment_content'] ) )
121 : $current_comment_data['comment_content'];
122
123 // Comment parent should be an int.
124 $current_comment_data['comment_parent'] = is_numeric( $current_comment_data['comment_parent'] )
125 ? absint( $current_comment_data['comment_parent'] )
126 : $current_comment_data['comment_parent'];
127
128 // Get comment.
129 $existing_comment = $this->get_comment_by( $current_comment_data['comment_ID'] );
130
131 // Update an existing comment.
132 if ( $existing_comment ) {
133
134 // Create new comment data from existing and new comment data.
135 $current_comment_data = wp_parse_args( $current_comment_data, $existing_comment );
136
137 // Update comment data.
138 $this->update( $current_comment_data['comment_ID'], $current_comment_data );
139
140 $comment_id = $current_comment_data['comment_ID'];
141
142 } else {
143 $comment_id = $this->insert( $current_comment_data, 'comment' );
144 }
145
146 return $comment_id;
147 }
148
149
150 /**
151 * Retrieves a single comment from the database
152 *
153 * @since 2.3.0
154 * @access public
155 *
156 * @param int $comment_id
157 * @param string $by
158 *
159 * @return bool|null|array
160 */
161 public function get_comment_by( $comment_id = 0, $by = 'id' ) {
162 /* @var WPDB $wpdb */
163 global $wpdb;
164 $comment = null;
165
166 // Make sure $comment_id is int.
167 $comment_id = absint( $comment_id );
168
169 // Bailout.
170 if ( empty( $comment_id ) ) {
171 return null;
172 }
173
174 switch ( $by ) {
175 case 'id':
176 $comment = $wpdb->get_row(
177 $wpdb->prepare(
178 "SELECT * FROM $this->table_name WHERE comment_ID = %s LIMIT 1",
179 $comment_id
180 ),
181 ARRAY_A
182 );
183 break;
184
185 default:
186 $comment = apply_filters( "give_get_comment_by_{$by}", $comment, $comment_id );
187 }
188
189 return $comment;
190 }
191
192 /**
193 * Retrieve comments from the database.
194 *
195 * @since 2.3.0
196 * @access public
197 *
198 * @param array $args
199 *
200 * @return mixed
201 */
202 public function get_comments( $args = array() ) {
203 global $wpdb;
204 $sql_query = $this->get_sql( $args );
205
206 // Get comment.
207 $comments = $wpdb->get_results( $sql_query );
208
209 return $comments;
210 }
211
212
213 /**
214 * Count the total number of comments in the database
215 *
216 * @since 2.3.0
217 * @access public
218 *
219 * @param array $args
220 *
221 * @return int
222 */
223 public function count( $args = array() ) {
224 /* @var WPDB $wpdb */
225 global $wpdb;
226 $args['number'] = - 1;
227 $args['fields'] = 'comment_ID';
228 $args['count'] = true;
229
230 $sql_query = $this->get_sql( $args );
231
232 $count = $wpdb->get_var( $sql_query );
233
234 return absint( $count );
235 }
236
237 /**
238 * Create the table
239 *
240 * @since 2.3.0
241 * @access public
242 *
243 * @return void
244 */
245 public function create_table() {
246 global $wpdb;
247 $charset_collate = $wpdb->get_charset_collate();
248
249 $sql = "CREATE TABLE {$this->table_name} (
250 comment_ID bigint(20) NOT NULL AUTO_INCREMENT,
251 user_id bigint(20) NOT NULL,
252 comment_content longtext NOT NULL,
253 comment_parent mediumtext NOT NULL,
254 comment_type mediumtext NOT NULL,
255 comment_date datetime NOT NULL,
256 comment_date_gmt datetime NOT NULL,
257 PRIMARY KEY (comment_ID)
258 ) {$charset_collate};";
259
260 require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
261 dbDelta( $sql );
262
263 update_option( $this->table_name . '_db_version', $this->version, false );
264 }
265
266
267 /**
268 * Get sql query from quaried array.
269 *
270 * @since 2.3.0
271 * @access public
272 *
273 * @param array $args
274 *
275 * @return string
276 */
277 public function get_sql( $args = array() ) {
278 /* @var WPDB $wpdb */
279 global $wpdb;
280
281 $defaults = array(
282 'number' => 20,
283 'offset' => 0,
284 'paged' => 0,
285 'orderby' => 'date',
286 'order' => 'DESC',
287 'fields' => 'all',
288 'count' => false,
289 );
290
291 $args = wp_parse_args( $args, $defaults );
292
293 // validate params.
294 $this->validate_params( $args );
295
296 if ( $args['number'] < 1 ) {
297 $args['number'] = 99999999999;
298 }
299
300 // Where clause for primary table.
301 $where = '';
302
303 // Get sql query for meta.
304 if ( ! empty( $args['meta_query'] ) ) {
305 $meta_query_object = new WP_Meta_Query( $args['meta_query'] );
306 $meta_query = $meta_query_object->get_sql( 'give_comment', $this->table_name, 'comment_ID' );
307 $where = implode( '', $meta_query );
308 }
309
310 $where .= ' WHERE 1=1 ';
311
312 // Set offset.
313 if ( empty( $args['offset'] ) && ( 0 < $args['paged'] ) ) {
314 $args['offset'] = $args['number'] * ( $args['paged'] - 1 );
315 }
316
317 // Set fields.
318 $fields = "{$this->table_name}.*";
319 if ( is_string( $args['fields'] ) && ( 'all' !== $args['fields'] ) ) {
320 $fields = "{$this->table_name}.{$args['fields']}";
321 }
322
323 // Set count.
324 if ( $args['count'] ) {
325 $fields = "COUNT({$fields})";
326 }
327
328 // Specific comments.
329 if ( ! empty( $args['comment_ID'] ) ) {
330
331 if ( ! is_array( $args['comment_ID'] ) ) {
332 $args['comment_ID'] = explode( ',', $args['comment_ID'] );
333 }
334 $comment_ids = implode( ',', array_map( 'intval', $args['comment_ID'] ) );
335
336 $where .= " AND {$this->table_name}.comment_ID IN( {$comment_ids} ) ";
337 }
338
339 // Comments created for a specific date or in a date range
340 if ( ! empty( $args['date_query'] ) ) {
341 $date_query_object = new WP_Date_Query( $args['date_query'], "{$this->table_name}.comment_date" );
342 $where .= $date_query_object->get_sql();
343 }
344
345 // Comments create for specific parent.
346 if ( ! empty( $args['comment_parent'] ) ) {
347 if ( ! is_array( $args['comment_parent'] ) ) {
348 $args['comment_parent'] = explode( ',', $args['comment_parent'] );
349 }
350 $parent_ids = implode( ',', array_map( 'intval', $args['comment_parent'] ) );
351
352 $where .= " AND {$this->table_name}.comment_parent IN( {$parent_ids} ) ";
353 }
354
355 // Comments create for specific type.
356 // is_array check is for backward compatibility.
357 if ( ! empty( $args['comment_type'] ) && ! is_array( $args['comment_type'] ) ) {
358 if ( ! is_array( $args['comment_type'] ) ) {
359 $args['comment_type'] = explode( ',', $args['comment_type'] );
360 }
361
362 $comment_types = implode( '\',\'', array_map( 'trim', $args['comment_type'] ) );
363
364 $where .= " AND {$this->table_name}.comment_type IN( '{$comment_types}' ) ";
365 }
366
367 $args['orderby'] = ! array_key_exists( $args['orderby'], $this->get_columns() ) ? 'comment_date' : $args['orderby'];
368
369 $args['orderby'] = esc_sql( $args['orderby'] );
370 $args['order'] = esc_sql( $args['order'] );
371
372 return $wpdb->prepare(
373 "SELECT {$fields} FROM {$this->table_name} {$where} ORDER BY {$this->table_name}.{$args['orderby']} {$args['order']} LIMIT %d,%d;",
374 absint( $args['offset'] ),
375 absint( $args['number'] )
376 );
377 }
378
379
380 /**
381 * Validate query params.
382 *
383 * @since 2.3.0
384 * @access private
385 *
386 * @param $args
387 *
388 * @return mixed
389 */
390 private function validate_params( &$args ) {
391 // fields params
392 $args['fields'] = 'ids' === $args['fields']
393 ? 'comment_ID'
394 : $args['fields'];
395 $args['fields'] = array_key_exists( $args['fields'], $this->get_columns() )
396 ? $args['fields']
397 : 'all';
398 }
399 }
400
401 // @todo: update cache logic.
402 // @todo: create issue for log cache logic.
403