PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.2.1
GiveWP – Donation Plugin and Fundraising Platform v2.2.1
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 / class-give-cli-commands.php
give / includes Last commit date
admin 7 years ago api 7 years ago deprecated 7 years ago donors 7 years ago emails 7 years ago forms 7 years ago gateways 7 years ago libraries 7 years ago payments 7 years ago actions.php 7 years ago ajax-functions.php 7 years ago class-give-async-process.php 8 years ago class-give-background-updater.php 7 years ago class-give-cache.php 7 years ago class-give-cli-commands.php 8 years ago class-give-comment.php 7 years ago class-give-cron.php 8 years ago class-give-db-donor-meta.php 8 years ago class-give-db-donors.php 7 years ago class-give-db-form-meta.php 8 years ago class-give-db-logs-meta.php 8 years ago class-give-db-logs.php 7 years ago class-give-db-meta.php 7 years ago class-give-db-payment-meta.php 7 years ago class-give-db-sequential-ordering.php 7 years ago class-give-db-sessions.php 7 years ago class-give-db.php 8 years ago class-give-donate-form.php 8 years ago class-give-donor-wall-widget.php 7 years ago class-give-donor.php 7 years ago class-give-email-access.php 8 years ago class-give-html-elements.php 7 years ago class-give-license-handler.php 7 years ago class-give-logging.php 8 years ago class-give-readme-parser.php 8 years ago class-give-roles.php 8 years ago class-give-scripts.php 7 years ago class-give-session.php 7 years ago class-give-stats.php 8 years ago class-give-template-loader.php 8 years ago class-give-tooltips.php 8 years ago class-give-translation.php 8 years ago class-notices.php 7 years ago country-functions.php 8 years ago currency-functions.php 7 years ago error-tracking.php 8 years ago filters.php 7 years ago formatting.php 7 years ago import-functions.php 7 years ago install.php 7 years ago login-register.php 8 years ago misc-functions.php 7 years ago plugin-compatibility.php 8 years ago post-types.php 8 years ago price-functions.php 7 years ago process-donation.php 7 years ago shortcodes.php 7 years ago template-functions.php 8 years ago user-functions.php 7 years ago
class-give-cli-commands.php
1286 lines
1 <?php
2 /**
3 * GIVE WP_CLI commands
4 *
5 * @package give
6 * @since 1.7
7 */
8
9 // Exit if accessed directly.
10 if ( ! defined( 'ABSPATH' ) ) {
11 exit;
12 }
13
14 // Add give command.
15 WP_CLI::add_command( 'give', 'GIVE_CLI_COMMAND' );
16
17
18 /**
19 * Work with Give through WP-CLI
20 *
21 * Adds CLI support to Give through WP-CLI
22 *
23 * @since 1.7
24 */
25 class GIVE_CLI_COMMAND {
26
27 /**
28 * This param uses to count process/step inside loop.
29 *
30 * @var int $counter Counter.
31 */
32 private static $counter;
33
34 /**
35 * This helps to get information give plugin data.
36 *
37 * @var Give_API Object.
38 */
39 private $api;
40
41 /**
42 * This helps to get unique name.
43 *
44 * @since 1.8.17
45 * @var array
46 */
47 private $new_donor_names = array();
48
49
50 /**
51 * GIVE_CLI_Command constructor.
52 */
53 public function __construct() {
54 $this->api = new Give_API();
55 }
56
57
58 /**
59 * Get Give logo
60 *
61 * ## OPTIONS
62 *
63 * None. for a fun surprise.
64 *
65 * ## EXAMPLES
66 *
67 * wp give logo
68 *
69 * @since 1.7
70 * @access public
71 *
72 * @param string $args Command Data.
73 * @param array $assoc_args List of command data.
74 *
75 * @return void
76 *
77 * @subcommand logo
78 */
79 public function ascii( $args, $assoc_args ) {
80 WP_CLI::log( file_get_contents( GIVE_PLUGIN_DIR . 'assets/dist/images/give-ascii-logo.txt' ) );
81 }
82
83
84 /**
85 * Get Give details
86 *
87 * ## OPTIONS
88 *
89 * None. Returns basic info regarding your Give instance.
90 *
91 * ## EXAMPLES
92 *
93 * wp give details
94 *
95 * @since 1.7
96 * @access public
97 *
98 * @param string $args Command Data.
99 * @param array $assoc_args List of command data.
100 *
101 * @return void
102 *
103 * @subcommand details
104 */
105 public function details( $args, $assoc_args ) {
106
107 /**
108 * Plugin Information
109 */
110 WP_CLI::log( $this->color_message( __( 'Give Version: ', 'give' ) ) . GIVE_VERSION );
111
112 /**
113 * General Information.
114 */
115 WP_CLI::log( "\n#### " . $this->color_message( __( 'General information', 'give' ) ) . ' ####' );
116
117 $success_page = give_get_option( 'success_page' );
118 $failure_page = give_get_option( 'failure_page' );
119 $history_page = give_get_option( 'history_page' );
120
121 WP_CLI::log( $this->color_message( sprintf( __( 'Success Page: ', 'give' ) ) ) . ( $success_page ? "[{$success_page}] " . get_permalink( $success_page ) : __( 'Not Set', 'give' ) ) );
122 WP_CLI::log( $this->color_message( __( 'Failed Donation Page: ', 'give' ) ) . ( $failure_page ? "[{$failure_page}] " . get_permalink( $failure_page ) : __( 'Not Set', 'give' ) ) );
123 WP_CLI::log( $this->color_message( __( 'Donation History Page: ', 'give' ) ) . ( $history_page ? "[{$history_page}] " . get_permalink( $history_page ) : __( 'Not Set', 'give' ) ) );
124 WP_CLI::log( $this->color_message( __( 'Country: ', 'give' ) ) . give_get_country() );
125
126 /**
127 * Currency Information.
128 */
129 $default_gateway = give_get_option( 'default_gateway' );
130
131 WP_CLI::log( "\n#### " . $this->color_message( __( 'Currency Information', 'give' ) ) . ' ####' );
132
133 WP_CLI::log( $this->color_message( __( 'Currency: ', 'give' ), give_get_currency() ) );
134 WP_CLI::log( $this->color_message( __( 'Currency Position: ', 'give' ), give_get_currency_position() ) );
135 WP_CLI::log( $this->color_message( __( 'Thousand Separator: ', 'give' ), give_get_price_thousand_separator() ) );
136 WP_CLI::log( $this->color_message( __( 'Decimal Separator: ', 'give' ), give_get_price_decimal_separator() ) );
137 WP_CLI::log( $this->color_message( __( 'Number of Decimals: ', 'give' ), give_get_price_decimals() ) );
138 WP_CLI::log( $this->color_message( __( 'Test Mode: ', 'give' ), ( give_get_option( 'test_mode' ) ? __( 'Yes', 'give' ) : __( 'No', 'give' ) ) ) );
139 WP_CLI::log( $this->color_message( __( 'Default Gateway: ', 'give' ), ( $default_gateway ? $default_gateway : __( 'Not Set', 'give' ) ) ) );
140
141 // Payment gateways Information.
142 $gateways = give_get_ordered_payment_gateways( give_get_payment_gateways() );
143 WP_CLI::log( $this->color_message( __( 'Enabled Gateways: ', 'give' ) ) );
144
145 if ( ! empty( $gateways ) ) {
146 self::$counter = 1;
147 foreach ( $gateways as $gateway ) {
148 WP_CLI::log( ' ' . $this->color_message( self::$counter, $gateway['admin_label'] ) );
149 self::$counter ++;
150 }
151 } else {
152 WP_CLI::log( __( 'Not any payment gateways found', 'give' ) );
153 }
154 }
155
156
157 /**
158 * Get the forms currently posted on your Give site
159 *
160 * ## OPTIONS
161 *
162 * [--id=<form_id>]
163 * : A specific form ID to retrieve
164 *
165 * [--number=<form_count>]
166 * : Number of form to retrieve
167 *
168 * ## EXAMPLES
169 *
170 * wp give forms
171 * wp give forms --id=103
172 * wp give forms --number=103
173 *
174 * @since 1.7
175 * @access public
176 *
177 * @param string $args Command Data.
178 * @param array $assoc_args List of command data.
179 *
180 * @return void
181 *
182 * @subcommand forms
183 */
184 public function forms( $args, $assoc_args ) {
185 global $wp_query;
186 $form_id = isset( $assoc_args ) && array_key_exists( 'id', $assoc_args ) ? absint( $assoc_args['id'] ) : false;
187 $number = isset( $assoc_args ) && array_key_exists( 'number', $assoc_args ) ? absint( $assoc_args['number'] ) : 10;
188 $start = time();
189
190 // Cache previous number query var.
191 $is_set_number = $cache_per_page = false;
192 if ( isset( $wp_query->query_vars['number'] ) ) {
193 $cache_per_page = $wp_query->query_vars['number'];
194 $is_set_number = true;
195 }
196
197 // Change number query var.
198 $wp_query->query_vars['number'] = $number;
199
200 // Get forms.
201 $forms = $form_id ? $this->api->get_forms( $form_id ) : $this->api->get_forms();
202
203 // Reset number query var.
204 if ( $is_set_number ) {
205 $wp_query->query_vars['number'] = $cache_per_page;
206 }
207
208 // Bailout.
209 if ( array_key_exists( 'error', $forms ) ) {
210
211 WP_CLI::warning( $forms['error'] );
212
213 return;
214 } elseif ( empty( $forms['forms'] ) ) {
215
216 WP_CLI::error( __( 'No forms found.', 'give' ) );
217
218 return;
219 }
220
221 // Param to check if form typeis already showed or not.
222 $is_show_form_type = false;
223
224 if ( 1 === count( $forms ) && $form_id ) {
225 // Show single form.
226 foreach ( $forms['forms'][0] as $key => $info ) {
227 switch ( $key ) {
228 case 'stats':
229 $this->color_main_heading( ucfirst( $key ) );
230
231 foreach ( $info as $heading => $data ) {
232 $this->color_sub_heading( ucfirst( $heading ) );
233 switch ( $heading ) {
234 default:
235 foreach ( $data as $subheading => $subdata ) {
236
237 switch ( $subheading ) {
238 case 'earnings':
239 WP_CLI::log( $this->color_message( $subheading . ': ', give_currency_filter( $subdata ) ) );
240 break;
241 default:
242 WP_CLI::log( $this->color_message( $subheading . ': ', $subdata ) );
243 }
244 }
245 }
246 }
247 break;
248
249 case 'pricing':
250 case 'info':
251 default:
252 $this->color_main_heading( ucfirst( $key ) );
253
254 // Show form type.
255 if ( ! $is_show_form_type ) {
256 $form = new Give_Donate_Form( $form_id );
257 $is_show_form_type = true;
258
259 WP_CLI::log( $this->color_message( __( 'form type', 'give' ), $form->get_type() ) );
260 }
261
262 foreach ( $info as $heading => $data ) {
263
264 switch ( $heading ) {
265 case 'id':
266 WP_CLI::log( $this->color_message( $heading, $data ) );
267 break;
268
269 default:
270 $data = empty( $data ) ? __( 'Not set', 'give' ) : $data;
271 WP_CLI::log( $this->color_message( $heading, $data ) );
272 }
273 }
274 }// End switch().
275 }// End foreach().
276 } else {
277 // Show multiple form.
278 $table_data = array();
279 $is_table_first_row_set = false;
280 $table_column_count = 0;
281
282 WP_CLI::line( $this->color_message( sprintf( __( '%d donation forms found', 'give' ), count( $forms['forms'] ) ), '', false ) );
283
284 foreach ( $forms['forms'] as $index => $form_data ) {
285
286 // Default table data.
287 $table_first_row = array();
288 $table_row = array();
289
290 foreach ( $form_data['info'] as $key => $form ) {
291
292 // Do not show thumbnail, content and link in table.
293 if ( in_array( $key, array( 'content', 'thumbnail', 'link' ), true ) ) {
294 continue;
295 }
296
297 if ( ! $is_table_first_row_set ) {
298 $table_first_row[] = $key;
299 }
300
301 $table_row[] = $form;
302
303 if ( 'status' === $key ) {
304 // First array item will be an form id in our case.
305 $form = new Give_Donate_Form( absint( $table_row[0] ) );
306
307 $table_row[] = $form->get_type();
308 }
309 }
310
311 // Set table first row.
312 if ( ! $is_table_first_row_set ) {
313
314 // Add extra column to table.
315 $table_first_row[] = 'type';
316
317 $table_data[] = $table_first_row;
318 $is_table_first_row_set = true;
319 }
320
321 // set table data.
322 $table_data[] = $table_row;
323 }// End foreach().
324
325 $this->display_table( $table_data );
326 }// End if().
327 }
328
329
330 /**
331 * Get the donors currently on your Give site. Can also be used to create donors records
332 *
333 * ## OPTIONS
334 *
335 * [--id=<donor_id>]
336 * : A specific donor ID to retrieve
337 *
338 * [--email=<donor_email>]
339 * : The email address of the donor to retrieve
340 *
341 * [--number=<donor_count>]
342 * : The number of donor to retrieve
343 *
344 * [--create=<number>]
345 * : The number of arbitrary donors to create. Leave as 1 or blank to create a
346 * donor with a specific email
347 *
348 * [--form-id=<donation_form_id>]
349 * : Get list of donors of specific donation form
350 *
351 * [--name=<name_of_donor>]
352 * : Name with which you want to create new donor
353 *
354 * [--format=<output_format>]
355 * : In which format you want to see results. Valid formats: table, json, csv
356 *
357 * ## EXAMPLES
358 *
359 * wp give donors
360 * wp give donors --id=103
361 * wp give donors --email=john@test.com
362 * wp give donors --create=1 --email=john@test.com
363 * wp give donors --create=1 --email=john@test.com --name="John Doe"
364 * wp give donors --create=1000
365 * wp give donors --number=1000
366 * wp give donors --form-id=1024
367 *
368 * @since 1.7
369 * @access public
370 *
371 * @param string $args Command Data.
372 * @param array $assoc_args List of command data.
373 *
374 * @return void
375 *
376 * @subcommand donors
377 */
378 public function donors( $args, $assoc_args ) {
379 global $wp_query;
380 $donor_id = isset( $assoc_args ) && array_key_exists( 'id', $assoc_args ) ? absint( $assoc_args['id'] ) : false;
381 $email = isset( $assoc_args ) && array_key_exists( 'email', $assoc_args ) ? $assoc_args['email'] : false;
382 $name = isset( $assoc_args ) && array_key_exists( 'name', $assoc_args ) ? $assoc_args['name'] : '';
383 $create = isset( $assoc_args ) && array_key_exists( 'create', $assoc_args ) ? $assoc_args['create'] : false;
384 $number = isset( $assoc_args ) && array_key_exists( 'number', $assoc_args ) ? $assoc_args['number'] : 10;
385 $form_id = isset( $assoc_args ) && array_key_exists( 'form-id', $assoc_args ) ? $assoc_args['form-id'] : 0;
386 $format = isset( $assoc_args ) && array_key_exists( 'format', $assoc_args ) ? $assoc_args['format'] : 'table';
387 $start = time();
388
389 if ( $create ) {
390 if ( 80 < $create ) {
391 WP_CLI::warning( 'Currently we can only generate maximum 80 donors.', 'give' );
392 $create = 80;
393 }
394
395 $number = 1;
396
397 if ( isset( $assoc_args['email'] ) && ! is_email( $email ) ) {
398 WP_CLI::warning( 'Wrong email address provided.', 'give' );
399
400 return;
401 }
402
403 // Create one or more donors.
404 if ( ! $email ) {
405 // If no email is specified, look to see if we are generating arbitrary donor accounts.
406 $number = is_numeric( $create ) ? absint( $create ) : 1;
407 }
408
409 for ( $i = 0; $i < $number; $i ++ ) {
410 $name = $name ? $name : $this->get_random_name();
411 $email = $email ? $email : $this->get_random_email( $name );
412
413 $args = array(
414 'email' => $email,
415 'name' => $name,
416 );
417
418 $donor_id = Give()->donors->add( $args );
419
420 if ( $donor_id ) {
421 WP_CLI::line( $this->color_message( sprintf( __( 'Donor #%d created successfully', 'give' ), $donor_id ) ) );
422 } else {
423 WP_CLI::error( __( 'Failed to create donor', 'give' ) );
424 }
425
426 // Reset email and name to false so it is generated on the next loop (if creating donors).
427 $email = $name = false;
428 }
429
430 WP_CLI::line( $this->color_message( sprintf( __( '%1$d donors created in %2$d seconds', 'give' ), $number, time() - $start ) ) );
431
432 } else {
433 // Counter.
434 self::$counter = 1;
435
436 // Search for customers.
437 $search = $donor_id ? $donor_id : $email;
438
439 /**
440 * Get donors.
441 */
442 // Cache previous number query var.
443 $is_set_number = $cache_per_page = false;
444 if ( isset( $wp_query->query_vars['number'] ) ) {
445 $cache_per_page = $wp_query->query_vars['number'];
446 $is_set_number = true;
447 }
448
449 // Change number query var.
450 $wp_query->query_vars['number'] = $number;
451
452 // Get donors.
453 if ( $form_id ) {
454 // @TODO: Allow user to get a list of donors by donation status.
455 $donors = $this->get_donors_by_form_id( $form_id );
456 } else {
457 $donors = $this->api->get_donors( $search );
458 }
459
460 // Reset number query var.
461 if ( $is_set_number ) {
462 $wp_query->query_vars['number'] = $cache_per_page;
463 }
464
465 if ( isset( $donors['error'] ) ) {
466 WP_CLI::error( $donors['error'] );
467 }
468
469 if ( empty( $donors ) ) {
470 WP_CLI::error( __( 'No donors found.', 'give' ) );
471
472 return;
473 }
474
475 $table_data = array();
476 $is_table_first_row_set = false;
477
478 foreach ( $donors['donors'] as $donor_data ) {
479 // Set default table row data.
480 $table_first_row = array( __( 's_no', 'give' ) );
481 $table_row = array( self::$counter );
482
483 foreach ( $donor_data as $key => $donor ) {
484 switch ( $key ) {
485 case 'stats':
486 foreach ( $donor as $heading => $data ) {
487
488 // Get first row.
489 if ( ! $is_table_first_row_set ) {
490 $table_first_row[] = $heading;
491 }
492
493 switch ( $heading ) {
494 case 'total_spent':
495 $table_row[] = give_currency_filter( $data );
496 break;
497
498 default:
499 $table_row[] = $data;
500 }
501 }
502 break;
503
504 case 'info':
505 default:
506 foreach ( $donor as $heading => $data ) {
507
508 // Get first row.
509 if ( ! $is_table_first_row_set ) {
510 $table_first_row[] = $heading;
511 }
512
513 $table_row[] = $data;
514 }
515 }
516 }
517
518 // Add first row data to table data.
519 if ( ! $is_table_first_row_set ) {
520 $table_data[] = $table_first_row;
521 $is_table_first_row_set = true;
522 }
523
524 // Add table row data.
525 $table_data[] = $table_row;
526
527 // Increase counter.
528 self::$counter ++;
529 }// End foreach().
530
531 switch ( $format ) {
532 case 'json':
533 $table_column_name = $table_data[0];
534 unset( $table_data[0] );
535
536 $new_table_data = array();
537 foreach ( $table_data as $index => $data ) {
538 foreach ( $data as $key => $value ) {
539 $new_table_data[ $index ][ $table_column_name[ $key ] ] = $value;
540 }
541 }
542
543 WP_CLI::log( json_encode( $new_table_data ) );
544 break;
545
546 case 'csv':
547 $file_path = trailingslashit( WP_CONTENT_DIR ) . 'uploads/give_donors_' . date( 'Y_m_d_s', current_time( 'timestamp' ) ) . '.csv';
548 $fp = fopen( $file_path, 'w' );
549
550 if ( is_writable( $file_path ) ) {
551 foreach ( $table_data as $fields ) {
552 fputcsv( $fp, $fields );
553 }
554
555 fclose( $fp );
556
557 WP_CLI::success( "Donors list csv created successfully: {$file_path}" );
558 } else {
559 WP_CLI::warning( "Unable to create donors list csv file: {$file_path} (May folder do not have write permission)" );
560 }
561
562 break;
563
564 default:
565 $this->display_table( $table_data );
566 }// End switch().
567 }// End if().
568 }
569
570
571 /**
572 * Get the recent donations for your Give site
573 *
574 * ## OPTIONS
575 *
576 * [--number=<donation_count>]
577 * : The number of donations to retrieve
578 *
579 *
580 * ## EXAMPLES
581 *
582 * wp give donations
583 * wp give donations --number=100
584 *
585 * @since 1.7
586 * @access public
587 *
588 * @param string $args Command Data.
589 * @param array $assoc_args List of command data.
590 *
591 * @return void
592 *
593 * @subcommand donations
594 */
595 public function donations( $args, $assoc_args ) {
596 global $wp_query;
597 $number = isset( $assoc_args ) && array_key_exists( 'number', $assoc_args ) ? $assoc_args['number'] : 10;
598
599 // Cache previous number query var.
600 $is_set_number = $cache_per_page = false;
601 if ( isset( $wp_query->query_vars['number'] ) ) {
602 $cache_per_page = $wp_query->query_vars['number'];
603 $is_set_number = true;
604 }
605
606 // Change number query var.
607 $wp_query->query_vars['number'] = $number;
608
609 // Get donations.
610 $donations = $this->api->get_recent_donations();
611
612 // Reset number query var.
613 if ( $is_set_number ) {
614 $wp_query->query_vars['number'] = $cache_per_page;
615 }
616
617 if ( empty( $donations ) ) {
618 WP_CLI::error( __( 'No donations found.', 'give' ) );
619
620 return;
621 }
622
623 self::$counter = 1;
624
625 foreach ( $donations['donations'] as $key => $donation ) {
626 $this->color_main_heading( sprintf( __( '%1$s. Donation #%2$s', 'give' ), self::$counter, $donation['ID'] ), 'Y' );
627 self::$counter ++;
628
629 foreach ( $donation as $column => $data ) {
630
631 if ( is_array( $data ) ) {
632 $this->color_sub_heading( $column );
633 foreach ( $data as $subcolumn => $subdata ) {
634
635 // Decode html codes.
636 switch ( $subcolumn ) {
637 case 'name':
638 $subdata = html_entity_decode( $subdata );
639 break;
640 }
641
642 // @TODO Check if multi dimension array information is importent to show or not. For example inside donation array we have array for fees data inside payment meta.
643 if ( is_array( $subdata ) ) {
644 continue;
645 }
646
647 WP_CLI::log( $this->color_message( $subcolumn, $subdata ) );
648 }
649 continue;
650 }
651
652 WP_CLI::log( $this->color_message( $column, $data ) );
653 }
654 }
655 }
656
657 /**
658 * Get give plugin report.
659 *
660 * ## OPTIONS
661 *
662 * [--id=<donation_form_id>]
663 * : The ID of a specific donation_form to retrieve stats for, or all
664 *
665 * [--date=<range|this_month|last_month|today|yesterday|this_quarter|last_quarter|this_year|last_year>]
666 * : A specific date range to retrieve stats for
667 *
668 * [--start-date=<date>]
669 * : The start date of a date range to retrieve stats for. Date format is MM/DD/YYYY
670 *
671 * [--end-date=<date>]
672 * : The end date of a date range to retrieve stats for. Date format is MM/DD/YYYY
673 *
674 * ## EXAMPLES
675 *
676 * wp give report
677 * wp give report --date=this_month
678 * wp give report --start-date=01/02/2014 --end-date=02/23/2014
679 * wp give report --date=last_year
680 * wp give report --date=last_year --id=15
681 *
682 * @since 1.7
683 * @access public
684 *
685 * @param string $args Command Data.
686 * @param array $assoc_args List of command data.
687 *
688 * @subcommand report
689 *
690 * @return void
691 */
692 public function report( $args, $assoc_args ) {
693 $stats = new Give_Payment_Stats();
694 $date = isset( $assoc_args ) && array_key_exists( 'date', $assoc_args ) ? $assoc_args['date'] : false;
695 $start_date = isset( $assoc_args ) && array_key_exists( 'start-date', $assoc_args ) ? $assoc_args['start-date'] : false;
696 $end_date = isset( $assoc_args ) && array_key_exists( 'end-date', $assoc_args ) ? $assoc_args['end-date'] : false;
697 $form_id = isset( $assoc_args ) && array_key_exists( 'id', $assoc_args ) ? $assoc_args['id'] : 0;
698
699 if ( ! empty( $date ) ) {
700 $start_date = $date;
701 $end_date = false;
702 } elseif ( empty( $date ) && empty( $start_date ) ) {
703 $start_date = 'this_month';
704 $end_date = false;
705 }
706
707 // Get stats.
708 $earnings = $stats->get_earnings( $form_id, $start_date, $end_date );
709 $sales = $stats->get_sales( $form_id, $start_date, $end_date );
710
711 WP_CLI::line( $this->color_message( __( 'Earnings', 'give' ), give_currency_filter( $earnings, array( 'decode_currency' => true ) ) ) );
712 WP_CLI::line( $this->color_message( __( 'Sales', 'give' ), $sales ) );
713 }
714
715
716 /**
717 * Delete cache (transient).
718 *
719 * ## OPTIONS
720 *
721 * --action=<cache_action>
722 * : Value of this parameter can be delete (in case you want to delete all stat cache).
723 *
724 * ## EXAMPLES
725 *
726 * # See form report
727 * wp give cache --action=delete
728 *
729 * @since 1.7
730 * @access public
731 *
732 * @param string $args Command Data.
733 * @param array $assoc_args List of command data.
734 *
735 * @return void
736 *
737 * @subcommand cache
738 */
739 public function cache( $args, $assoc_args ) {
740 $action = isset( $assoc_args ) && array_key_exists( 'action', $assoc_args ) ? $assoc_args['action'] : false;
741
742 // Bailout.
743 if ( ! $action || ! in_array( $action, array( 'delete' ), true ) ) {
744 WP_CLI::warning( __( 'Type wp give cache --action=delete to delete all stat transients', 'give' ) );
745
746 return;
747 }
748
749 switch ( $action ) {
750 case 'delete':
751 // Reset counter.
752 self::$counter = 1;
753
754 if ( $this->delete_stats_transients() ) {
755 // Report .eading.
756 WP_CLI::success( 'Give cache deleted.' );
757 } else {
758 // Report .eading.
759 WP_CLI::warning( 'We did not find any Give plugin cache to delete :)' );
760 }
761 break;
762 }
763
764 }
765
766 /**
767 * Delete all form stat transient
768 *
769 * @since 1.7
770 * @access private
771 *
772 * @return bool
773 */
774 private function delete_stats_transients() {
775 global $wpdb;
776
777 $stat_option_names = $wpdb->get_results(
778 $wpdb->prepare(
779 "SELECT option_name FROM {$wpdb->options} where (option_name LIKE '%%%s%%' OR option_name LIKE '%%%s%%')",
780 array(
781 '_transient_give_stats_',
782 'give_cache',
783 )
784 ),
785 ARRAY_A
786 );
787
788 if ( ! empty( $stat_option_names ) ) {
789
790 foreach ( $stat_option_names as $option_name ) {
791 $error = false;
792 $option_name = $option_name['option_name'];
793
794 switch ( true ) {
795 case ( false !== strpos( $option_name, 'transient' ) ):
796 $option_name = str_replace( '_transient_', '', $option_name );
797 $error = delete_transient( $option_name );
798 break;
799
800 default:
801 $error = delete_option( $option_name );
802 }
803
804 if ( $error ) {
805 WP_CLI::log( $this->color_message( self::$counter, $option_name ) );
806 self::$counter ++;
807 } else {
808 WP_CLI::log( $this->color_message( __( 'Error while deleting this transient', 'give' ), $option_name ) );
809 }
810 }
811
812 return true;
813 }
814
815 return false;
816 }
817
818
819 /**
820 * Return colored message
821 *
822 * @param string $heading Message heading.
823 * @param string $message Message content.
824 * @param bool $colon Check if add colon between heading and message.
825 * @param string $color Heading color.
826 *
827 * @return string
828 */
829 private function color_message( $heading, $message = '', $colon = true, $color = 'g' ) {
830 // Add colon.
831 if ( $colon ) {
832 $heading = $heading . ': ';
833 }
834
835 return WP_CLI::colorize( "%{$color}" . $heading . '%n' ) . $message;
836 }
837
838
839 /**
840 * Output section heading.
841 *
842 * @since 1.7
843 * @access private
844 *
845 * @param string $heading Heading.
846 * @param string $color Color.
847 *
848 * @return void
849 */
850 private function color_main_heading( $heading, $color = 'g' ) {
851 WP_CLI::log( "\n###### " . $this->color_message( $heading, '', false, $color ) . ' ######' );
852 }
853
854 /**
855 * Output section sub heading.
856 *
857 * @since 1.7
858 * @access private
859 *
860 * @param string $subheading Sub heading.
861 *
862 * @return void
863 */
864 private function color_sub_heading( $subheading ) {
865 WP_CLI::log( "\n--->" . $subheading . '', '', false );
866 }
867
868
869 /**
870 * Display data in table format.
871 *
872 * @since 1.7
873 * @access private
874 *
875 * @param array $data Array of table data.
876 *
877 * @return void
878 */
879 private function display_table( $data ) {
880 $table = new \cli\Table();
881
882 // Set table header.
883 $table->setHeaders( $data[0] );
884
885 // Remove table header.
886 unset( $data[0] );
887
888 // Set table data.
889 $table->setRows( $data );
890
891 // Display table.
892 $table->display();
893 }
894
895
896 /**
897 * Get donors by form id.
898 *
899 * @since 1.8
900 *
901 * @param int $form_id From id.
902 *
903 * @return array
904 */
905
906 private function get_donors_by_form_id( $form_id ) {
907 $donors = array();
908
909 $donations = new Give_Payments_Query(
910 array(
911 'give_forms' => array( $form_id ),
912 'number' => - 1,
913 'status' => array( 'publish' ),
914 )
915 );
916
917 $donations = $donations->get_payments();
918 $skip_donors = array();
919
920 /* @var Give_Payment|object $donation Payment object. */
921 foreach ( $donations as $donation ) {
922
923 if ( in_array( $donation->customer_id, $skip_donors, true ) ) {
924 continue;
925 }
926
927 if ( ! empty( $donors ) ) {
928 $donors['donors'][] = current( current( $this->api->get_donors( (int) $donation->customer_id ) ) );
929 } else {
930 $donors = array_merge( $donors, $this->api->get_donors( (int) $donation->customer_id ) );
931 }
932
933 $skip_donors[] = $donation->customer_id;
934 }
935
936 return $donors;
937 }
938
939 /**
940 * Get random user name
941 *
942 * @since 1.8.17
943 * @return string
944 */
945 private function get_random_name() {
946 // First names.
947 $names = array(
948 'Devin',
949 'Christopher',
950 'Ryan',
951 'Ethan',
952 'John',
953 'Zoey',
954 'Sarah',
955 'Michelle',
956 'Samantha',
957 );
958
959 // Surnames.
960 $surnames = array(
961 'Walker',
962 'Josh',
963 'Thompson',
964 'Anderson',
965 'Johnson',
966 'Tremblay',
967 'Peltier',
968 'Cunningham',
969 'Simpson',
970 'Mercado',
971 'Sellers',
972 );
973
974 // Generate a random forename.
975 $random_name = $names[ mt_rand( 0, sizeof( $names ) - 1 ) ];
976
977 // Generate a random surname.
978 $random_surname = $surnames[ mt_rand( 0, sizeof( $surnames ) - 1 ) ];
979
980 // Generate name.
981 $name = "{$random_name} {$random_surname}";
982
983 if ( in_array( $name, $this->new_donor_names ) ) {
984 $name = $this->get_random_name();
985 }
986
987 // Collect new donor names.
988 $this->new_donor_names[] = $name;
989
990 return $name;
991 }
992
993 /**
994 * Get random email
995 *
996 * @since 1.8.17
997 *
998 * @param string $name
999 *
1000 * @return string
1001 */
1002 private function get_random_email( $name ) {
1003 return implode( '.', explode( ' ', strtolower( $name ) ) ) . '@test.com';
1004 }
1005
1006 /**
1007 * Toggle settings for Give's test mode.
1008 *
1009 * [--enable]
1010 * : Enable Give's test mode
1011 *
1012 * [--disable]
1013 * : Enable Give's test mode
1014 *
1015 * @when after_wp_load
1016 * @subcommand test-mode
1017 */
1018 public function test_mode( $args, $assoc ) {
1019
1020 // Return if associative arguments are not specified.
1021 if ( empty( $assoc ) ) {
1022 WP_CLI::error( "--enable or --disable flag is missing." );
1023 return;
1024 }
1025
1026 $enabled_gateways = give_get_option( 'gateways' );
1027 $default_gateway = give_get_option( 'default_gateway' );
1028
1029
1030 // Enable Test Mode.
1031 if ( true === WP_CLI\Utils\get_flag_value( $assoc, 'enable' ) ) {
1032
1033 // Set `Test Mode` to `enabled`.
1034 give_update_option( 'test_mode', 'enabled' );
1035
1036
1037 // Enable `Test Donation` gateway.
1038 $enabled_gateways['manual'] = "1";
1039 give_update_option( 'gateways', $enabled_gateways );
1040
1041
1042 // Set `Test Donation` as default gateway.
1043 add_option( 'give_test_mode_default_gateway', $default_gateway );
1044 give_update_option( 'default_gateway', 'manual' );
1045
1046
1047 // Show success message on completion.
1048 WP_CLI::success( 'Give Test mode enabled' );
1049 }
1050
1051 // Disable Test Mode.
1052 if ( true === WP_CLI\Utils\get_flag_value( $assoc, 'disable' ) ) {
1053
1054 // Set `Test Mode` to `disabled`.
1055 give_update_option( 'test_mode', 'disabled' );
1056
1057
1058 // Disable `Test Donation` gateway.
1059 unset( $enabled_gateways['manual'] );
1060 give_update_option( 'gateways', $enabled_gateways );
1061
1062
1063 // Backup `Default Gateway` setting for restore on test mode disable.
1064 $default_gateway_backup = get_option( 'give_test_mode_default_gateway' );
1065 give_update_option( 'default_gateway', $default_gateway_backup );
1066 delete_option( 'give_test_mode_default_gateway' );
1067
1068
1069 // Show success message on completion.
1070 WP_CLI::success( 'Give Test mode disabled' );
1071 }
1072 }
1073
1074
1075 /**
1076 * Checks if the given path has a give repository installed
1077 * or not.
1078 *
1079 * @param string $repo_path Path to a Give Addon.
1080 *
1081 * @since 2.1.3
1082 *
1083 * @return boolean
1084 */
1085 private function is_git_repo( $repo_path ) {
1086 if ( is_dir( "{$repo_path}.git" ) ) {
1087 return true;
1088 }
1089
1090 return false;
1091 }
1092
1093
1094 /**
1095 * Gets the current branch name of a Give Addon.
1096 *
1097 * @param string $repo_path Path to a Give Addon.
1098 *
1099 * @since 2.1.3
1100 *
1101 * @return string
1102 */
1103 private function get_git_current_branch( $repo_path ) {
1104
1105 exec( "cd $repo_path && git branch | grep '\*'", $branch_names );
1106
1107 $branch_name = trim( strtolower( str_replace( '* ', '', $branch_names[0] ) ) );
1108
1109 return $branch_name;
1110 }
1111
1112
1113 /**
1114 * Updates the current branch of Give Addons.
1115 * Uses the remote origin to pull the latest code.
1116 *
1117 * ## OPTIONS
1118 *
1119 * [--name=<name>]
1120 * : Update a single addon.
1121 *
1122 * [--exclude=<names>]
1123 * : Names of addons that should be excluded from updating.
1124 *
1125 * ## EXAMPLES
1126 * wp give addon-update
1127 * wp give addon-update --name="Give-Stripe"
1128 * wp give addon-update --exclude="Give-Stripe, Give-Recurring-Donations"
1129 *
1130 * @param array $pos Array of positional arguments.
1131 * @param array $assoc Array of associative arguments.
1132 *
1133 * @since 2.1.3
1134 *
1135 * @subcommand addon-update
1136 */
1137 public function addon_update( $pos, $assoc ) {
1138
1139 /**
1140 * Only 1 associative argument should be passed.
1141 * It can be either `--name` or `--exclude`
1142 */
1143 if ( count( $assoc ) > 1 ) {
1144 WP_CLI::error( __( 'Too many associative arguments.', 'give' ) );
1145 }
1146
1147 /**
1148 * Update a single Give addon.
1149 */
1150 if ( false !== ( $addon_name = WP_CLI\Utils\get_flag_value( $assoc, 'name', false ) ) ) {
1151 $give_addon_path = glob( WP_CONTENT_DIR . "/plugins/$addon_name/" , GLOB_ONLYDIR );
1152
1153 /**
1154 * Display error if the plugin (addon) name entered does
1155 * not exist.
1156 */
1157 if ( empty( $give_addon_path ) ) {
1158 WP_CLI::error( sprintf( __( "The Give addon '%s' does not exist.", 'give' ), $addon_name ) );
1159 }
1160
1161 /**
1162 * If the directory does not contain a Git
1163 * repository, then display error and halt.
1164 */
1165 if ( ! $this->is_git_repo( $give_addon_path[0] ) ) {
1166 WP_CLI::error( __( 'This is not a Git repo', 'give' ) );
1167 }
1168
1169 /**
1170 * Get the current branch name. This branch will be updated next.
1171 */
1172 $branch_name = $this->get_git_current_branch( $give_addon_path[0] );
1173
1174 /**
1175 * Take the latest pull of the current branch, i.e.;
1176 * sync it with origin.
1177 */
1178 passthru( "cd $give_addon_path[0] && git pull origin $branch_name", $return_var );
1179
1180 /**
1181 * Show success/error messages depending on whether the
1182 * current branch of the addon was updated or not.
1183 */
1184 if ( 0 === $return_var ) {
1185 WP_CLI::success( sprintf( __( "The Give addon '%s' is up-to-date with origin." ), $addon_name ) );
1186
1187 return;
1188 } elseif ( 1 === $return_var ) {
1189 WP_CLI::error( sprintf( __( "The Give addon '%s' was not updated." ), $addon_name ) );
1190 }
1191 }
1192
1193 /**
1194 * Convert the comma-separated string of Give-addons in the
1195 * excluded list into array.
1196 */
1197 $addon_names = WP_CLI\Utils\get_flag_value( $assoc, 'exclude', array() );
1198 if ( ! empty( $addon_names ) ) {
1199 $addon_names = array_map( 'trim', explode( ',', $addon_names ) );
1200 }
1201
1202 /**
1203 * Get directory paths of all the addons including
1204 * Give Core.
1205 */
1206 $give_addon_directories = glob( WP_CONTENT_DIR . '/plugins/[gG]ive*/' , GLOB_ONLYDIR );
1207
1208 foreach ( $give_addon_directories as $repo ) {
1209
1210 /**
1211 * Extract the plugin/addon folder name
1212 * from the absolute path.
1213 */
1214 $plugin_name = basename( $repo );
1215
1216 /**
1217 * If the Give addon directory does not contain
1218 * a Git repo, then continue.
1219 */
1220 if ( ! $this->is_git_repo( $repo ) ) {
1221 WP_CLI::line(
1222 sprintf(
1223 __( "%s: '%s' does not contain git repo.", 'give' ),
1224 WP_CLI::colorize( '%RError%n' ),
1225 $plugin_name
1226 )
1227 );
1228
1229 continue;
1230 }
1231
1232 /**
1233 * Continue if the Give addon name is in the exlusion list.
1234 */
1235 if ( in_array( $plugin_name, $addon_names, true ) ) {
1236 continue;
1237 }
1238
1239 /* Get the current branch name */
1240 $branch_name = $this->get_git_current_branch( $repo );
1241
1242 /**
1243 * Show a colorized (CYAN) title for each addon/plugin
1244 * before a pull.
1245 */
1246 WP_CLI::line( WP_CLI::colorize( "> %CUpdating $plugin_name | $branch_name%n" ) );
1247
1248 /**
1249 * Git pull from the current branch using
1250 * remote `origin`.
1251 */
1252 if ( ! empty( $branch_name ) ) {
1253 passthru( "cd $repo && git pull origin $branch_name", $return_var );
1254 }
1255
1256 $items[] = array(
1257 'Give Addon' => $plugin_name,
1258 'Branch' => $branch_name,
1259 'Remote' => 'origin',
1260 'Status' => ( 0 === $return_var )
1261 ? __( 'Success', 'give' )
1262 : __( 'Failed', 'give' ),
1263 );
1264
1265 /**
1266 * Leave a blank line for aesthetics.
1267 */
1268 WP_CLI::line();
1269 }
1270
1271 /**
1272 * Display final results in a tabular format.
1273 */
1274 WP_CLI\Utils\format_items(
1275 'table',
1276 $items,
1277 array(
1278 'Give Addon',
1279 'Branch',
1280 'Remote',
1281 'Status',
1282 )
1283 );
1284 }
1285 }
1286