PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.1.7
GiveWP – Donation Plugin and Fundraising Platform v2.1.7
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 / shortcodes.php
give / includes Last commit date
admin 7 years ago api 8 years ago deprecated 8 years ago donors 8 years ago emails 8 years ago forms 7 years ago gateways 8 years ago libraries 8 years ago payments 8 years ago actions.php 8 years ago ajax-functions.php 8 years ago class-give-async-process.php 8 years ago class-give-background-updater.php 8 years ago class-give-cache.php 8 years ago class-give-cli-commands.php 8 years ago class-give-cron.php 8 years ago class-give-db-donor-meta.php 8 years ago class-give-db-donors.php 8 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 8 years ago class-give-db-meta.php 8 years ago class-give-db-payment-meta.php 8 years ago class-give-db-sequential-ordering.php 8 years ago class-give-db.php 8 years ago class-give-donate-form.php 8 years ago class-give-donor.php 8 years ago class-give-email-access.php 8 years ago class-give-gravatars.php 8 years ago class-give-html-elements.php 8 years ago class-give-license-handler.php 8 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 8 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 8 years ago country-functions.php 8 years ago currency-functions.php 8 years ago error-tracking.php 8 years ago filters.php 8 years ago formatting.php 8 years ago import-functions.php 8 years ago install.php 8 years ago login-register.php 8 years ago misc-functions.php 8 years ago plugin-compatibility.php 8 years ago post-types.php 8 years ago price-functions.php 8 years ago process-donation.php 7 years ago shortcodes.php 8 years ago template-functions.php 8 years ago user-functions.php 8 years ago
shortcodes.php
927 lines
1 <?php
2 /**
3 * Give Shortcodes
4 *
5 * @package Give
6 * @subpackage Shortcodes
7 * @copyright Copyright (c) 2016, WordImpress
8 * @license https://opensource.org/licenses/gpl-license GNU Public License
9 * @since 1.0
10 */
11
12 // Exit if accessed directly.
13 if ( ! defined( 'ABSPATH' ) ) {
14 exit;
15 }
16
17 /**
18 * Donation History Shortcode
19 *
20 * Displays a user's donation history.
21 *
22 * @since 1.0
23 *
24 * @param array $atts
25 * @param string|bool $content
26 *
27 * @return string|bool
28 */
29 function give_donation_history( $atts, $content = false ) {
30
31 $donation_history_args = shortcode_atts( array(
32 'id' => true,
33 'date' => true,
34 'donor' => false,
35 'amount' => true,
36 'status' => false,
37 'payment_method' => false,
38 ), $atts, 'donation_history' );
39
40 // Always show receipt link.
41 $donation_history_args['details'] = true;
42
43 // Set Donation History Shortcode Arguments in session variable.
44 Give()->session->set( 'give_donation_history_args', $donation_history_args );
45
46 // If payment_key query arg exists, return receipt instead of donation history.
47 if ( isset( $_GET['payment_key'] ) ) {
48 ob_start();
49
50 echo give_receipt_shortcode( array() );
51
52 // Display donation history link only if Receipt Access Session is available.
53 if ( give_get_receipt_session() ) {
54 echo sprintf(
55 '<a href="%s">%s</a>',
56 esc_url( give_get_history_page_uri() ),
57 __( '&laquo; Return to All Donations', 'give' )
58 );
59 }
60
61 return ob_get_clean();
62 }
63
64 $email_access = give_get_option( 'email_access' );
65
66 ob_start();
67
68 /**
69 * Determine access
70 *
71 * a. Check if a user is logged in or does a session exists
72 * b. Does an email-access token exist?
73 */
74 if (
75 is_user_logged_in() ||
76 false !== Give()->session->get_session_expiration() ||
77 ( give_is_setting_enabled( $email_access ) && Give()->email_access->token_exists ) ||
78 true === give_get_history_session()
79 ) {
80 give_get_template_part( 'history', 'donations' );
81
82 if ( ! empty( $content ) ) {
83 echo do_shortcode( $content );
84 }
85
86 } elseif ( give_is_setting_enabled( $email_access ) ) {
87 // Is Email-based access enabled?
88 give_get_template_part( 'email', 'login-form' );
89
90 } else {
91
92 echo apply_filters( 'give_donation_history_nonuser_message', Give()->notices->print_frontend_notice( __( 'You must be logged in to view your donation history. Please login using your account or create an account using the same email you used to donate with.', 'give' ), false ) );
93 echo do_shortcode( '[give_login]' );
94 }
95
96 /**
97 * Filter to modify donation history HTMl
98 *
99 * @since 2.1
100 *
101 * @param string HTML content
102 * @param array $atts
103 * @param string $content content pass between enclose content
104 *
105 * @return string HTML content
106 */
107 return apply_filters( 'give_donation_history_shortcode_html', ob_get_clean(), $atts, $content );
108 }
109
110 add_shortcode( 'donation_history', 'give_donation_history' );
111
112 /**
113 * Donation Form Shortcode
114 *
115 * Show the Give donation form.
116 *
117 * @since 1.0
118 *
119 * @param array $atts Shortcode attributes
120 *
121 * @return string
122 */
123 function give_form_shortcode( $atts ) {
124 $atts = shortcode_atts( array(
125 'id' => '',
126 'show_title' => true,
127 'show_goal' => true,
128 'show_content' => '',
129 'float_labels' => '',
130 'display_style' => '',
131 'continue_button_title' => '',
132 ), $atts, 'give_form' );
133
134 // Convert string to bool.
135 $atts['show_title'] = filter_var( $atts['show_title'], FILTER_VALIDATE_BOOLEAN );
136 $atts['show_goal'] = filter_var( $atts['show_goal'], FILTER_VALIDATE_BOOLEAN );
137
138 // get the Give Form
139 ob_start();
140 give_get_donation_form( $atts );
141 $final_output = ob_get_clean();
142
143 return apply_filters( 'give_donate_form', $final_output, $atts );
144 }
145
146 add_shortcode( 'give_form', 'give_form_shortcode' );
147
148 /**
149 * Donation Form Goal Shortcode.
150 *
151 * Show the Give donation form goals.
152 *
153 * @since 1.0
154 *
155 * @param array $atts Shortcode attributes.
156 *
157 * @return string
158 */
159 function give_goal_shortcode( $atts ) {
160 $atts = shortcode_atts( array(
161 'id' => '',
162 'show_text' => true,
163 'show_bar' => true,
164 ), $atts, 'give_goal' );
165
166 // get the Give Form.
167 ob_start();
168
169 // Sanity check 1: ensure there is an ID Provided.
170 if ( empty( $atts['id'] ) ) {
171 Give()->notices->print_frontend_notice( __( 'The shortcode is missing Donation Form ID attribute.', 'give' ), true );
172 }
173
174 // Sanity check 2: Check the form even has Goals enabled.
175 if ( ! give_is_setting_enabled( give_get_meta( $atts['id'], '_give_goal_option', true ) ) ) {
176
177 Give()->notices->print_frontend_notice( __( 'The form does not have Goals enabled.', 'give' ), true );
178 } else {
179 // Passed all sanity checks: output Goal.
180 give_show_goal_progress( $atts['id'], $atts );
181 }
182
183 $final_output = ob_get_clean();
184
185 return apply_filters( 'give_goal_shortcode_output', $final_output, $atts );
186 }
187
188 add_shortcode( 'give_goal', 'give_goal_shortcode' );
189
190
191 /**
192 * Login Shortcode.
193 *
194 * Shows a login form allowing users to users to log in. This function simply
195 * calls the give_login_form function to display the login form.
196 *
197 * @since 1.0
198 *
199 * @param array $atts Shortcode attributes.
200 *
201 * @uses give_login_form()
202 *
203 * @return string
204 */
205 function give_login_form_shortcode( $atts ) {
206
207 $atts = shortcode_atts( array(
208 // Add backward compatibility for redirect attribute.
209 'redirect' => '',
210 'login-redirect' => '',
211 'logout-redirect' => '',
212 ), $atts, 'give_login' );
213
214 // Check login-redirect attribute first, if it empty or not found then check for redirect attribute and add value of this to login-redirect attribute.
215 $atts['login-redirect'] = ! empty( $atts['login-redirect'] ) ? $atts['login-redirect'] : ( ! empty( $atts['redirect'] ) ? $atts['redirect'] : '' );
216
217 return give_login_form( $atts['login-redirect'], $atts['logout-redirect'] );
218 }
219
220 add_shortcode( 'give_login', 'give_login_form_shortcode' );
221
222 /**
223 * Register Shortcode.
224 *
225 * Shows a registration form allowing users to users to register for the site.
226 *
227 * @since 1.0
228 *
229 * @param array $atts Shortcode attributes.
230 *
231 * @uses give_register_form()
232 *
233 * @return string
234 */
235 function give_register_form_shortcode( $atts ) {
236 $atts = shortcode_atts( array(
237 'redirect' => '',
238 ), $atts, 'give_register' );
239
240 return give_register_form( $atts['redirect'] );
241 }
242
243 add_shortcode( 'give_register', 'give_register_form_shortcode' );
244
245 /**
246 * Receipt Shortcode.
247 *
248 * Shows a donation receipt.
249 *
250 * @since 1.0
251 *
252 * @param array $atts Shortcode attributes.
253 *
254 * @return string
255 */
256 function give_receipt_shortcode( $atts ) {
257
258 global $give_receipt_args;
259
260 $give_receipt_args = shortcode_atts( array(
261 'error' => __( 'You are missing the payment key to view this donation receipt.', 'give' ),
262 'price' => true,
263 'donor' => true,
264 'date' => true,
265 'payment_key' => false,
266 'payment_method' => true,
267 'payment_id' => true,
268 'payment_status' => false,
269 'company_name' => false,
270 'status_notice' => true,
271 ), $atts, 'give_receipt' );
272
273 // set $session var
274 $session = give_get_purchase_session();
275
276 // set payment key var
277 if ( isset( $_GET['payment_key'] ) ) {
278 $payment_key = urldecode( $_GET['payment_key'] );
279 } elseif ( $session ) {
280 $payment_key = $session['purchase_key'];
281 } elseif ( $give_receipt_args['payment_key'] ) {
282 $payment_key = $give_receipt_args['payment_key'];
283 }
284
285 $email_access = give_get_option( 'email_access' );
286
287 // No payment_key found & Email Access is Turned on.
288 if ( ! isset( $payment_key ) && give_is_setting_enabled( $email_access ) && ! Give()->email_access->token_exists ) {
289
290 ob_start();
291
292 give_get_template_part( 'email-login-form' );
293
294 return ob_get_clean();
295
296 } elseif ( ! isset( $payment_key ) ) {
297
298 return Give()->notices->print_frontend_notice( $give_receipt_args['error'], false, 'error' );
299
300 }
301
302 $user_can_view = give_can_view_receipt( $payment_key );
303
304 // Key was provided, but user is logged out. Offer them the ability to login and view the receipt.
305 if ( ! $user_can_view && give_is_setting_enabled( $email_access ) && ! Give()->email_access->token_exists ) {
306
307 ob_start();
308
309 give_get_template_part( 'email-login-form' );
310
311 return ob_get_clean();
312
313 } elseif ( ! $user_can_view ) {
314
315 global $give_login_redirect;
316
317 $give_login_redirect = give_get_current_page_url();
318
319 ob_start();
320
321 Give()->notices->print_frontend_notice( apply_filters( 'give_must_be_logged_in_error_message', __( 'You must be logged in to view this donation receipt.', 'give' ) ) );
322
323 give_get_template_part( 'shortcode', 'login' );
324
325 $login_form = ob_get_clean();
326
327 return $login_form;
328 }
329
330 /**
331 * Check if the user has permission to view the receipt.
332 *
333 * If user is logged in, user ID is compared to user ID of ID stored in payment meta
334 * or if user is logged out and donation was made as a guest, the donation session is checked for
335 * or if user is logged in and the user can view sensitive shop data.
336 */
337 if ( ! apply_filters( 'give_user_can_view_receipt', $user_can_view, $give_receipt_args ) ) {
338 return Give()->notices->print_frontend_notice( $give_receipt_args['error'], false, 'error' );
339 }
340
341 ob_start();
342
343 give_get_template_part( 'shortcode', 'receipt' );
344
345 $display = ob_get_clean();
346
347 return $display;
348 }
349
350 add_shortcode( 'give_receipt', 'give_receipt_shortcode' );
351
352 /**
353 * Profile Editor Shortcode.
354 *
355 * Outputs the Give Profile Editor to allow users to amend their details from the
356 * front-end. This function uses the Give templating system allowing users to
357 * override the default profile editor template. The profile editor template is located
358 * under templates/profile-editor.php, however, it can be altered by creating a
359 * file called profile-editor.php in the give_template directory in your active theme's
360 * folder. Please visit the Give Documentation for more information on how the
361 * templating system is used.
362 *
363 * @since 1.0
364 *
365 * @param array $atts Shortcode attributes.
366 *
367 * @return string Output generated from the profile editor
368 */
369 function give_profile_editor_shortcode( $atts ) {
370
371 ob_start();
372
373 // Restrict access to donor profile, if donor and user are disconnected.
374 $is_donor_disconnected = get_user_meta( get_current_user_id(), '_give_is_donor_disconnected', true );
375 if ( is_user_logged_in() && $is_donor_disconnected ) {
376 Give()->notices->print_frontend_notice( __( 'Your Donor and User profile are no longer connected. Please contact the site administrator.', 'give' ), true, 'error' );
377 return false;
378 }
379
380 give_get_template_part( 'shortcode', 'profile-editor' );
381
382 $display = ob_get_clean();
383
384 return $display;
385 }
386
387 add_shortcode( 'give_profile_editor', 'give_profile_editor_shortcode' );
388
389 /**
390 * Process Profile Updater Form.
391 *
392 * Processes the profile updater form by updating the necessary fields.
393 *
394 * @since 1.0
395 *
396 * @param array $data Data sent from the profile editor.
397 *
398 * @return bool
399 */
400 function give_process_profile_editor_updates( $data ) {
401 // Profile field change request.
402 if ( empty( $_POST['give_profile_editor_submit'] ) && ! is_user_logged_in() ) {
403 return false;
404 }
405
406 // Nonce security.
407 if ( ! wp_verify_nonce( $data['give_profile_editor_nonce'], 'give-profile-editor-nonce' ) ) {
408 return false;
409 }
410
411 $user_id = get_current_user_id();
412 $old_user_data = get_userdata( $user_id );
413
414 /* @var Give_Donor $donor */
415 $donor = new Give_Donor( $user_id, true );
416 $old_company_name = $donor->get_company_name();
417
418 $display_name = isset( $data['give_display_name'] ) ? sanitize_text_field( $data['give_display_name'] ) : $old_user_data->display_name;
419 $first_name = isset( $data['give_first_name'] ) ? sanitize_text_field( $data['give_first_name'] ) : $old_user_data->first_name;
420 $last_name = isset( $data['give_last_name'] ) ? sanitize_text_field( $data['give_last_name'] ) : $old_user_data->last_name;
421 $company_name = ! empty( $data['give_company_name'] ) ? sanitize_text_field( $data['give_company_name'] ) : $old_company_name;
422 $email = isset( $data['give_email'] ) ? sanitize_email( $data['give_email'] ) : $old_user_data->user_email;
423 $password = ! empty( $data['give_new_user_pass1'] ) ? $data['give_new_user_pass1'] : '';
424 $confirm_password = ! empty( $data['give_new_user_pass2'] ) ? $data['give_new_user_pass2'] : '';
425
426 $userdata = array(
427 'ID' => $user_id,
428 'first_name' => $first_name,
429 'last_name' => $last_name,
430 'display_name' => $display_name,
431 'user_email' => $email,
432 'user_pass' => $password,
433 'company_name' => $company_name,
434 );
435
436 /**
437 * Fires before updating user profile.
438 *
439 * @since 1.0
440 *
441 * @param int $user_id The ID of the user.
442 * @param array $userdata User info, including ID, first name, last name, display name and email.
443 */
444 do_action( 'give_pre_update_user_profile', $user_id, $userdata );
445
446 // Make sure to validate first name of existing donors.
447 if ( empty( $first_name ) ) {
448 // Empty First Name.
449 give_set_error( 'empty_first_name', __( 'Please enter your first name.', 'give' ) );
450 }
451
452 // Make sure to validate passwords for existing Donors.
453 give_validate_user_password( $password, $confirm_password );
454
455 if ( empty( $email ) ) {
456 // Make sure email should not be empty.
457 give_set_error( 'email_empty', __( 'The email you entered is empty.', 'give' ) );
458
459 } elseif ( ! is_email( $email ) ) {
460 // Make sure email should be valid.
461 give_set_error( 'email_not_valid', __( 'The email you entered is not valid. Please use another', 'give' ) );
462
463 } elseif ( $email != $old_user_data->user_email ) {
464 // Make sure the new email doesn't belong to another user.
465 if ( email_exists( $email ) ) {
466 give_set_error( 'user_email_exists', __( 'The email you entered belongs to another user. Please use another.', 'give' ) );
467 } elseif ( Give()->donors->get_donor_by( 'email', $email ) ) {
468 // Make sure the new email doesn't belong to another user.
469 give_set_error( 'donor_email_exists', __( 'The email you entered belongs to another donor. Please use another.', 'give' ) );
470 }
471 }
472
473 // Check for errors.
474 $errors = give_get_errors();
475
476 if ( $errors ) {
477 // Send back to the profile editor if there are errors.
478 wp_redirect( $data['give_redirect'] );
479 give_die();
480 }
481
482 // Update Donor First Name and Last Name.
483 Give()->donors->update( $donor->id, array(
484 'name' => trim( "{$first_name} {$last_name}" ),
485 ) );
486 Give()->donor_meta->update_meta( $donor->id, '_give_donor_first_name', $first_name );
487 Give()->donor_meta->update_meta( $donor->id, '_give_donor_last_name', $last_name );
488 Give()->donor_meta->update_meta( $donor->id, '_give_donor_company', $company_name );
489
490 $current_user = wp_get_current_user();
491
492 // Compares new values with old values to detect change in values.
493 $email_update = ( $email !== $current_user->user_email ) ? true : false;
494 $display_name_update = ( $display_name !== $current_user->display_name ) ? true : false;
495 $first_name_update = ( $first_name !== $current_user->first_name ) ? true : false;
496 $last_name_update = ( $last_name !== $current_user->last_name ) ? true : false;
497 $company_name_update = ( $company_name !== $old_company_name ) ? true : false;
498 $update_code = 0;
499
500 /**
501 * True if update is done in display name, first name, last name or email.
502 *
503 * @var boolean
504 */
505 $profile_update = ( $email_update || $display_name_update || $first_name_update || $last_name_update || $company_name_update );
506
507 /**
508 * True if password fields are filled.
509 *
510 * @var boolean
511 */
512 $password_update = ( ! empty( $password ) && ! empty( $confirm_password ) );
513
514 if ( $profile_update ) {
515
516 // If only profile fields are updated.
517 $update_code = '1';
518
519 if ( $password_update ) {
520
521 // If profile fields AND password both are updated.
522 $update_code = '2';
523 }
524 } elseif ( $password_update ) {
525
526 // If only password is updated.
527 $update_code = '3';
528 }
529
530 // Update the user.
531 $updated = wp_update_user( $userdata );
532
533 if ( $updated ) {
534
535 /**
536 * Fires after updating user profile.
537 *
538 * @since 1.0
539 *
540 * @param int $user_id The ID of the user.
541 * @param array $userdata User info, including ID, first name, last name, display name and email.
542 */
543 do_action( 'give_user_profile_updated', $user_id, $userdata );
544
545 $profile_edit_redirect_args = array(
546 'updated' => 'true',
547 'update_code' => $update_code,
548 );
549
550 /**
551 * Update codes '2' and '3' indicate a password change.
552 * If the password is changed, then logout and redirect to the same page.
553 */
554 if ( '2' === $update_code || '3' === $update_code ) {
555 wp_logout( wp_redirect( add_query_arg( $profile_edit_redirect_args, $data['give_redirect'] ) ) );
556 } else {
557 wp_redirect( add_query_arg( $profile_edit_redirect_args, $data['give_redirect'] ) );
558 }
559
560 give_die();
561 }
562
563 return false;
564 }
565
566 add_action( 'give_edit_user_profile', 'give_process_profile_editor_updates' );
567
568 /**
569 * Give totals Shortcode.
570 *
571 * Shows a donation total.
572 *
573 * @since 2.1
574 *
575 * @param array $atts Shortcode attributes.
576 *
577 * @return string
578 */
579 function give_totals_shortcode( $atts ) {
580 $total = get_option( 'give_earnings_total', false );
581
582 $message = apply_filters( 'give_totals_message', __( 'Hey! We\'ve raised {total} of the {total_goal} we are trying to raise for this campaign!', 'give' ) );
583
584 $atts = shortcode_atts( array(
585 'total_goal' => 0, // integer
586 'ids' => 0, // integer|array
587 'cats' => 0, // integer|array
588 'tags' => 0, // integer|array
589 'message' => $message,
590 'link' => '', // URL
591 'link_text' => __( 'Donate Now', 'give' ), // string,
592 'progress_bar' => true, // boolean
593 ), $atts, 'give_totals' );
594
595 // Total Goal.
596 $total_goal = give_maybe_sanitize_amount( $atts['total_goal'] );
597
598 /**
599 * Give Action fire before the shortcode is rendering is started.
600 *
601 * @since 2.1.4
602 *
603 * @param array $atts shortcode attribute.
604 */
605 do_action( 'give_totals_goal_shortcode_before_render', $atts );
606
607 // Build query based on cat, tag and Form ids.
608 if ( ! empty( $atts['cats'] ) || ! empty( $atts['tags'] ) || ! empty( $atts['ids'] ) ) {
609
610 $form_ids = array();
611 if ( ! empty( $atts['ids'] ) ) {
612 $form_ids = array_filter( array_map( 'trim', explode( ',', $atts['ids'] ) ) );
613 }
614
615 /**
616 * Filter to modify WP Query for Total Goal.
617 *
618 * @since 2.1.4
619 *
620 * @param array WP query argument for Total Goal.
621 */
622 $form_args = array(
623 'post_type' => 'give_forms',
624 'post_status' => 'publish',
625 'post__in' => $form_ids,
626 'posts_per_page' => - 1,
627 'fields' => 'ids',
628 'tax_query' => array(
629 'relation' => 'AND',
630 ),
631 );
632
633 if ( ! empty( $atts['cats'] ) ) {
634 $cats = array_filter( array_map( 'trim', explode( ',', $atts['cats'] ) ) );
635 $form_args['tax_query'][] = array(
636 'taxonomy' => 'give_forms_category',
637 'terms' => $cats,
638 );
639 }
640
641 if ( ! empty( $atts['tags'] ) ) {
642 $tags = array_filter( array_map( 'trim', explode( ',', $atts['tags'] ) ) );
643 $form_args['tax_query'][] = array(
644 'taxonomy' => 'give_forms_tag',
645 'terms' => $tags,
646 );
647 }
648
649 /**
650 * Filter to modify WP Query for Total Goal.
651 *
652 * @since 2.1.4
653 *
654 * @param array $form_args WP query argument for Total Goal.
655 *
656 * @return array $form_args WP query argument for Total Goal.
657 */
658 $form_args = (array) apply_filters( 'give_totals_goal_shortcode_query_args', $form_args );
659
660 $forms = new WP_Query( $form_args );
661
662 if ( isset( $forms->posts ) ) {
663 $total = 0;
664 foreach ( $forms->posts as $post ) {
665 $form_earning = give_get_meta( $post, '_give_form_earnings', true );
666 $form_earning = ! empty( $form_earning ) ? $form_earning : 0;
667
668 /**
669 * Update Form earnings.
670 *
671 * @since 2.1
672 *
673 * @param int $post Form ID.
674 * @param string $form_earning Total earning of Form.
675 */
676 $total += apply_filters( 'give_totals_form_earning', $form_earning, $post );
677 }
678 }
679
680 }
681
682 // Append link with text.
683 $donate_link = '';
684 if ( ! empty( $atts['link'] ) ) {
685 $donate_link = sprintf( ' <a class="give-totals-text-link" href="%1$s">%2$s</a>', esc_url( $atts['link'] ), esc_html( $atts['link_text'] ) );
686 }
687
688 // Replace {total} in message.
689 $message = str_replace( '{total}', give_currency_filter(
690 give_format_amount( $total,
691 array( 'sanitize' => false )
692 )
693 ), esc_html( $atts['message'] ) );
694
695 // Replace {total_goal} in message.
696 $message = str_replace( '{total_goal}', give_currency_filter(
697 give_format_amount( $total_goal,
698 array( 'sanitize' => true )
699 )
700 ), $message );
701
702 /**
703 * Update Give totals shortcode output.
704 *
705 * @since 2.1
706 *
707 * @param string $message Shortcode Message.
708 * @param array $atts ShortCode attributes.
709 */
710 $message = apply_filters( 'give_totals_shortcode_message', $message, $atts );
711
712 ob_start();
713 ?>
714 <div class="give-totals-shortcode-wrap">
715 <?php
716 // Show Progress Bar if progress_bar set true.
717 $show_progress_bar = isset( $atts['progress_bar'] ) ? filter_var( $atts['progress_bar'], FILTER_VALIDATE_BOOLEAN ) : true;
718 if ( $show_progress_bar ) {
719 give_show_goal_totals_progress( $total, $total_goal );
720 }
721
722 echo sprintf( $message ) . $donate_link;
723 ?>
724 </div>
725 <?php
726 $give_totals_output = ob_get_clean();
727
728
729 /**
730 * Give Action fire after the total goal shortcode rendering is end.
731 *
732 * @since 2.1.4
733 *
734 * @param array $atts shortcode attribute.
735 * @param string $give_totals_output shortcode output.
736 */
737 do_action( 'give_totals_goal_shortcode_after_render', $atts, $give_totals_output );
738
739 /**
740 * Give Totals Shortcode output.
741 *
742 * @since 2.1
743 *
744 * @param string $give_totals_output
745 */
746 return apply_filters( 'give_totals_shortcode_output', $give_totals_output );
747
748 }
749
750 add_shortcode( 'give_totals', 'give_totals_shortcode' );
751
752
753 /**
754 * Displays donation forms in a grid layout.
755 *
756 * @since 2.1.0
757 *
758 * @param array $atts {
759 * Optional. Attributes of the form grid shortcode.
760 *
761 * @type int $forms_per_page Number of forms per page. Default '12'.
762 * @type bool $paged Whether to paginate forms. Default 'true'.
763 * @type string $ids A comma-separated list of form IDs to display. Default empty.
764 * @type string $cats A comma-separated list of form categories to display. Default empty.
765 * @type string $tags A comma-separated list of form tags to display. Default empty.
766 * @type string $columns Maximum columns to display. Default 'best-fit'.
767 * Accepts 'best-fit', '1', '2', '3', '4'.
768 * @type bool $show_title Whether to display form title. Default 'true'.
769 * @type bool $show_goal Whether to display form goal. Default 'true'.
770 * @type bool $show_excerpt Whether to display form excerpt. Default 'true'.
771 * @type bool $show_featured_image Whether to display featured image. Default 'true'.
772 * @type string $image_size Featured image size. Default 'medium'. Accepts WordPress image sizes.
773 * @type string $image_height Featured image height. Default 'auto'. Accepts valid CSS heights.
774 * @type int $excerpt_length Number of words before excerpt is truncated. Default '16'.
775 * @type string $display_style How the form is displayed, either in new page or modal popup.
776 * Default 'redirect'. Accepts 'redirect', 'modal'.
777 * }
778 * @return string|bool The markup of the form grid or false.
779 */
780 function give_form_grid_shortcode( $atts ) {
781 $form_ids = array();
782 $give_settings = give_get_settings();
783
784 $atts = shortcode_atts( array(
785 'forms_per_page' => 12,
786 'paged' => true,
787 'ids' => '',
788 'cats' => '',
789 'tags' => '',
790 'columns' => 'best-fit',
791 'show_title' => true,
792 'show_goal' => true,
793 'show_excerpt' => true,
794 'show_featured_image' => true,
795 'image_size' => 'medium',
796 'image_height' => 'auto',
797 'excerpt_length' => 16,
798 'display_style' => 'modal_reveal',
799 'status' => '' // open or closed
800 ), $atts );
801
802 // Validate integer attributes.
803 $atts['forms_per_page'] = intval( $atts['forms_per_page'] );
804 $atts['excerpt_length'] = intval( $atts['excerpt_length'] );
805
806 // Validate boolean attributes.
807 $boolean_attributes = array(
808 'paged',
809 'show_title',
810 'show_goal',
811 'show_excerpt',
812 'show_featured_image',
813 );
814
815 foreach ( $boolean_attributes as $att ) {
816 $atts[ $att ] = filter_var( $atts[ $att ], FILTER_VALIDATE_BOOLEAN );
817 }
818
819 // Set default form query args.
820 $form_args = array(
821 'post_type' => 'give_forms',
822 'post_status' => 'publish',
823 'posts_per_page' => $atts['forms_per_page'],
824 'tax_query' => array(
825 'relation' => 'AND',
826 ),
827 );
828
829 // Filter results of form grid based on form status.
830 $form_closed_status = trim( $atts['status'] );
831 if ( ! empty( $form_closed_status ) ) {
832 $form_args['meta_query'] = array(
833 array(
834 'key' => '_give_form_status',
835 'value' => $form_closed_status,
836 ),
837 );
838 }
839
840 // Maybe add pagination.
841 if ( true === $atts['paged'] ) {
842 $form_args['paged'] = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;
843 }
844
845 // Maybe filter forms by IDs.
846 if ( ! empty( $atts['ids'] ) ) {
847 $form_args['post__in'] = array_filter( array_map( 'trim', explode( ',', $atts['ids'] ) ) );
848 }
849
850 // Maybe filter by form category.
851 if ( ! empty( $atts['cats'] ) ) {
852 $cats = array_filter( array_map( 'trim', explode( ',', $atts['cats'] ) ) );
853 $tax_query = array(
854 'taxonomy' => 'give_forms_category',
855 'terms' => $cats,
856 );
857 $form_args['tax_query'][] = $tax_query;
858 }
859
860 // Maybe filter by form tag.
861 if ( ! empty( $atts['tags'] ) ) {
862 $tags = array_filter( array_map( 'trim', explode( ',', $atts['tags'] ) ) );
863 $tax_query = array(
864 'taxonomy' => 'give_forms_tag',
865 'terms' => $tags,
866 );
867 $form_args['tax_query'][] = $tax_query;
868 }
869
870 // Query to output donation forms.
871 $form_query = new WP_Query( $form_args );
872
873 if ( $form_query->have_posts() ) {
874 ob_start();
875
876 add_filter( 'add_give_goal_progress_class', 'add_give_goal_progress_class', 10, 1 );
877 add_filter( 'add_give_goal_progress_bar_class', 'add_give_goal_progress_bar_class', 10, 1 );
878 add_filter( 'give_form_wrap_classes', 'add_class_for_form_grid', 10, 3 );
879 add_action( 'give_donation_form_top', 'give_is_form_grid_page_hidden_field', 10, 3 );
880
881 echo '<div class="give-wrap">';
882 echo '<div class="give-grid give-grid--' . esc_attr( $atts['columns'] ) . '">';
883
884 while ( $form_query->have_posts() ) {
885 $form_query->the_post();
886
887 // Give/templates/shortcode-form-grid.php.
888 give_get_template( 'shortcode-form-grid', array( $give_settings, $atts ) );
889
890 }
891
892 wp_reset_postdata();
893
894 echo '</div><!-- .give-grid -->';
895
896 remove_filter( 'add_give_goal_progress_class', 'add_give_goal_progress_class' );
897 remove_filter( 'add_give_goal_progress_bar_class', 'add_give_goal_progress_bar_class' );
898 remove_filter( 'give_form_wrap_classes', 'add_class_for_form_grid', 10 );
899 remove_action( 'give_donation_form_top', 'give_is_form_grid_page_hidden_field', 10 );
900
901 if ( false !== $atts['paged'] ) {
902 $paginate_args = array(
903 'current' => max( 1, get_query_var( 'paged' ) ),
904 'total' => $form_query->max_num_pages,
905 'show_all' => false,
906 'end_size' => 1,
907 'mid_size' => 2,
908 'prev_next' => true,
909 'prev_text' => __( '« Previous', 'give' ),
910 'next_text' => __( 'Next »', 'give' ),
911 'type' => 'plain',
912 'add_args' => false,
913 );
914
915 printf(
916 '<div class="give-page-numbers">%s</div>',
917 paginate_links( $paginate_args )
918 );
919 }
920 echo '</div><!-- .give-wrap -->';
921
922 return ob_get_clean();
923 }
924 }
925
926 add_shortcode( 'give_form_grid', 'give_form_grid_shortcode' );
927