PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.24.0
GiveWP – Donation Plugin and Fundraising Platform v2.24.0
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 / admin / donors / class-donor-table.php
give / includes / admin / donors Last commit date
class-donor-table.php 4 years ago donor-actions.php 4 years ago donor-functions.php 6 years ago donors.php 4 years ago
class-donor-table.php
656 lines
1 <?php
2 /**
3 * Donor List Table Class.
4 *
5 * The list view under WP-Admin > Donations > Donors.
6 *
7 * @package Give
8 * @subpackage Admin/Reports
9 * @copyright Copyright (c) 2016, GiveWP
10 * @license https://opensource.org/licenses/gpl-license GNU Public License
11 * @since 1.0
12 */
13
14 // Exit if accessed directly.
15 if ( ! defined( 'ABSPATH' ) ) {
16 exit;
17 }
18
19 // Load WP_List_Table if not loaded.
20 if ( ! class_exists( 'WP_List_Table' ) ) {
21 require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
22 }
23
24 /**
25 * Give_Donor_List_Table Class.
26 *
27 * @since 1.0
28 */
29 class Give_Donor_List_Table extends WP_List_Table {
30
31 /**
32 * Number of items per page.
33 *
34 * @var int
35 * @since 1.0
36 */
37 public $per_page = 30;
38
39 /**
40 * Number of donors found.
41 *
42 * @var int
43 * @since 1.0
44 */
45 public $count = 0;
46
47 /**
48 * Total donors.
49 *
50 * @var int
51 * @since 1.0
52 */
53 public $total = 0;
54
55 /**
56 * Get things started.
57 *
58 * @since 1.0
59 * @see WP_List_Table::__construct()
60 */
61 public function __construct() {
62 // Set parent defaults.
63 parent::__construct(
64 [
65 'singular' => __( 'Donor', 'give' ), // Singular name of the listed records.
66 'plural' => __( 'Donors', 'give' ), // Plural name of the listed records.
67 'ajax' => false, // Does this table support ajax?.
68 ]
69 );
70
71 }
72 /**
73 * Add donors search filter.
74 *
75 * @since 2.4.0
76 * @return void
77 */
78 public function advanced_filters() {
79 $start_date = isset( $_GET['start-date'] ) ? strtotime( give_clean( $_GET['start-date'] ) ) : '';
80 $end_date = isset( $_GET['end-date'] ) ? strtotime( give_clean( $_GET['end-date'] ) ) : '';
81 $status = isset( $_GET['status'] ) ? give_clean( $_GET['status'] ) : '';
82 $donor = isset( $_GET['donor'] ) ? absint( $_GET['donor'] ) : '';
83 $search = $this->get_search();
84 $form_id = ! empty( $_GET['form_id'] ) ? absint( $_GET['form_id'] ) : 0;
85 ?>
86 <div id="give-donor-filters" class="give-filters">
87 <div class="give-donor-search-box">
88 <input type="text" id="give-donors-search-input" placeholder="<?php _e( 'Name, Email, or Donor ID', 'give' ); ?>" name="s" value="<?php echo $search; ?>">
89 <?php
90 submit_button(
91 __( 'Search', 'give' ),
92 'button',
93 false,
94 false,
95 [
96 'ID' => 'donor-search-submit',
97 ]
98 );
99 ?>
100 </div>
101 <div class="give-filter give-filter-half">
102 <label for="start-date"
103 class="give-start-date-label"><?php _e( 'Start Date', 'give' ); ?></label>
104 <input type="text"
105 id="start-date"
106 name="start-date"
107 class="give_datepicker"
108 autocomplete="off"
109 value="<?php echo $start_date ? date_i18n( give_date_format(), $start_date ) : ''; ?>"
110 data-standard-date="<?php echo $start_date ? date( 'Y-m-d', $start_date ) : $start_date; ?>"
111 placeholder="<?php _e( 'Start Date', 'give' ); ?>"
112 />
113 </div>
114 <div class="give-filter give-filter-half">
115 <label for="end-date" class="give-end-date-label"><?php _e( 'End Date', 'give' ); ?></label>
116 <input type="text"
117 id="end-date"
118 name="end-date"
119 class="give_datepicker"
120 autocomplete="off"
121 value="<?php echo $end_date ? date_i18n( give_date_format(), $end_date ) : ''; ?>"
122 data-standard-date="<?php echo $end_date ? date( 'Y-m-d', $end_date ) : $end_date; ?>"
123 placeholder="<?php _e( 'End Date', 'give' ); ?>"
124 />
125 </div>
126 <div id="give-payment-form-filter" class="give-filter">
127 <label for="give-donation-forms-filter"
128 class="give-donation-forms-filter-label"><?php _e( 'Form', 'give' ); ?></label>
129 <?php
130 // Filter Donations by Donation Forms.
131 echo Give()->html->forms_dropdown(
132 [
133 'name' => 'form_id',
134 'id' => 'give-donation-forms-filter',
135 'class' => 'give-donation-forms-filter',
136 'selected' => $form_id, // Make sure to have $form_id set to 0, if there is no selection.
137 'chosen' => true,
138 'number' => 30,
139 ]
140 );
141 ?>
142 </div>
143
144 <?php
145 /**
146 * Action to add hidden fields and HTML in donor search.
147 *
148 * @since 2.4.0
149 */
150 do_action( 'give_donor_table_advanced_filters' );
151
152 if ( ! empty( $status ) ) {
153 echo sprintf( '<input type="hidden" name="status" value="%s"/>', esc_attr( $status ) );
154 }
155
156 if ( ! empty( $donor ) ) {
157 echo sprintf( '<input type="hidden" name="donor" value="%s"/>', absint( $donor ) );
158 }
159 ?>
160
161 <div class="give-filter">
162 <?php submit_button( __( 'Apply', 'give' ), 'secondary', '', false ); ?>
163 <?php
164 // Clear active filters button.
165 if ( ! empty( $start_date ) || ! empty( $end_date ) || ! empty( $donor ) || ! empty( $search ) || ! empty( $status ) || ! empty( $form_id ) ) :
166 ?>
167 <a href="<?php echo admin_url( 'edit.php?post_type=give_forms&page=give-donors' ); ?>"
168 class="button give-clear-filters-button"><?php _e( 'Clear Filters', 'give' ); ?></a>
169 <?php endif; ?>
170 </div>
171 </div>
172
173 <?php
174 }
175
176 /**
177 * This function renders most of the columns in the list table.
178 *
179 * @param array $donor Contains all the data of the donors.
180 * @param string $column_name The name of the column.
181 *
182 * @access public
183 * @since 1.0
184 *
185 * @return string Column Name.
186 */
187 public function column_default( $donor, $column_name ) {
188
189 switch ( $column_name ) {
190
191 case 'num_donations':
192 $value = sprintf(
193 '<a href="%s">%s</a>',
194 admin_url( 'edit.php?post_type=give_forms&page=give-payment-history&donor=' . absint( $donor['id'] ) ),
195 esc_html( $donor['num_donations'] )
196 );
197 break;
198
199 case 'amount_spent':
200 $value = give_currency_filter( give_format_amount( $donor[ $column_name ], [ 'sanitize' => false ] ) );
201 break;
202
203 case 'date_created':
204 $value = date_i18n( give_date_format(), strtotime( $donor['date_created'] ) );
205 break;
206
207 default:
208 $value = isset( $donor[ $column_name ] ) ? $donor[ $column_name ] : null;
209 break;
210 }
211
212 return apply_filters( "give_donors_column_{$column_name}", $value, $donor['id'] );
213
214 }
215
216 /**
217 * For CheckBox Column
218 *
219 * @param array $donor Donor Data.
220 *
221 * @access public
222 * @since 1.8.16
223 *
224 * @return string
225 */
226 public function column_cb( $donor ) {
227 return sprintf(
228 '<input class="donor-selector" type="checkbox" name="donor[]" value="%1$d" data-name="%2$s" />',
229 $donor['id'],
230 esc_attr( $donor['name'] )
231 );
232 }
233
234 /**
235 * Column name.
236 *
237 * @param array $donor Donor Data.
238 *
239 * @access public
240 * @since 1.0
241 *
242 * @return string
243 */
244 public function column_name( $donor ) {
245
246 // Get donor's initials for non-gravatars
247 $title_prefix = Give()->donor_meta->get_meta( $donor['id'], '_give_donor_title_prefix', true );
248 $donor_name_without_prefix = trim( str_replace( $title_prefix, '', $donor['name'] ) );
249 $donor_name_array = explode( ' ', $donor_name_without_prefix );
250 $donor_name_args['firstname'] = ! empty( $donor_name_array[0] ) ? $donor_name_array[0] : '';
251 $donor_name_args['lastname'] = ! empty( $donor_name_array[1] ) ? $donor_name_array[1] : '';
252 $donor_name_initial = give_get_name_initial( $donor_name_args );
253
254 $donation_gravatar_image = sprintf(
255 '<span class="give-donor__image give-donor-admin-avatar" data-donor_email="%1$s" data-has-valid-gravatar="%2$s">%3$s</span>',
256 md5( strtolower( trim( $donor['email'] ) ) ),
257 absint( give_validate_gravatar( $donor['email'] ) ),
258 esc_attr( $donor_name_initial )
259 );
260
261 $name = ! empty( $donor['name'] )
262 ? sprintf(
263 '%1$s<span class="give-donor-name-text">%2$s</span>',
264 $donation_gravatar_image,
265 esc_attr( $donor['name'] )
266 )
267 : sprintf(
268 '<em>%1$s</em>',
269 __( 'Unnamed Donor', 'give' )
270 );
271
272 $view_url = admin_url( 'edit.php?post_type=give_forms&page=give-donors&view=overview&id=' . $donor['id'] );
273 $actions = $this->get_row_actions( $donor );
274
275 return sprintf(
276 '<a href="%1$s" class="give-donor-name">%2$s</a>%3$s',
277 esc_url( $view_url ),
278 $name,
279 $this->row_actions( $actions )
280 );
281 }
282
283 /**
284 * Retrieve the table columns.
285 *
286 * @access public
287 * @since 1.0
288 *
289 * @return array $columns Array of all the list table columns.
290 */
291 public function get_columns() {
292 $columns = [
293 'cb' => '<input type="checkbox" />', // Render a checkbox instead of text.
294 'name' => __( 'Name', 'give' ),
295 'email' => __( 'Email', 'give' ),
296 'num_donations' => __( 'Donations', 'give' ),
297 'amount_spent' => __( 'Total Donated', 'give' ),
298 'date_created' => __( 'Date Created', 'give' ),
299 ];
300
301 return apply_filters( 'give_list_donors_columns', $columns );
302
303 }
304
305 /**
306 * Get the sortable columns.
307 *
308 * @access public
309 * @since 2.1
310 * @return array Array of all the sortable columns.
311 */
312 public function get_sortable_columns() {
313
314 $columns = [
315 'date_created' => [ 'date_created', true ],
316 'name' => [ 'name', true ],
317 'num_donations' => [ 'purchase_count', false ],
318 'amount_spent' => [ 'purchase_value', false ],
319 ];
320
321 return apply_filters( 'give_list_donors_sortable_columns', $columns );
322 }
323
324 /**
325 * Retrieve row actions.
326 *
327 * @param array $donor Donor Data.
328 *
329 * @since 1.7
330 * @access public
331 *
332 * @return array An array of action links.
333 */
334 public function get_row_actions( $donor ) {
335
336 $actions = [
337 'id' => '<span class="give-donor-id">ID: ' . $donor['id'] . ' </span>',
338 'view' => sprintf( '<a href="%1$s" aria-label="%2$s">%3$s</a>', admin_url( 'edit.php?post_type=give_forms&page=give-donors&view=overview&id=' . $donor['id'] ), sprintf( esc_attr__( 'View "%s"', 'give' ), esc_attr( $donor['name'] ) ), __( 'View Donor', 'give' ) ),
339 'delete' => sprintf( '<a class="%1$s" data-id="%2$s" href="#" aria-label="%3$s">%4$s</a>', 'give-single-donor-delete', $donor['id'], sprintf( esc_attr__( 'Delete "%s"', 'give' ), esc_attr( $donor['name'] ) ), __( 'Delete', 'give' ) ),
340 ];
341
342 return apply_filters( 'give_donor_row_actions', $actions, $donor );
343
344 }
345
346 /**
347 * Retrieve the current page number.
348 *
349 * @access public
350 * @since 1.0
351 *
352 * @return int Current page number.
353 */
354 public function get_paged() {
355 return isset( $_GET['paged'] ) ? absint( $_GET['paged'] ) : 1;
356 }
357
358 /**
359 * Retrieves the search query string.
360 *
361 * @access public
362 * @since 1.0
363 *
364 * @return mixed string If search is present, false otherwise.
365 */
366 public function get_search() {
367
368 if ( ! isset( $_GET['s'] ) ) {
369 return false;
370 }
371
372 $search = esc_attr( $_GET['s'] );
373
374 return ! empty( $search ) ? urldecode( trim( $search ) ) : false;
375 }
376
377 /**
378 * Get the Bulk Actions.
379 *
380 * @access public
381 * @since 1.8.16
382 *
383 * @return array
384 */
385 public function get_bulk_actions() {
386 $actions = [
387 'delete' => __( 'Delete', 'give' ),
388 ];
389
390 return $actions;
391 }
392
393 /**
394 * Generate the table navigation above or below the table
395 *
396 * @param string $which Position to trigger i.e. Top/Bottom.
397 *
398 * @access protected
399 * @since 1.8.16
400 */
401 protected function display_tablenav( $which ) {
402 if ( 'top' === $which ) {
403 wp_nonce_field( 'bulk-donors', '_wpnonce', false );
404 }
405 ?>
406 <div class="tablenav <?php echo esc_attr( $which ); ?>">
407 <?php if ( $this->has_items() ) : ?>
408 <div class="alignleft actions bulkactions">
409 <?php $this->bulk_actions( $which ); ?>
410 </div>
411 <?php
412 endif;
413 $this->extra_tablenav( $which );
414 $this->pagination( $which );
415 ?>
416 <br class="clear"/>
417 </div>
418 <?php
419 }
420
421 /**
422 * Retrieves the donor data from db.
423 *
424 * @since 2.21.2 Add second param to "give_donors_column_query_data" filter hook.
425 * @since 1.0
426 *
427 * @return array $data The Donor data.
428 */
429 public function donor_data() {
430
431 $data = [];
432
433 // Get donor query.
434 $args = $this->get_donor_query();
435 $donors = Give()->donors->get_donors( $args );
436
437 if ( $donors ) {
438
439 foreach ( $donors as $donor ) {
440
441 $user_id = ! empty( $donor->user_id ) ? intval( $donor->user_id ) : 0;
442 $title_prefix = Give()->donor_meta->get_meta( $donor->id, '_give_donor_title_prefix', true );
443
444 // If title prefix is set, then update the donor name.
445 $donor->name = give_get_donor_name_with_title_prefixes( $title_prefix, $donor->name );
446
447 $data[] = [
448 'id' => $donor->id,
449 'user_id' => $user_id,
450 'name' => $donor->name,
451 'email' => $donor->email,
452 'num_donations' => $donor->purchase_count,
453 'amount_spent' => $donor->purchase_value,
454 'date_created' => $donor->date_created,
455 ];
456 }
457 }
458
459 return apply_filters( 'give_donors_column_query_data', $data, $donors );
460 }
461
462 /**
463 * Get donor count.
464 *
465 * @since 1.8.1
466 * @access private
467 */
468 private function get_donor_count() {
469 // Get donor query.
470 $_donor_query = $this->get_donor_query();
471
472 $_donor_query['number'] = - 1;
473 $_donor_query['offset'] = 0;
474 $_donor_query['count'] = true;
475
476 return Give()->donors->get_donors( $_donor_query );
477 }
478
479 /**
480 * Get donor query.
481 *
482 * @since 1.8.1
483 * @access public
484 *
485 * @return array
486 */
487 public function get_donor_query() {
488 $per_page = $this->per_page;
489 $paged = $this->get_paged();
490 $donor = isset( $_GET['donor'] ) ? absint( $_GET['donor'] ) : null;
491 $start_date = ! empty( $_GET['start-date'] ) ? strtotime( give_clean( $_GET['start-date'] ) ) : false;
492 $end_date = ! empty( $_GET['end-date'] ) ? strtotime( give_clean( $_GET['end-date'] ) ) : false;
493 $form_id = ! empty( $_GET['form_id'] ) ? absint( $_GET['form_id'] ) : null;
494 $offset = $this->per_page * ( $paged - 1 );
495 $search = $this->get_search();
496 $order = isset( $_GET['order'] ) ? sanitize_text_field( $_GET['order'] ) : 'DESC';
497 $orderby = isset( $_GET['orderby'] ) ? sanitize_text_field( $_GET['orderby'] ) : 'id';
498
499 $args = [
500 'output' => 'payments',
501 'number' => $per_page,
502 'offset' => $offset,
503 'page' => isset( $_GET['paged'] ) ? $_GET['paged'] : null,
504 'orderby' => $orderby,
505 'order' => $order,
506 'donor' => $donor,
507 's' => $search,
508 'start_date' => $start_date,
509 'end_date' => $end_date,
510 'give_forms' => $form_id,
511 ];
512
513 /**
514 * Filter to modify donor table argument.
515 *
516 * @since 2.4.0
517 */
518 $args = (array) apply_filters( 'give_donor_table_query', $args );
519
520 return $args;
521 }
522
523 /**
524 * Generates content for a single row of the table
525 *
526 * @param object $item The current item.
527 *
528 * @since 1.8.17
529 * @access public
530 */
531 public function single_row( $item ) {
532 echo sprintf( '<tr id="donor-%1$d" data-id="%2$d" data-name="%3$s">', $item['id'], $item['id'], esc_attr( $item['name'] ) );
533 $this->single_row_columns( $item );
534 echo '</tr>';
535 }
536
537 /**
538 * Display the final donor table
539 *
540 * @since 1.8.17
541 * @access public
542 */
543 public function display() {
544 $singular = $this->_args['singular'];
545
546 $this->display_tablenav( 'top' );
547
548 $this->screen->render_screen_reader_content( 'heading_list' );
549
550 $get_data = give_clean( $_GET ); // WPCS: input var ok, sanitization ok, CSRF ok.
551
552 $order = ! empty( $get_data['order'] ) ? $get_data['order'] : 'DESC';
553 $order_by = ! empty( $get_data['orderby'] ) ? $get_data['orderby'] : 'id';
554 ?>
555 <table class="wp-list-table <?php echo implode( ' ', $this->get_table_classes() ); ?>">
556 <thead>
557 <tr>
558 <?php $this->print_column_headers(); ?>
559 </tr>
560 </thead>
561
562 <tbody id="the-list"
563 <?php
564 if ( $singular ) {
565 echo " data-wp-lists='list:$singular'";
566 }
567 ?>
568 >
569 <tr class="hidden"></tr>
570 <tr id="give-bulk-delete"
571 class="inline-edit-row inline-edit-row-page inline-edit-page bulk-edit-row bulk-edit-row-page bulk-edit-page inline-editor"
572 style="display: none;">
573 <td colspan="6" class="colspanchange">
574
575 <fieldset class="inline-edit-col-left">
576 <legend class="inline-edit-legend"><?php esc_attr_e( 'BULK DELETE', 'give' ); ?></legend>
577 <div class="inline-edit-col">
578 <div id="bulk-titles">
579 <div id="give-bulk-donors" class="give-bulk-donors">
580
581 </div>
582 </div>
583 </fieldset>
584
585 <fieldset class="inline-edit-col-right">
586 <div class="inline-edit-col">
587 <label>
588 <input class="give-donor-delete-confirm" type="checkbox"
589 name="give-donor-delete-confirm"/>
590 <?php esc_attr_e( 'Are you sure you want to delete the selected donor(s)?', 'give' ); ?>
591 </label>
592 <label>
593 <input class="give-donor-delete-records" type="checkbox"
594 name="give-donor-delete-records"/>
595 <?php esc_attr_e( 'Delete all associated donations and records?', 'give' ); ?>
596 </label>
597 </div>
598 </fieldset>
599
600 <p class="submit inline-edit-save">
601 <input type="hidden" name="give_action" value="delete_bulk_donor"/>
602 <input type="hidden" name="orderby" value="<?php echo esc_html( $order_by ); ?>"/>
603 <input type="hidden" name="order" value="<?php echo esc_html( $order ); ?>"/>
604 <button type="button" id="give-bulk-delete-cancel"
605 class="button cancel alignleft"><?php esc_attr_e( 'Cancel', 'give' ); ?></button>
606 <input type="submit" id="give-bulk-delete-button" disabled
607 class="button button-primary alignright"
608 value="<?php esc_attr_e( 'Delete', 'give' ); ?>">
609 <br class="clear">
610 </p>
611 </td>
612 </tr>
613 <?php $this->display_rows_or_placeholder(); ?>
614 </tbody>
615
616 <tfoot>
617 <tr>
618 <?php $this->print_column_headers( false ); ?>
619 </tr>
620 </tfoot>
621
622 </table>
623 <?php
624 $this->display_tablenav( 'bottom' );
625 }
626
627 /**
628 * Setup the final data for the table.
629 *
630 * @access public
631 * @since 1.0
632 *
633 * @return void
634 */
635 public function prepare_items() {
636
637 $columns = $this->get_columns();
638 $hidden = []; // No hidden columns.
639 $sortable = $this->get_sortable_columns();
640
641 $this->_column_headers = [ $columns, $hidden, $sortable ];
642
643 $this->items = $this->donor_data();
644
645 $this->total = $this->get_donor_count();
646
647 $this->set_pagination_args(
648 [
649 'total_items' => $this->total,
650 'per_page' => $this->per_page,
651 'total_pages' => ceil( $this->total / $this->per_page ),
652 ]
653 );
654 }
655 }
656