PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.2.4
GiveWP – Donation Plugin and Fundraising Platform v2.2.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-comment.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-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 8 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 8 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-comment.php
489 lines
1 <?php
2
3 /**
4 * Class for managing comments
5 *
6 * @package Give
7 * @subpackage Classes/Give_Cache
8 * @copyright Copyright (c) 2018, WordImpress
9 * @license https://opensource.org/licenses/gpl-license GNU Public License
10 * @since 2.2.0
11 */
12 class Give_Comment {
13 /**
14 * Instance.
15 *
16 * @since 2.2.0
17 * @access private
18 * @var
19 */
20 static private $instance;
21
22 /**
23 * Comment Types.
24 *
25 * @since 2.2.0
26 * @access private
27 * @var array
28 */
29 private $comment_types;
30
31 /**
32 * Singleton pattern.
33 *
34 * @since 2.2.0
35 * @access private
36 */
37 private function __construct() {
38 }
39
40
41 /**
42 * Get instance.
43 *
44 * @since 2.2.0
45 * @access pu
46 * @return Give_Comment
47 */
48 public static function get_instance() {
49 if ( null === static::$instance ) {
50 self::$instance = new static();
51 self::$instance->init();
52 }
53
54 return self::$instance;
55 }
56
57 /**
58 * Initialize
59 *
60 * @since 2.2.0
61 * @access private
62 */
63 private function init() {
64 /**
65 * Filter the comment type
66 *
67 * @since 2.2.0
68 */
69 $this->comment_types = apply_filters(
70 'give_comment_type',
71 self::get_comment_types( array( 'payment', 'donor' ) )
72 );
73
74 add_action( 'pre_get_comments', array( $this, 'hide_comments' ), 10 );
75 add_filter( 'comments_clauses', array( $this, 'hide_comments_pre_wp_41' ), 10, 1 );
76 add_filter( 'comment_feed_where', array( $this, 'hide_comments_from_feeds' ), 10, 1 );
77 add_filter( 'wp_count_comments', array( $this, 'remove_comments_from_comment_counts' ), 10, 2 );
78 add_filter( 'get_comment_author', array( $this, '__get_comment_author' ), 10, 3 );
79 }
80
81 /**
82 * Insert/Update comment
83 *
84 * @since 2.2.0
85 * @access public
86 *
87 * @param int $id Payment|Donor ID.
88 * @param string $note Comment Text
89 * @param string $comment_type Value can ve donor|payment
90 * @param array $comment_args Comment arguments
91 *
92 * @return int|WP_Error
93 */
94 public static function add( $id, $note, $comment_type, $comment_args = array() ) {
95 // Bailout
96 if ( empty( $id ) || empty( $note ) || empty( $comment_type ) ) {
97 return new WP_Error( 'give_invalid_required_param', __( 'This comment has invalid ID or comment text or cooment type', 'give' ) );
98 }
99
100 $is_existing_comment = array_key_exists( 'comment_ID', $comment_args ) && ! empty( $comment_args['comment_ID'] );
101 $action_type = $is_existing_comment ? 'update' : 'insert';
102
103 /**
104 * Fires before inserting/updating payment|donor comment.
105 *
106 * @param int $id Payment|Donor ID.
107 * @param string $note Comment text.
108 *
109 * @since 1.0
110 */
111 do_action( "give_pre_{$action_type}_{$comment_type}_note", $id, $note );
112
113 $comment_args = wp_parse_args(
114 $comment_args,
115 array(
116 'comment_post_ID' => $id,
117 'comment_content' => $note,
118 'user_id' => is_admin() ? get_current_user_id() : 0,
119 'comment_date' => current_time( 'mysql' ),
120 'comment_date_gmt' => current_time( 'mysql', 1 ),
121 'comment_approved' => 1,
122 'comment_parent' => 0,
123 'comment_author' => '',
124 'comment_author_IP' => '',
125 'comment_author_url' => '',
126 'comment_author_email' => '',
127 'comment_type' => "give_{$comment_type}_note",
128
129 )
130 );
131
132
133 // Check comment max length.
134 $error = wp_check_comment_data_max_lengths( $comment_args );
135 if( is_wp_error( $error ) ) {
136 return $error;
137 }
138
139 // Remove moderation emails when comment posted.
140 remove_action( 'comment_post', 'wp_new_comment_notify_moderator' );
141 remove_action( 'comment_post', 'wp_new_comment_notify_postauthor' );
142
143 // Remove comment flood check.
144 remove_action( 'check_comment_flood', 'check_comment_flood_db', 10 );
145
146 $comment_id = $is_existing_comment
147 ? wp_update_comment( $comment_args )
148 : wp_new_comment( $comment_args, true );
149
150 // Add moderation emails when comment posted.
151 add_action( 'comment_post', 'wp_new_comment_notify_moderator' );
152 add_action( 'comment_post', 'wp_new_comment_notify_postauthor' );
153
154 // Add comment flood check.
155 add_action( 'check_comment_flood', 'check_comment_flood_db', 10, 4 );
156
157 update_comment_meta( $comment_id, "_give_{$comment_type}_id", $id );
158
159 /**
160 * Fires after payment|donor comment inserted/updated.
161 *
162 * @param int $comment_id Comment ID.
163 * @param int $id Payment|Donor ID.
164 * @param string $note Comment text.
165 *
166 * @since 1.0
167 */
168 do_action( "give_{$action_type}_{$comment_type}_note", $comment_id, $id, $note );
169
170 return $comment_id;
171 }
172
173
174 /**
175 * Delete comment
176 *
177 * @since 2.2.0
178 * @access public
179 *
180 * @param int $comment_id The comment ID to delete.
181 * @param int $id The payment|Donor ID the note is connected to.
182 * @param string $comment_type Value can ve donor|payment.
183 *
184 * @since 1.0
185 *
186 * @return bool True on success, false otherwise.
187 */
188 public static function delete( $comment_id, $id, $comment_type ) {
189 $ret = false;
190
191 // Bailout
192 if ( empty( $id ) || empty( $comment_id ) || empty( $comment_type ) ) {
193 return $ret;
194 }
195
196 /**
197 * Fires before deleting donation note.
198 *
199 * @param int $comment_id Comment ID.
200 * @param int $id Payment|Donor ID.
201 *
202 * @since 1.0
203 */
204 do_action( "give_pre_delete_{$comment_type}_note", $comment_id, $id );
205
206 $ret = wp_delete_comment( $comment_id, true );
207
208 /**
209 * Fires after donation note deleted.
210 *
211 * @param int $comment_id Note ID.
212 * @param int $id Payment|Donor ID.
213 * @param bool $ret Flag to check if comment deleted or not.
214 *
215 * @since 1.0
216 */
217 do_action( "give_post_delete_{$comment_type}_note", $comment_id, $id, $ret );
218
219 return $ret;
220 }
221
222
223 /**
224 * Get comments
225 *
226 * @since 2.2.0
227 * @access public
228 *
229 * @param int $id
230 * @param string $comment_type
231 * @param array $comment_args
232 * @param string $search
233 *
234 * @return array
235 */
236 public static function get( $id, $comment_type, $comment_args = array(), $search = '' ) {
237 $comments = array();
238
239 // Set default meta_query value.
240 if ( ! isset( $comment_args['meta_query'] ) ) {
241 $comment_args['meta_query'] = array();
242 }
243
244 // Bailout
245 if ( empty( $id ) || empty( $comment_type ) ) {
246 return $comments;
247 }
248
249 remove_action( 'pre_get_comments', array( self::$instance, 'hide_comments' ), 10 );
250 remove_filter( 'comments_clauses', array( self::$instance, 'hide_comments_pre_wp_41' ), 10 );
251
252 switch ( $comment_type ) {
253 case 'payment':
254 $comment_args['meta_query'] = ! empty( $comment_args['meta_query'] )
255 ? $comment_args['meta_query']
256 : array(
257 array(
258 'key' => '_give_donor_id',
259 'compare' => 'NOT EXISTS'
260 )
261 );
262
263 $comments = get_comments( wp_parse_args(
264 $comment_args,
265 array(
266 'post_id' => $id,
267 'order' => 'ASC',
268 'search' => $search,
269 'type' => 'give_payment_note'
270 )
271 ) );
272 break;
273
274 case 'donor':
275 $comment_args['meta_query'] = ! empty( $comment_args['meta_query'] )
276 ? $comment_args['meta_query']
277 : array(
278 array(
279 'key' => "_give_{$comment_type}_id",
280 'value' => $id
281 )
282 );
283
284 $comments = get_comments( wp_parse_args(
285 $comment_args,
286 array(
287 'order' => 'ASC',
288 'search' => $search,
289 'type' => 'give_donor_note'
290 )
291 ) );
292 break;
293 }
294
295 add_action( 'pre_get_comments', array( self::$instance, 'hide_comments' ), 10, 1 );
296 add_filter( 'comments_clauses', array( self::$instance, 'hide_comments_pre_wp_41' ), 10, 1 );
297
298 return $comments;
299 }
300
301 /**
302 * Exclude comments from showing in Recent
303 * Comments widgets
304 *
305 * @since 2.2.0
306 * @access public
307 *
308 * @param object $query WordPress Comment Query Object.
309 *
310 * @return void
311 */
312 public function hide_comments( $query ) {
313 if ( version_compare( floatval( get_bloginfo( 'version' ) ), '4.1', '>=' ) ) {
314 $types = isset( $query->query_vars['type__not_in'] ) ? $query->query_vars['type__not_in'] : array();
315 if ( ! is_array( $types ) ) {
316 $types = array( $types );
317 }
318
319 $types = array_filter( array_merge( $types, $this->comment_types ) );
320
321 $query->query_vars['type__not_in'] = $types;
322 }
323 }
324
325 /**
326 * Exclude notes (comments) from showing in Recent Comments widgets
327 *
328 * @since 2.2.0
329 * @access public
330 *
331 * @param array $clauses Comment clauses for comment query.
332 *
333 * @return array $clauses Updated comment clauses.
334 */
335 public function hide_comments_pre_wp_41( $clauses ) {
336 if ( version_compare( floatval( get_bloginfo( 'version' ) ), '4.1', '<' ) ) {
337 foreach ( $this->comment_types as $comment_type ) {
338 $clauses['where'] .= " AND comment_type != \"{$comment_type}\"";
339 }
340 }
341
342 return $clauses;
343 }
344
345 /**
346 * Exclude notes (comments) from showing in comment feeds
347 *
348 * @since 2.2.0
349 * @access public
350 *
351 * @param string $where
352 *
353 * @return string $where
354 */
355 public function hide_comments_from_feeds( $where ) {
356 global $wpdb;
357
358 foreach ( $this->comment_types as $comment_type ) {
359 $where .= $wpdb->prepare( ' AND comment_type!=%s', $comment_type );
360 }
361
362 return $where;
363 }
364
365 /**
366 * Remove Give Comments from the wp_count_comments function
367 *
368 * @since 2.2.0
369 * @access public
370 *
371 * @param array $stats (empty from core filter).
372 * @param int $post_id Post ID.
373 *
374 * @return array|object Array of comment counts.
375 */
376 public function remove_comments_from_comment_counts( $stats, $post_id ) {
377 global $wpdb;
378
379 $post_id = (int) $post_id;
380
381 if ( apply_filters( 'give_count_payment_notes_in_comments', false ) ) {
382 return $stats;
383 }
384
385 $stats = Give_Cache::get_group( "comments-{$post_id}", 'counts' );
386
387 // Return result from cache.
388 if ( ! is_null( $stats ) ) {
389 return $stats;
390 }
391
392 $where = 'WHERE';
393
394 foreach ( $this->comment_types as $index => $comment_type ) {
395 $where .= ( $index ? ' AND ' : ' ' ) . "comment_type != \"{$comment_type}\"";
396 }
397
398 if ( $post_id > 0 ) {
399 $where .= $wpdb->prepare( ' AND comment_post_ID = %d', $post_id );
400 }
401
402 $count = $wpdb->get_results(
403 "
404 SELECT comment_approved, COUNT( * ) AS num_comments
405 FROM {$wpdb->comments} {$where}
406 GROUP BY comment_approved
407 ",
408 ARRAY_A
409 );
410
411 $total = 0;
412 $approved = array(
413 '0' => 'moderated',
414 '1' => 'approved',
415 'spam' => 'spam',
416 'trash' => 'trash',
417 'post-trashed' => 'post-trashed',
418 );
419
420 foreach ( (array) $count as $row ) {
421 // Don't count post-trashed toward totals.
422 if ( 'post-trashed' != $row['comment_approved'] && 'trash' != $row['comment_approved'] ) {
423 $total += $row['num_comments'];
424 }
425 if ( isset( $approved[ $row['comment_approved'] ] ) ) {
426 $stats[ $approved[ $row['comment_approved'] ] ] = $row['num_comments'];
427 }
428 }
429
430 $stats['total_comments'] = $stats['all'] = $total;
431 foreach ( $approved as $key ) {
432 if ( empty( $stats[ $key ] ) ) {
433 $stats[ $key ] = 0;
434 }
435 }
436
437 $stats = (object) $stats;
438
439 Give_Cache::set_group( "comments-{$post_id}", $stats, 'counts' );
440
441 return $stats;
442 }
443
444 /**
445 * Get donor name
446 *
447 * @since 2.2.0
448 * @access public
449 *
450 * @param string $author
451 * @param int $comment_id
452 * @param WP_Comment $comment
453 *
454 * @return mixed
455 */
456 public function __get_comment_author( $author, $comment_id, $comment ) {
457 if ( in_array( $comment->comment_type, $this->comment_types ) ) {
458 switch ( $comment->comment_type ) {
459 case 'give_payment_note':
460 if ( get_comment_meta( $comment_id, '_give_donor_id', true ) ) {
461 $author = give_get_donor_name_by( $comment->comment_post_ID );
462 }
463 }
464 }
465
466 return $author;
467 }
468
469
470 /**
471 * Get comment types
472 *
473 * @since 2.2.0
474 * @access public
475 *
476 * @param array @comment_types
477 *
478 * @return array
479 */
480 public static function get_comment_types( $comment_types ) {
481 $_comment_types = array();
482 foreach ( $comment_types as $comment_type ) {
483 $_comment_types[] = "give_{$comment_type}_note";
484 }
485
486 return $_comment_types;
487 }
488 }
489