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