PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 4.7.0
GiveWP – Donation Plugin and Fundraising Platform v4.7.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 / donors / class-give-donor-wall.php
give / includes / donors Last commit date
actions.php 3 years ago backward-compatibility.php 7 years ago class-give-donor-stats.php 6 years ago class-give-donor-wall.php 1 year ago class-give-donors-query.php 1 year ago frontend-donor-functions.php 3 years ago
class-give-donor-wall.php
671 lines
1 <?php
2 /**
3 * Donor Wall
4 *
5 * @package Give
6 * @subpackage Classes/Give_Donor_Wall
7 * @copyright Copyright (c) 2020, GiveWP
8 * @license https://opensource.org/licenses/gpl-license GNU Public License
9 * @since 1.0
10 */
11
12 // Exit if accessed directly.
13 use Give\Donations\ValueObjects\DonationMetaKeys;
14
15 if (!defined('ABSPATH')) {
16 exit;
17 }
18
19
20 /**
21 * Give_Donor_Wall Class
22 *
23 * This class handles donors.
24 *
25 * @since 2.2.0
26 */
27 class Give_Donor_Wall {
28
29 /**
30 * Instance.
31 *
32 * @since 2.2.0
33 * @access private
34 * @var Give_Donor_Wall
35 */
36 private static $instance;
37
38 /**
39 * Singleton pattern.
40 *
41 * @since 2.2.0
42 * @access private
43 */
44 private function __construct() {
45 }
46
47
48 /**
49 * Get instance.
50 *
51 * @since 2.2.0
52 * @access public
53 * @return Give_Donor_Wall
54 */
55 public static function get_instance() {
56 if ( null === static::$instance ) {
57 self::$instance = new static();
58
59 self::$instance->setup_actions();
60 }
61
62 return self::$instance;
63 }
64
65 /**
66 * Setup the default hooks and actions
67 *
68 * @since 2.2.0
69 *
70 * @return void
71 */
72 public function setup_actions() {
73
74 add_shortcode( 'give_donor_wall', [ $this, 'render_shortcode' ] );
75
76 add_action( 'wp_ajax_give_get_donor_comments', [ $this, 'ajax_handler' ] );
77 add_action( 'wp_ajax_nopriv_give_get_donor_comments', [ $this, 'ajax_handler' ] );
78
79 }
80
81
82 /**
83 * Displays donors in a grid layout.
84 *
85 * @since 4.3.1 remove redundant _give_redirect_form_id() function.
86 * @since 3.7.0 Sanitize attributes
87 * @since 2.27.0 Moved AJAX nonce verification to ajax_handler method.
88 * @since 2.2.0
89 *
90 * @param array $atts {
91 * Optional. Attributes of the donor wall shortcode.
92 *
93 * @type int $donors_per_page Number of donors per page. Default '20'.
94 * @type int $form_id The donation form to filter donors by. Default is all forms (no filter).
95 * @type bool $paged Whether to paginate donors. Default 'true'.
96 * @type string $ids A comma-separated list of donor IDs to display. Default empty.
97 * @type string $columns Maximum columns to display. Default 'best-fit'.
98 * Accepts 'best-fit', '1', '2', '3', '4'.
99 * @type bool $show_avatar Whether to display the donor's gravatar image if available. Default 'true'.
100 * @type bool $show_name Whether to display the donor's full name, first and last. Default 'true'.
101 * @type bool $show_company_name Whether to display the donor's company name. Default 'false'.
102 * @type bool $show_total Whether to display the donor's donation amount. Default 'true'.
103 * @type bool $show_comments Whether to display the donor's comment if they left one. Default 'true'.
104 * @type int $comment_length The number of words to display for the comments before a "Read more" field
105 * @type int $only_comments Whether to display the donors only with comment. Default 'false'.
106 * @type bool $show_time Whether to display date of the last donation. Default 'true'.
107 *
108 * @type string $readmore_text Link label for modal in which donor can read full comment.
109 * @type string $loadmore_text Button label which will load more donor comments.
110 * @type int $avatar_size Avatar image size in pixels without the "px". Default "75"
111 * @type string $orderby The order in which you want the donations to appear.
112 * Currently we are using this attribute internally and, it will sort donations by created date.
113 * @type string $order The order in which you want the donors to appear. Accepts "ASC". "DESC".
114 *
115 * }
116 * @return string|bool The markup of the form grid or false.
117 */
118 public function render_shortcode( $atts ) {
119 $atts = give_clean($atts);
120
121 $give_settings = give_get_settings();
122
123 $atts = $this->parse_atts( $atts );
124
125 $donations = $this->get_donation_data( $atts );
126 $html = '';
127
128 if ( $donations ) {
129
130 ob_start();
131
132 foreach ( $donations as $donation ) {
133 $donor = new Give_Donor($donation['_give_payment_donor_id']);
134 // Give/templates/shortcode-donor-wall.php.
135 give_get_template(
136 'shortcode-donor-wall',
137 [
138 $donation,
139 $give_settings,
140 $atts,
141 $donor
142 ]
143 );
144 }
145
146 $html = ob_get_clean();
147
148 // Return only donor html.
149 if (
150 isset( $atts['only_donor_html'] )
151 && wp_doing_ajax()
152 && $atts['only_donor_html']
153 ) {
154 return $html;
155 }
156 }
157
158 $temp_atts = $atts;
159 $temp_atts['paged'] = $atts['paged'] + 1;
160
161 $more_btn_html = sprintf(
162 '<input type="hidden" class="give-donor-wall-shortcode-attrs" data-shortcode="%s" data-nonce="%s">',
163 rawurlencode( http_build_query( $atts ) ),
164 wp_create_nonce( 'givewp-donor-wall-more' )
165 );
166
167 if ( $this->has_donations( $temp_atts ) ) {
168 $more_btn_html .= sprintf(
169 '<button class="give-donor__load_more give-button-with-loader"><span class="give-loading-animation"></span>%1$s</button>',
170 $atts['loadmore_text']
171 );
172 }
173
174 $html = $html
175 ? sprintf(
176 '<div class="give-wrap give-grid-ie-utility"><div class="give-grid give-grid--%1$s">%2$s</div>%3$s</div>',
177 esc_attr( $atts['columns'] ),
178 $html,
179 $more_btn_html
180 )
181 : '';
182
183 return $html;
184 }
185
186 /**
187 * Parse shortcode attributes
188 *
189 * @since 2.30.0
190 * @since 2.2.0
191 * @access public
192 *
193 * @param array $atts Shortcode attributes.
194 *
195 * @return array
196 */
197 public function parse_atts( $atts ) {
198 $atts = shortcode_atts(
199 [
200 'donors_per_page' => 12,
201 'form_id' => 0,
202 'paged' => 1,
203 'ids' => '',
204 'cats' => '',
205 'tags' => '',
206 'columns' => '3',
207 'anonymous' => true,
208 'show_avatar' => true,
209 'show_name' => true,
210 'show_company_name' => false,
211 'show_form' => false,
212 'show_total' => true,
213 'show_comments' => true,
214 'show_tributes' => true,
215 'comment_length' => 140,
216 'only_comments' => false,
217 'readmore_text' => esc_html__( 'Read more', 'give' ),
218 'loadmore_text' => esc_html__( 'Load more', 'give' ),
219 'avatar_size' => 75,
220 'color' => "#219653",
221 'orderby' => 'post_date',
222 'order' => 'DESC',
223 'hide_empty' => true, // Deprecated in 2.3.0
224 'only_donor_html' => false, // Only for internal use.,
225 'show_time' => true,
226 ],
227 $atts,
228 'give_donor_wall'
229 );
230
231 // Validate boolean attributes.
232 $boolean_attributes = [
233 'anonymous',
234 'show_avatar',
235 'show_name',
236 'show_company_name',
237 'show_total',
238 'show_comments',
239 'show_tributes',
240 'hide_empty',
241 'only_comments',
242 'only_donor_html',
243 'show_time'
244 ];
245
246 foreach ( $boolean_attributes as $att ) {
247 // Convert numeric to boolean.
248 // It will prevent condition check against boolean value.
249 if ( is_numeric( $atts[ $att ] ) ) {
250 $atts[ $att ] = (bool) $atts[ $att ];
251 }
252
253 $atts[ $att ] = filter_var( $atts[ $att ], FILTER_VALIDATE_BOOLEAN );
254 }
255
256 // Validate numeric attributes.
257 $numeric_attributes = [
258 'donors_per_page',
259 'paged',
260 'comment_length',
261 'avatar_size',
262 ];
263
264 foreach ( $numeric_attributes as $att ) {
265 // It will prevent condition check against numeric value.
266 $atts[ $att ] = absint( $atts[ $att ] );
267 }
268
269 // Validate comma separated numeric attributes and keep original data format ( comma separated string).
270 if ( ! empty( $atts['ids'] ) ) {
271 $atts['ids'] = implode( ',', $this->split_string($atts['ids'], 'absint') );
272 }
273
274 // Validate Form IDs
275 if ( ! empty( $atts['form_id'] ) ) {
276 $atts['form_id'] = implode( ',', $this->split_string($atts['form_id'], 'absint') );
277 }
278
279 // Donation form categories
280 if ( ! empty( $atts['cats'] ) ) {
281 $atts['cats'] = $this->split_string($atts['cats']);
282 }
283
284 // Donation form tags
285 if ( ! empty( $atts['tags'] ) ) {
286 $atts['tags'] = $this->split_string($atts['tags']);
287 }
288
289 return $atts;
290 }
291
292 /**
293 * Get donors
294 *
295 * @since 2.2.0
296 * @access public
297 *
298 * @param array $donor_query Donor query.
299 *
300 * @return array
301 */
302 public function get_donors( $donor_query ) {
303 $donor_query = new Give_Donors_Query( $donor_query );
304
305 return $donor_query->get_donors();
306 }
307
308
309 /**
310 * This function should return donor comment for ajax request.
311 *
312 * @since 2.27.0 Check nonce for AJAX request to prevent scrapping, see https://github.com/impress-org/givewp/issues/6374.
313 * @since 2.2.0
314 * @access public
315 */
316 public function ajax_handler() {
317 $shortcode_atts = array_map( 'give_clean', wp_parse_args( rawurldecode( $_POST['data'] ) ) ); // @codingStandardsIgnoreLine
318
319 // Get next page donor comments.
320 $shortcode_atts['paged'] = $shortcode_atts['paged'] + 1;
321 $shortcode_atts['only_donor_html'] = true;
322
323 check_ajax_referer( 'givewp-donor-wall-more', 'nonce' );
324
325 $donors_comment_html = $this->render_shortcode( $shortcode_atts );
326
327 // Check if donor comment remaining.
328 $temp_atts = $shortcode_atts;
329 $temp_atts['paged'] = $shortcode_atts['paged'] + 1;
330 $has_donors = $this->has_donations( $temp_atts ) ? 1 : 0;
331
332 // Remove internal shortcode param.
333 unset( $shortcode_atts['only_donor_html'] );
334
335 wp_send_json(
336 [
337 'shortcode' => rawurlencode( http_build_query( $shortcode_atts ) ),
338 'html' => $donors_comment_html,
339 'remaining' => $has_donors,
340 ]
341 );
342 }
343
344 /**
345 * Get query params
346 *
347 * @since 2.24.1
348 * @since 2.3.0
349 *
350 * @param array $atts
351 *
352 * @return array
353 */
354 private function get_query_param( $atts = [] ) {
355 $valid_order = [ 'ASC', 'DESC' ];
356 $valid_orderby = [ 'post_date', 'donation_amount' ];
357
358 $query_atts = [];
359
360 $query_atts['order'] = in_array( $atts['order'], $valid_order ) ? $atts['order'] : 'DESC';
361 $query_atts['orderby'] = in_array( $atts['orderby'], $valid_orderby ) ? $atts['orderby'] : 'post_date';
362 $query_atts['limit'] = absint( $atts['donors_per_page'] );
363 $query_atts['offset'] = absint( $atts['donors_per_page'] * ( $atts['paged'] - 1 ) );
364 $query_atts['form_id'] = implode( '\',\'', array_map( 'absint', explode( ',', $atts['form_id'] ) ) );
365 $query_atts['ids'] = implode( '\',\'', array_map( 'absint', explode( ',', $atts['ids'] ) ) );
366 $query_atts['cats'] = $atts['cats'];
367 $query_atts['tags'] = $atts['tags'];
368 $query_atts['only_comments'] = ( true === $atts['only_comments'] );
369 $query_atts['anonymous'] = ( true === $atts['anonymous'] );
370
371
372
373 return $query_atts;
374 }
375
376 /**
377 * Get donation data.
378 *
379 * @since 2.27.0 Change to read comment from donations meta table
380 * @since 2.3.0
381 *
382 * @param array $atts
383 *
384 * @return array
385 */
386 private function get_donation_data( $atts = [] ) {
387 global $wpdb;
388
389 // Bailout if donation does not exist.
390 if ( ! ( $donation_ids = $this->get_donations( $atts ) ) ) {
391 return [];
392 }
393
394 $donation_ids = ! empty( $donation_ids )
395 ? '\'' . implode( '\',\'', $donation_ids ) . '\''
396 : '';
397
398 // Backward compatibility
399 $donation_id_col = Give()->payment_meta->get_meta_type() . '_id';
400
401 $sql = "SELECT m1.*, p1.post_date as donation_date FROM {$wpdb->donationmeta} as m1
402 INNER JOIN {$wpdb->posts} as p1 ON (m1.{$donation_id_col}=p1.ID)
403 WHERE m1.{$donation_id_col} IN ( {$donation_ids} )
404 ORDER BY FIELD( p1.ID, {$donation_ids} )
405 ";
406
407 $results = (array) $wpdb->get_results( $sql );
408
409 if ( ! empty( $results ) ) {
410 $temp = [];
411
412 /* @var stdClass $result */
413 foreach ( $results as $result ) {
414 $temp[ $result->{$donation_id_col} ][ $result->meta_key ] = maybe_unserialize( $result->meta_value );
415
416 // Set donation date.
417 if ( empty( $temp[ $result->{$donation_id_col} ]['donation_date'] ) ) {
418 $temp[ $result->{$donation_id_col} ]['donation_date'] = $result->donation_date;
419 }
420 }
421
422 if ( ! empty( $temp ) ) {
423 foreach ( $temp as $donation_id => $donation_data ) {
424 $temp[ $donation_id ]['donation_id'] = $donation_id;
425
426 $temp[ $donation_id ]['name_initial'] = give_get_name_initial(
427 [
428 'firstname' => $donation_data['_give_donor_billing_first_name'],
429 'lastname' => $donation_data['_give_donor_billing_last_name'],
430 ]
431 );
432
433 $temp[$donation_id]['donor_comment'] = give_get_payment_meta(
434 $donation_id,
435 DonationMetaKeys::COMMENT
436 );
437 }
438 }
439
440 $results = ! empty( $temp ) ? $temp : [];
441 }
442
443 return $results;
444 }
445
446 /**
447 * Get donation list for specific query
448 *
449 * @since 3.17.2 fix - filter by only_comments attr
450 * @since 2.3.0
451 *
452 * @param array $atts
453 *
454 * @return array
455 */
456 private function get_donations( $atts = [] ) {
457 global $wpdb;
458
459 // Backward compatibility
460 $donation_id_col = Give()->payment_meta->get_meta_type() . '_id';
461
462 $query_params = $this->get_query_param( $atts );
463
464 $sql = "SELECT p1.ID FROM {$wpdb->posts} as p1";
465 $where = " WHERE p1.post_status IN ('publish') AND p1.post_type = 'give_payment'";
466
467 // exclude donation with zero amount from result.
468 $sql .= " INNER JOIN {$wpdb->donationmeta} as m1 ON (p1.ID = m1.{$donation_id_col})";
469 $where .= " AND m1.meta_key='_give_payment_total' AND m1.meta_value>0";
470
471 if ( $query_params['form_id'] ) {
472 $sql .= " INNER JOIN {$wpdb->donationmeta} as m2 ON (p1.ID = m2.{$donation_id_col})";
473 $where .= " AND m2.meta_key='_give_payment_form_id' AND m2.meta_value IN ('{$query_params['form_id']}')";
474 }
475
476 // Get donations only from specific donors.
477 if ( $query_params['ids'] ) {
478 $sql .= " INNER JOIN {$wpdb->donationmeta} as m3 ON (p1.ID = m3.{$donation_id_col})";
479 $where .= " AND m3.meta_key='_give_payment_donor_id' AND m3.meta_value IN ('{$query_params['ids']}')";
480 }
481
482 // exclude donations which does not has donor comment.
483 if ( $query_params['only_comments'] ) {
484 $sql .= " INNER JOIN {$wpdb->donationmeta} as m4 ON (p1.ID = m4.{$donation_id_col})";
485 $where .= " AND m4.meta_key='_give_donation_comment'";
486 }
487
488 // exclude anonymous donation form query based on query parameters.
489 if (
490 ! $query_params['anonymous']
491 || $query_params['only_comments']
492 ) {
493 $where .= " AND p1.ID NOT IN ( SELECT DISTINCT({$donation_id_col}) FROM {$wpdb->donationmeta} WHERE meta_key='_give_anonymous_donation' AND meta_value='1')";
494 }
495
496 // Handle Taxonomy
497 $args = [
498 'post_type' => 'give_forms',
499 'posts_per_page' => -1,
500 'fields' => 'ids',
501 'tax_query' => [],
502 ];
503
504 // Categories
505 if ( is_array($atts['cats'])) {
506 $args['tax_query']['conditions'] = ['relation' => 'OR'];
507
508 foreach ($atts['cats'] as $category) {
509 $args['tax_query']['conditions'][] = [
510 'operator' => 'IN',
511 'taxonomy' => 'give_forms_category',
512 'field' => 'slug',
513 'terms' => $category,
514 ];
515 }
516 }
517
518 // Tags
519 if ( is_array($atts['tags'])) {
520 if (empty($args['tax_query'])) {
521 $args['tax_query']['conditions'] = ['relation' => 'OR'];
522 }
523
524 foreach($atts['tags'] as $tag) {
525 $args['tax_query']['conditions'][] = [
526 'operator' => 'IN',
527 'taxonomy' => 'give_forms_tag',
528 'field' => 'slug',
529 'terms' => $tag,
530 ];
531 }
532 }
533
534 if ( ! empty( $args['tax_query'] ) ) {
535 $query = new WP_Query( $args );
536
537 if ( ! empty($query->posts) ) {
538 $form_ids = implode("','", $query->posts );
539 $sql .= " INNER JOIN {$wpdb->donationmeta} as m4 ON (p1.ID = m4.{$donation_id_col})";
540 $where .= " AND m4.meta_key='_give_payment_form_id' AND m4.meta_value IN ('{$form_ids}')";
541 }
542 }
543
544 // order by query based on parameter.
545 if ( 'donation_amount' === $query_params['orderby'] ) {
546 $order = " ORDER BY m1.meta_value+0 {$query_params['order']}";
547 } else {
548 $order = " ORDER BY p1.{$query_params['orderby']} {$query_params['order']}, p1.ID {$query_params['order']}";
549 }
550
551 $limit = " LIMIT {$query_params['limit']}";
552 $offset = " OFFSET {$query_params['offset']}";
553
554 $sql .= $where . $order . $limit . $offset;
555
556 return $wpdb->get_col( $sql );
557 }
558
559 /**
560 * Get donor comments
561 *
562 * @since 2.3.0
563 *
564 * @param array $donations_data
565 *
566 * @return array
567 */
568 private function get_donor_comments( $donations_data = [] ) {
569 global $wpdb;
570 $comments = [];
571
572 // Bailout.
573 if ( empty( $donations_data ) ) {
574 return $comments;
575 }
576
577 // Backward compatibility.
578 if (
579 ! give_has_upgrade_completed( 'v230_move_donor_note' )
580 || ! give_has_upgrade_completed( 'v230_move_donation_note' )
581 ) {
582 foreach ( $donations_data as $id => $data ) {
583 $comment = give_get_donor_donation_comment( $id, $data['_give_payment_donor_id'] );
584 $comments[ $id ] = ! empty( $comment ) ? $comment->comment_content : '';
585 }
586
587 return $comments;
588 }
589
590 $sql = "SELECT c1.comment_parent as donation_id, c1.comment_content as comment FROM {$wpdb->give_comments} as c1";
591 $sql .= " INNER JOIN {$wpdb->give_commentmeta} as cm1 ON (c1.comment_ID=cm1.give_comment_id)";
592 $where = [];
593
594 foreach ( $donations_data as $id => $data ) {
595 // Do not fetch comment for anonymous donation.
596 if ( ! empty( $data['_give_anonymous_donation'] ) ) {
597 continue;
598 }
599
600 $where[] = "(c1.comment_parent={$id} AND cm1.meta_key='_give_donor_id' AND cm1.meta_value={$data['_give_payment_donor_id']})";
601 }
602
603 $where = ' WHERE ' . implode( ' OR ', $where );
604 $where .= " AND c1.comment_type='donor_donation'";
605
606 $sql = $sql . $where;
607
608 $comments = (array) $wpdb->get_results( $sql );
609
610 if ( ! empty( $comments ) ) {
611 $comments = array_combine(
612 wp_list_pluck( $comments, 'donation_id' ),
613 wp_list_pluck( $comments, 'comment' )
614 );
615 }
616
617 return $comments;
618 }
619
620 /**
621 * Check if donation exist or not for specific query
622 *
623 * @since 2.3.0
624 *
625 * @param array $atts
626 *
627 * @return bool
628 */
629 private function has_donations( $atts = [] ) {
630 return (bool) $this->get_donations( $atts );
631 }
632
633 /**
634 * @since 2.20.0
635 *
636 * @param string $string
637 * @param null|callable $filter
638 * @param string $separator
639 *
640 * @return array
641 */
642 private function split_string($string, $filter = null, $separator = ',') {
643 if ( false === strpos( $string, $separator ) ) {
644 $string = trim( $string );
645
646 if (is_callable($filter)) {
647 $string = $filter($string);
648 }
649
650 return [$string];
651 }
652
653 return array_filter(
654 array_map(
655 static function( $value ) use ($filter) {
656 $value = trim( $value );
657
658 if (is_callable($filter)) {
659 return $filter($value);
660 }
661 return $value;
662 },
663 explode( $separator, $string )
664 )
665 );
666 }
667 }
668
669 // Initialize shortcode.
670 Give_Donor_Wall::get_instance();
671