PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.7.4
GiveWP – Donation Plugin and Fundraising Platform v2.7.4
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 6 years ago donor-actions.php 6 years ago donor-functions.php 6 years ago donors.php 6 years ago
class-donor-table.php
649 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 array(
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 array(
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 array(
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 ], array( '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 = array(
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 = array(
315 'date_created' => array( 'date_created', true ),
316 'name' => array( 'name', true ),
317 'num_donations' => array( 'purchase_count', false ),
318 'amount_spent' => array( '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 = array(
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 return ! empty( $_GET['s'] ) ? urldecode( trim( $_GET['s'] ) ) : false;
368 }
369
370 /**
371 * Get the Bulk Actions.
372 *
373 * @access public
374 * @since 1.8.16
375 *
376 * @return array
377 */
378 public function get_bulk_actions() {
379 $actions = array(
380 'delete' => __( 'Delete', 'give' ),
381 );
382
383 return $actions;
384 }
385
386 /**
387 * Generate the table navigation above or below the table
388 *
389 * @param string $which Position to trigger i.e. Top/Bottom.
390 *
391 * @access protected
392 * @since 1.8.16
393 */
394 protected function display_tablenav( $which ) {
395 if ( 'top' === $which ) {
396 wp_nonce_field( 'bulk-donors', '_wpnonce', false );
397 }
398 ?>
399 <div class="tablenav <?php echo esc_attr( $which ); ?>">
400 <?php if ( $this->has_items() ) : ?>
401 <div class="alignleft actions bulkactions">
402 <?php $this->bulk_actions( $which ); ?>
403 </div>
404 <?php
405 endif;
406 $this->extra_tablenav( $which );
407 $this->pagination( $which );
408 ?>
409 <br class="clear"/>
410 </div>
411 <?php
412 }
413
414 /**
415 * Retrieves the donor data from db.
416 *
417 * @access public
418 * @since 1.0
419 *
420 * @return array $data The Donor data.
421 */
422 public function donor_data() {
423
424 $data = array();
425
426 // Get donor query.
427 $args = $this->get_donor_query();
428 $donors = Give()->donors->get_donors( $args );
429
430 if ( $donors ) {
431
432 foreach ( $donors as $donor ) {
433
434 $user_id = ! empty( $donor->user_id ) ? intval( $donor->user_id ) : 0;
435 $title_prefix = Give()->donor_meta->get_meta( $donor->id, '_give_donor_title_prefix', true );
436
437 // If title prefix is set, then update the donor name.
438 $donor->name = give_get_donor_name_with_title_prefixes( $title_prefix, $donor->name );
439
440 $data[] = array(
441 'id' => $donor->id,
442 'user_id' => $user_id,
443 'name' => $donor->name,
444 'email' => $donor->email,
445 'num_donations' => $donor->purchase_count,
446 'amount_spent' => $donor->purchase_value,
447 'date_created' => $donor->date_created,
448 );
449 }
450 }
451
452 return apply_filters( 'give_donors_column_query_data', $data );
453 }
454
455 /**
456 * Get donor count.
457 *
458 * @since 1.8.1
459 * @access private
460 */
461 private function get_donor_count() {
462 // Get donor query.
463 $_donor_query = $this->get_donor_query();
464
465 $_donor_query['number'] = - 1;
466 $_donor_query['offset'] = 0;
467 $_donor_query['count'] = true;
468
469 return Give()->donors->get_donors( $_donor_query );
470 }
471
472 /**
473 * Get donor query.
474 *
475 * @since 1.8.1
476 * @access public
477 *
478 * @return array
479 */
480 public function get_donor_query() {
481 $per_page = $this->per_page;
482 $paged = $this->get_paged();
483 $donor = isset( $_GET['donor'] ) ? $_GET['donor'] : null;
484 $start_date = ! empty( $_GET['start-date'] ) ? strtotime( give_clean( $_GET['start-date'] ) ) : false;
485 $end_date = ! empty( $_GET['end-date'] ) ? strtotime( give_clean( $_GET['end-date'] ) ) : false;
486 $form_id = ! empty( $_GET['form_id'] ) ? absint( $_GET['form_id'] ) : null;
487 $offset = $this->per_page * ( $paged - 1 );
488 $search = $this->get_search();
489 $order = isset( $_GET['order'] ) ? sanitize_text_field( $_GET['order'] ) : 'DESC';
490 $orderby = isset( $_GET['orderby'] ) ? sanitize_text_field( $_GET['orderby'] ) : 'id';
491
492 $args = array(
493 'output' => 'payments',
494 'number' => $per_page,
495 'offset' => $offset,
496 'page' => isset( $_GET['paged'] ) ? $_GET['paged'] : null,
497 'orderby' => $orderby,
498 'order' => $order,
499 'donor' => $donor,
500 's' => $search,
501 'start_date' => $start_date,
502 'end_date' => $end_date,
503 'give_forms' => $form_id,
504 );
505
506 /**
507 * Filter to modify donor table argument.
508 *
509 * @since 2.4.0
510 */
511 $args = (array) apply_filters( 'give_donor_table_query', $args );
512
513 return $args;
514 }
515
516 /**
517 * Generates content for a single row of the table
518 *
519 * @param object $item The current item.
520 *
521 * @since 1.8.17
522 * @access public
523 */
524 public function single_row( $item ) {
525 echo sprintf( '<tr id="donor-%1$d" data-id="%2$d" data-name="%3$s">', $item['id'], $item['id'], esc_attr( $item['name'] ) );
526 $this->single_row_columns( $item );
527 echo '</tr>';
528 }
529
530 /**
531 * Display the final donor table
532 *
533 * @since 1.8.17
534 * @access public
535 */
536 public function display() {
537 $singular = $this->_args['singular'];
538
539 $this->display_tablenav( 'top' );
540
541 $this->screen->render_screen_reader_content( 'heading_list' );
542
543 $get_data = give_clean( $_GET ); // WPCS: input var ok, sanitization ok, CSRF ok.
544
545 $order = ! empty( $get_data['order'] ) ? $get_data['order'] : 'DESC';
546 $order_by = ! empty( $get_data['orderby'] ) ? $get_data['orderby'] : 'id';
547 ?>
548 <table class="wp-list-table <?php echo implode( ' ', $this->get_table_classes() ); ?>">
549 <thead>
550 <tr>
551 <?php $this->print_column_headers(); ?>
552 </tr>
553 </thead>
554
555 <tbody id="the-list"
556 <?php
557 if ( $singular ) {
558 echo " data-wp-lists='list:$singular'";
559 }
560 ?>
561 >
562 <tr class="hidden"></tr>
563 <tr id="give-bulk-delete"
564 class="inline-edit-row inline-edit-row-page inline-edit-page bulk-edit-row bulk-edit-row-page bulk-edit-page inline-editor"
565 style="display: none;">
566 <td colspan="6" class="colspanchange">
567
568 <fieldset class="inline-edit-col-left">
569 <legend class="inline-edit-legend"><?php esc_attr_e( 'BULK DELETE', 'give' ); ?></legend>
570 <div class="inline-edit-col">
571 <div id="bulk-titles">
572 <div id="give-bulk-donors" class="give-bulk-donors">
573
574 </div>
575 </div>
576 </fieldset>
577
578 <fieldset class="inline-edit-col-right">
579 <div class="inline-edit-col">
580 <label>
581 <input class="give-donor-delete-confirm" type="checkbox"
582 name="give-donor-delete-confirm"/>
583 <?php esc_attr_e( 'Are you sure you want to delete the selected donor(s)?', 'give' ); ?>
584 </label>
585 <label>
586 <input class="give-donor-delete-records" type="checkbox"
587 name="give-donor-delete-records"/>
588 <?php esc_attr_e( 'Delete all associated donations and records?', 'give' ); ?>
589 </label>
590 </div>
591 </fieldset>
592
593 <p class="submit inline-edit-save">
594 <input type="hidden" name="give_action" value="delete_bulk_donor"/>
595 <input type="hidden" name="orderby" value="<?php echo esc_html( $order_by ); ?>"/>
596 <input type="hidden" name="order" value="<?php echo esc_html( $order ); ?>"/>
597 <button type="button" id="give-bulk-delete-cancel"
598 class="button cancel alignleft"><?php esc_attr_e( 'Cancel', 'give' ); ?></button>
599 <input type="submit" id="give-bulk-delete-button" disabled
600 class="button button-primary alignright"
601 value="<?php esc_attr_e( 'Delete', 'give' ); ?>">
602 <br class="clear">
603 </p>
604 </td>
605 </tr>
606 <?php $this->display_rows_or_placeholder(); ?>
607 </tbody>
608
609 <tfoot>
610 <tr>
611 <?php $this->print_column_headers( false ); ?>
612 </tr>
613 </tfoot>
614
615 </table>
616 <?php
617 $this->display_tablenav( 'bottom' );
618 }
619
620 /**
621 * Setup the final data for the table.
622 *
623 * @access public
624 * @since 1.0
625 *
626 * @return void
627 */
628 public function prepare_items() {
629
630 $columns = $this->get_columns();
631 $hidden = array(); // No hidden columns.
632 $sortable = $this->get_sortable_columns();
633
634 $this->_column_headers = array( $columns, $hidden, $sortable );
635
636 $this->items = $this->donor_data();
637
638 $this->total = $this->get_donor_count();
639
640 $this->set_pagination_args(
641 array(
642 'total_items' => $this->total,
643 'per_page' => $this->per_page,
644 'total_pages' => ceil( $this->total / $this->per_page ),
645 )
646 );
647 }
648 }
649