PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.1.2
GiveWP – Donation Plugin and Fundraising Platform v2.1.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
516 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 = ! empty( $donor['name'] ) ? $donor['name'] : '<em>' . __( 'Unnamed Donor', 'give' ) . '</em>';
175 $view_url = admin_url( 'edit.php?post_type=give_forms&page=give-donors&view=overview&id=' . $donor['id'] );
176 $actions = $this->get_row_actions( $donor );
177
178 return '<a href="' . esc_url( $view_url ) . '">' . $name . '</a>' . $this->row_actions( $actions );
179 }
180
181 /**
182 * Retrieve the table columns.
183 *
184 * @access public
185 * @since 1.0
186 *
187 * @return array $columns Array of all the list table columns.
188 */
189 public function get_columns() {
190 $columns = array(
191 'cb' => '<input type="checkbox" />', // Render a checkbox instead of text.
192 'name' => __( 'Name', 'give' ),
193 'email' => __( 'Email', 'give' ),
194 'num_donations' => __( 'Donations', 'give' ),
195 'amount_spent' => __( 'Total Donated', 'give' ),
196 'date_created' => __( 'Date Created', 'give' ),
197 );
198
199 return apply_filters( 'give_list_donors_columns', $columns );
200
201 }
202
203 /**
204 * Get the sortable columns.
205 *
206 * @access public
207 * @since 2.1
208 * @return array Array of all the sortable columns.
209 */
210 public function get_sortable_columns() {
211
212 $columns = array(
213 'date_created' => array( 'date_created', true ),
214 'name' => array( 'name', true ),
215 'num_donations' => array( 'purchase_count', false ),
216 'amount_spent' => array( 'purchase_value', false ),
217 );
218
219 return apply_filters( 'give_list_donors_sortable_columns', $columns );
220 }
221
222 /**
223 * Retrieve row actions.
224 *
225 * @param array $donor Donor Data.
226 *
227 * @since 1.7
228 * @access public
229 *
230 * @return array An array of action links.
231 */
232 public function get_row_actions( $donor ) {
233
234 $actions = array(
235 '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' ) ),
236 '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' ) ),
237 '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' ) ),
238 );
239
240 return apply_filters( 'give_donor_row_actions', $actions, $donor );
241
242 }
243
244 /**
245 * Retrieve the current page number.
246 *
247 * @access public
248 * @since 1.0
249 *
250 * @return int Current page number.
251 */
252 public function get_paged() {
253 return isset( $_GET['paged'] ) ? absint( $_GET['paged'] ) : 1;
254 }
255
256 /**
257 * Retrieves the search query string.
258 *
259 * @access public
260 * @since 1.0
261 *
262 * @return mixed string If search is present, false otherwise.
263 */
264 public function get_search() {
265 return ! empty( $_GET['s'] ) ? urldecode( trim( $_GET['s'] ) ) : false;
266 }
267
268 /**
269 * Get the Bulk Actions.
270 *
271 * @access public
272 * @since 1.8.16
273 *
274 * @return array
275 */
276 public function get_bulk_actions() {
277 $actions = array(
278 'delete' => __( 'Delete', 'give' ),
279 );
280 return $actions;
281 }
282
283 /**
284 * Generate the table navigation above or below the table
285 *
286 * @param string $which Position to trigger i.e. Top/Bottom.
287 *
288 * @access protected
289 * @since 1.8.16
290 */
291 protected function display_tablenav( $which ) {
292 if ( 'top' === $which ) {
293 wp_nonce_field( 'bulk-' . $this->_args['plural'], '_wpnonce', false );
294 }
295 ?>
296 <div class="tablenav <?php echo esc_attr( $which ); ?>">
297 <?php if ( $this->has_items() ): ?>
298 <div class="alignleft actions bulkactions">
299 <?php $this->bulk_actions( $which ); ?>
300 </div>
301 <?php endif;
302 $this->extra_tablenav( $which );
303 $this->pagination( $which );
304 ?>
305 <br class="clear" />
306 </div>
307 <?php
308 }
309
310 /**
311 * Retrieves the donor data from db.
312 *
313 * @access public
314 * @since 1.0
315 *
316 * @return array $data The Donor data.
317 */
318 public function donor_data() {
319
320 $data = array();
321
322 // Get donor query.
323 $args = $this->get_donor_query();
324 $donors = Give()->donors->get_donors( $args );
325
326 if ( $donors ) {
327
328 foreach ( $donors as $donor ) {
329
330 $user_id = ! empty( $donor->user_id ) ? intval( $donor->user_id ) : 0;
331
332 $data[] = array(
333 'id' => $donor->id,
334 'user_id' => $user_id,
335 'name' => $donor->name,
336 'email' => $donor->email,
337 'num_donations' => $donor->purchase_count,
338 'amount_spent' => $donor->purchase_value,
339 'date_created' => $donor->date_created,
340 );
341 }
342 }
343
344 return apply_filters( 'give_donors_column_query_data', $data );
345 }
346
347 /**
348 * Get donor count.
349 *
350 * @since 1.8.1
351 * @access private
352 */
353 private function get_donor_count() {
354 // Get donor query.
355 $_donor_query = $this->get_donor_query();
356
357 $_donor_query['number'] = - 1;
358 $_donor_query['offset'] = 0;
359 $donors = Give()->donors->get_donors( $_donor_query );
360
361 return count( $donors );
362 }
363
364 /**
365 * Get donor query.
366 *
367 * @since 1.8.1
368 * @access public
369 *
370 * @return array
371 */
372 public function get_donor_query() {
373 $paged = $this->get_paged();
374 $offset = $this->per_page * ( $paged - 1 );
375 $search = $this->get_search();
376 $order = isset( $_GET['order'] ) ? sanitize_text_field( $_GET['order'] ) : 'DESC';
377 $orderby = isset( $_GET['orderby'] ) ? sanitize_text_field( $_GET['orderby'] ) : 'id';
378
379 $args = array(
380 'number' => $this->per_page,
381 'offset' => $offset,
382 'order' => $order,
383 'orderby' => $orderby,
384 );
385
386 if ( $search ) {
387 if ( is_email( $search ) ) {
388 $args['email'] = $search;
389 } elseif ( is_numeric( $search ) ) {
390 $args['id'] = $search;
391 } else {
392 $args['name'] = $search;
393 }
394 }
395
396 return $args;
397 }
398
399 /**
400 * Generates content for a single row of the table
401 *
402 * @param object $item The current item.
403 *
404 * @since 1.8.17
405 * @access public
406 */
407 public function single_row( $item ) {
408 echo sprintf( '<tr id="donor-%1$d" data-id="%2$d" data-name="%3$s">', $item['id'], $item['id'], $item['name'] );
409 $this->single_row_columns( $item );
410 echo '</tr>';
411 }
412
413 /**
414 * Display the final donor table
415 *
416 * @since 1.8.17
417 * @access public
418 */
419 public function display() {
420 $singular = $this->_args['singular'];
421
422 $this->display_tablenav( 'top' );
423
424 $this->screen->render_screen_reader_content( 'heading_list' );
425 ?>
426 <table class="wp-list-table <?php echo implode( ' ', $this->get_table_classes() ); ?>">
427 <thead>
428 <tr>
429 <?php $this->print_column_headers(); ?>
430 </tr>
431 </thead>
432
433 <tbody id="the-list"<?php
434 if ( $singular ) {
435 echo " data-wp-lists='list:$singular'";
436 } ?>>
437 <tr class="hidden"></tr>
438 <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;" >
439 <td colspan="6" class="colspanchange">
440
441 <fieldset class="inline-edit-col-left">
442 <legend class="inline-edit-legend"><?php _e( 'BULK DELETE', 'give' ); ?></legend>
443 <div class="inline-edit-col">
444 <div id="bulk-titles">
445 <div id="give-bulk-donors" class="give-bulk-donors">
446
447 </div>
448 </div>
449 </fieldset>
450
451 <fieldset class="inline-edit-col-right">
452 <div class="inline-edit-col">
453 <label>
454 <input id="give-delete-donor-confirm" type="checkbox" name="give-delete-donor-confirm"/>
455 <?php _e( 'Are you sure you want to delete the selected donor(s)?', 'give' ); ?>
456 </label>
457 <label>
458 <input id="give-delete-donor-records" type="checkbox" name="give-delete-donor-records"/>
459 <?php _e( 'Delete all associated donations and records?', 'give' ); ?>
460 </label>
461 </div>
462 </fieldset>
463
464 <p class="submit inline-edit-save">
465 <input type="hidden" name="give_action" value="delete_donor"/>
466 <input type="hidden" name="s" value="<?php echo ( ! empty( $_GET['s'] ) ) ? $_GET['s'] : ''; ?>"/>
467 <input type="hidden" name="orderby" value="<?php echo ( ! empty( $_GET['orderby'] ) ) ? $_GET['orderby'] : 'id'; ?>"/>
468 <input type="hidden" name="order" value="<?php echo ( ! empty( $_GET['order'] ) ) ? $_GET['order'] : 'desc'; ?>"/>
469 <button type="button" id="give-bulk-delete-cancel" class="button cancel alignleft"><?php _e( 'Cancel', 'give' ); ?></button>
470 <input type="submit" id="give-bulk-delete-button" disabled class="button button-primary alignright" value="<?php _e( 'Delete', 'give' ); ?>">
471 <br class="clear">
472 </p>
473 </td>
474 </tr>
475 <?php $this->display_rows_or_placeholder(); ?>
476 </tbody>
477
478 <tfoot>
479 <tr>
480 <?php $this->print_column_headers( false ); ?>
481 </tr>
482 </tfoot>
483
484 </table>
485 <?php
486 $this->display_tablenav( 'bottom' );
487 }
488
489 /**
490 * Setup the final data for the table.
491 *
492 * @access public
493 * @since 1.0
494 *
495 * @return void
496 */
497 public function prepare_items() {
498
499 $columns = $this->get_columns();
500 $hidden = array(); // No hidden columns.
501 $sortable = $this->get_sortable_columns();
502
503 $this->_column_headers = array( $columns, $hidden, $sortable );
504
505 $this->items = $this->donor_data();
506
507 $this->total = $this->get_donor_count();
508
509 $this->set_pagination_args( array(
510 'total_items' => $this->total,
511 'per_page' => $this->per_page,
512 'total_pages' => ceil( $this->total / $this->per_page ),
513 ) );
514 }
515 }
516