PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.0.2
GiveWP – Donation Plugin and Fundraising Platform v2.0.2
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 8 years ago donor-actions.php 8 years ago donor-functions.php 8 years ago donors.php 8 years ago
class-donor-table.php
517 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, WordImpress
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
63 // Set parent defaults.
64 parent::__construct( 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 * Show the search field.
74 *
75 * @param string $text Label for the search box.
76 * @param string $input_id ID of the search box.
77 *
78 * @since 1.0
79 * @access public
80 *
81 * @return void
82 */
83 public function search_box( $text, $input_id ) {
84 $input_id = $input_id . '-search-input';
85
86 if ( ! empty( $_REQUEST['orderby'] ) ) {
87 echo sprintf( '<input type="hidden" name="orderby" value="%1$s" />', esc_attr( $_REQUEST['orderby'] ) );
88 }
89
90 if ( ! empty( $_REQUEST['order'] ) ) {
91 echo sprintf( '<input type="hidden" name="order" value="%1$s" />', esc_attr( $_REQUEST['order'] ) );
92 }
93 ?>
94 <p class="search-box" role="search">
95 <label class="screen-reader-text" for="<?php echo $input_id ?>"><?php echo $text; ?>:</label>
96 <input type="search" id="<?php echo $input_id ?>" name="s" value="<?php _admin_search_query(); ?>"/>
97 <?php submit_button( $text, 'button', false, false, array(
98 'ID' => 'search-submit',
99 ) ); ?>
100 </p>
101 <?php
102 }
103
104 /**
105 * This function renders most of the columns in the list table.
106 *
107 * @param array $donor Contains all the data of the donors.
108 * @param string $column_name The name of the column.
109 *
110 * @access public
111 * @since 1.0
112 *
113 * @return string Column Name.
114 */
115 public function column_default( $donor, $column_name ) {
116
117 switch ( $column_name ) {
118
119 case 'num_donations' :
120 $value = sprintf(
121 '<a href="%s">%s</a>',
122 admin_url( 'edit.php?post_type=give_forms&page=give-payment-history&donor=' . absint( $donor['id'] ) ),
123 esc_html( $donor['num_donations'] )
124 );
125 break;
126
127 case 'amount_spent' :
128 $value = give_currency_filter( give_format_amount( $donor[ $column_name ], array( 'sanitize' => false ) ) );
129 break;
130
131 case 'date_created' :
132 $value = date_i18n( give_date_format(), strtotime( $donor['date_created'] ) );
133 break;
134
135 default:
136 $value = isset( $donor[ $column_name ] ) ? $donor[ $column_name ] : null;
137 break;
138 }
139
140 return apply_filters( "give_donors_column_{$column_name}", $value, $donor['id'] );
141
142 }
143
144 /**
145 * For CheckBox Column
146 *
147 * @param array $donor Donor Data.
148 *
149 * @access public
150 * @since 1.8.16
151 *
152 * @return string
153 */
154 public function column_cb( $donor ){
155 return sprintf(
156 '<input class="donor-selector" type="checkbox" name="%1$s[]" value="%2$d" data-name="%3$s" />',
157 $this->_args['singular'],
158 $donor['id'],
159 $donor['name']
160 );
161 }
162
163 /**
164 * Column name.
165 *
166 * @param array $donor Donor Data.
167 *
168 * @access public
169 * @since 1.0
170 *
171 * @return string
172 */
173 public function column_name( $donor ) {
174 $name = '#' . $donor['id'] . ' ';
175 $name .= ! empty( $donor['name'] ) ? $donor['name'] : '<em>' . __( 'Unnamed Donor', 'give' ) . '</em>';
176 $view_url = admin_url( 'edit.php?post_type=give_forms&page=give-donors&view=overview&id=' . $donor['id'] );
177 $actions = $this->get_row_actions( $donor );
178
179 return '<a href="' . esc_url( $view_url ) . '">' . $name . '</a>' . $this->row_actions( $actions );
180 }
181
182 /**
183 * Retrieve the table columns.
184 *
185 * @access public
186 * @since 1.0
187 *
188 * @return array $columns Array of all the list table columns.
189 */
190 public function get_columns() {
191 $columns = array(
192 'cb' => '<input type="checkbox" />', // Render a checkbox instead of text.
193 'name' => __( 'Name', 'give' ),
194 'email' => __( 'Email', 'give' ),
195 'num_donations' => __( 'Donations', 'give' ),
196 'amount_spent' => __( 'Total Donated', 'give' ),
197 'date_created' => __( 'Date Created', 'give' ),
198 );
199
200 return apply_filters( 'give_list_donors_columns', $columns );
201
202 }
203
204 /**
205 * Get the sortable columns.
206 *
207 * @access public
208 * @since 2.1
209 * @return array Array of all the sortable columns.
210 */
211 public function get_sortable_columns() {
212
213 $columns = array(
214 'date_created' => array( 'date_created', true ),
215 'name' => array( 'name', true ),
216 'num_donations' => array( 'purchase_count', false ),
217 'amount_spent' => array( 'purchase_value', false ),
218 );
219
220 return apply_filters( 'give_list_donors_sortable_columns', $columns );
221 }
222
223 /**
224 * Retrieve row actions.
225 *
226 * @param array $donor Donor Data.
227 *
228 * @since 1.7
229 * @access public
230 *
231 * @return array An array of action links.
232 */
233 public function get_row_actions( $donor ) {
234
235 $actions = array(
236 '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' ), $donor['name'] ), __( 'View Donor', 'give' ) ),
237 'notes' => sprintf( '<a href="%1$s" aria-label="%2$s">%3$s</a>', admin_url( 'edit.php?post_type=give_forms&page=give-donors&view=notes&id=' . $donor['id'] ), sprintf( esc_attr__( 'Notes for "%s"', 'give' ), $donor['name'] ), __( 'Notes', 'give' ) ),
238 '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' ), $donor['name'] ), __( 'Delete', 'give' ) ),
239 );
240
241 return apply_filters( 'give_donor_row_actions', $actions, $donor );
242
243 }
244
245 /**
246 * Retrieve the current page number.
247 *
248 * @access public
249 * @since 1.0
250 *
251 * @return int Current page number.
252 */
253 public function get_paged() {
254 return isset( $_GET['paged'] ) ? absint( $_GET['paged'] ) : 1;
255 }
256
257 /**
258 * Retrieves the search query string.
259 *
260 * @access public
261 * @since 1.0
262 *
263 * @return mixed string If search is present, false otherwise.
264 */
265 public function get_search() {
266 return ! empty( $_GET['s'] ) ? urldecode( trim( $_GET['s'] ) ) : false;
267 }
268
269 /**
270 * Get the Bulk Actions.
271 *
272 * @access public
273 * @since 1.8.16
274 *
275 * @return array
276 */
277 public function get_bulk_actions() {
278 $actions = array(
279 'delete' => __( 'Delete', 'give' ),
280 );
281 return $actions;
282 }
283
284 /**
285 * Generate the table navigation above or below the table
286 *
287 * @param string $which Position to trigger i.e. Top/Bottom.
288 *
289 * @access protected
290 * @since 1.8.16
291 */
292 protected function display_tablenav( $which ) {
293 if ( 'top' === $which ) {
294 wp_nonce_field( 'bulk-' . $this->_args['plural'], '_wpnonce', false );
295 }
296 ?>
297 <div class="tablenav <?php echo esc_attr( $which ); ?>">
298 <?php if ( $this->has_items() ): ?>
299 <div class="alignleft actions bulkactions">
300 <?php $this->bulk_actions( $which ); ?>
301 </div>
302 <?php endif;
303 $this->extra_tablenav( $which );
304 $this->pagination( $which );
305 ?>
306 <br class="clear" />
307 </div>
308 <?php
309 }
310
311 /**
312 * Retrieves the donor data from db.
313 *
314 * @access public
315 * @since 1.0
316 *
317 * @return array $data The Donor data.
318 */
319 public function donor_data() {
320
321 $data = array();
322
323 // Get donor query.
324 $args = $this->get_donor_query();
325 $donors = Give()->donors->get_donors( $args );
326
327 if ( $donors ) {
328
329 foreach ( $donors as $donor ) {
330
331 $user_id = ! empty( $donor->user_id ) ? intval( $donor->user_id ) : 0;
332
333 $data[] = array(
334 'id' => $donor->id,
335 'user_id' => $user_id,
336 'name' => $donor->name,
337 'email' => $donor->email,
338 'num_donations' => $donor->purchase_count,
339 'amount_spent' => $donor->purchase_value,
340 'date_created' => $donor->date_created,
341 );
342 }
343 }
344
345 return apply_filters( 'give_donors_column_query_data', $data );
346 }
347
348 /**
349 * Get donor count.
350 *
351 * @since 1.8.1
352 * @access private
353 */
354 private function get_donor_count() {
355 // Get donor query.
356 $_donor_query = $this->get_donor_query();
357
358 $_donor_query['number'] = - 1;
359 $_donor_query['offset'] = 0;
360 $donors = Give()->donors->get_donors( $_donor_query );
361
362 return count( $donors );
363 }
364
365 /**
366 * Get donor query.
367 *
368 * @since 1.8.1
369 * @access public
370 *
371 * @return array
372 */
373 public function get_donor_query() {
374 $paged = $this->get_paged();
375 $offset = $this->per_page * ( $paged - 1 );
376 $search = $this->get_search();
377 $order = isset( $_GET['order'] ) ? sanitize_text_field( $_GET['order'] ) : 'DESC';
378 $orderby = isset( $_GET['orderby'] ) ? sanitize_text_field( $_GET['orderby'] ) : 'id';
379
380 $args = array(
381 'number' => $this->per_page,
382 'offset' => $offset,
383 'order' => $order,
384 'orderby' => $orderby,
385 );
386
387 if ( $search ) {
388 if ( is_email( $search ) ) {
389 $args['email'] = $search;
390 } elseif ( is_numeric( $search ) ) {
391 $args['id'] = $search;
392 } else {
393 $args['name'] = $search;
394 }
395 }
396
397 return $args;
398 }
399
400 /**
401 * Generates content for a single row of the table
402 *
403 * @param object $item The current item.
404 *
405 * @since 1.8.17
406 * @access public
407 */
408 public function single_row( $item ) {
409 echo sprintf( '<tr id="donor-%1$d" data-id="%2$d" data-name="%3$s">', $item['id'], $item['id'], $item['name'] );
410 $this->single_row_columns( $item );
411 echo '</tr>';
412 }
413
414 /**
415 * Display the final donor table
416 *
417 * @since 1.8.17
418 * @access public
419 */
420 public function display() {
421 $singular = $this->_args['singular'];
422
423 $this->display_tablenav( 'top' );
424
425 $this->screen->render_screen_reader_content( 'heading_list' );
426 ?>
427 <table class="wp-list-table <?php echo implode( ' ', $this->get_table_classes() ); ?>">
428 <thead>
429 <tr>
430 <?php $this->print_column_headers(); ?>
431 </tr>
432 </thead>
433
434 <tbody id="the-list"<?php
435 if ( $singular ) {
436 echo " data-wp-lists='list:$singular'";
437 } ?>>
438 <tr class="hidden"></tr>
439 <tr id="give-bulk-delete" class="inline-edit-row inline-edit-row-page inline-edit-page bulk-edit-row bulk-edit-row-page bulk-edit-page inline-editor" style="display: none;" >
440 <td colspan="6" class="colspanchange">
441
442 <fieldset class="inline-edit-col-left">
443 <legend class="inline-edit-legend"><?php _e( 'BULK DELETE', 'give' ); ?></legend>
444 <div class="inline-edit-col">
445 <div id="bulk-titles">
446 <div id="give-bulk-donors" class="give-bulk-donors">
447
448 </div>
449 </div>
450 </fieldset>
451
452 <fieldset class="inline-edit-col-right">
453 <div class="inline-edit-col">
454 <label>
455 <input id="give-delete-donor-confirm" type="checkbox" name="give-delete-donor-confirm"/>
456 <?php _e( 'Are you sure you want to delete the selected donor(s)?', 'give' ); ?>
457 </label>
458 <label>
459 <input id="give-delete-donor-records" type="checkbox" name="give-delete-donor-records"/>
460 <?php _e( 'Delete all associated donations and records?', 'give' ); ?>
461 </label>
462 </div>
463 </fieldset>
464
465 <p class="submit inline-edit-save">
466 <input type="hidden" name="give_action" value="delete_donor"/>
467 <input type="hidden" name="s" value="<?php echo ( ! empty( $_GET['s'] ) ) ? $_GET['s'] : ''; ?>"/>
468 <input type="hidden" name="orderby" value="<?php echo ( ! empty( $_GET['orderby'] ) ) ? $_GET['orderby'] : 'id'; ?>"/>
469 <input type="hidden" name="order" value="<?php echo ( ! empty( $_GET['order'] ) ) ? $_GET['order'] : 'desc'; ?>"/>
470 <button type="button" id="give-bulk-delete-cancel" class="button cancel alignleft"><?php _e( 'Cancel', 'give' ); ?></button>
471 <input type="submit" id="give-bulk-delete-button" disabled class="button button-primary alignright" value="<?php _e( 'Delete', 'give' ); ?>">
472 <br class="clear">
473 </p>
474 </td>
475 </tr>
476 <?php $this->display_rows_or_placeholder(); ?>
477 </tbody>
478
479 <tfoot>
480 <tr>
481 <?php $this->print_column_headers( false ); ?>
482 </tr>
483 </tfoot>
484
485 </table>
486 <?php
487 $this->display_tablenav( 'bottom' );
488 }
489
490 /**
491 * Setup the final data for the table.
492 *
493 * @access public
494 * @since 1.0
495 *
496 * @return void
497 */
498 public function prepare_items() {
499
500 $columns = $this->get_columns();
501 $hidden = array(); // No hidden columns.
502 $sortable = $this->get_sortable_columns();
503
504 $this->_column_headers = array( $columns, $hidden, $sortable );
505
506 $this->items = $this->donor_data();
507
508 $this->total = $this->get_donor_count();
509
510 $this->set_pagination_args( array(
511 'total_items' => $this->total,
512 'per_page' => $this->per_page,
513 'total_pages' => ceil( $this->total / $this->per_page ),
514 ) );
515 }
516 }
517