PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.1.3
GiveWP – Donation Plugin and Fundraising Platform v2.1.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 / shortcodes.php
give / includes Last commit date
admin 8 years ago api 8 years ago deprecated 8 years ago donors 8 years ago emails 8 years ago forms 8 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-roles.php 8 years ago class-give-scripts.php 8 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 8 years ago shortcodes.php 8 years ago template-functions.php 8 years ago user-functions.php 8 years ago
shortcodes.php
888 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 /**
570 * Give totals Shortcode.
571 *
572 * Shows a donation total.
573 *
574 * @since 2.1
575 *
576 * @param array $atts Shortcode attributes.
577 *
578 * @return string
579 */
580 function give_totals_shortcode( $atts ) {
581 $total = get_option( 'give_earnings_total', false );
582
583 $message = apply_filters( 'give_totals_message', __( 'Hey! We\'ve raised {total} of the {total_goal} we are trying to raise for this campaign!', 'give' ) );
584
585 $atts = shortcode_atts( array(
586 'total_goal' => 0, // integer
587 'ids' => 0, // integer|array
588 'cats' => 0, // integer|array
589 'tags' => 0, // integer|array
590 'message' => $message,
591 'link' => '', // URL
592 'link_text' => __( 'Donate Now', 'give' ), // string,
593 'progress_bar' => true, // boolean
594 ), $atts, 'give_totals' );
595
596 // Total Goal.
597 $total_goal = give_maybe_sanitize_amount( $atts['total_goal'] );
598
599 // Build query based on cat, tag and Form ids.
600 if ( ! empty( $atts['cats'] ) || ! empty( $atts['tags'] ) || ! empty( $atts['ids'] ) ) {
601
602 $form_ids = array();
603 if ( ! empty( $atts['ids'] ) ) {
604 $form_ids = array_filter( array_map( 'trim', explode( ',', $atts['ids'] ) ) );
605 }
606
607 $form_args = array(
608 'post_type' => 'give_forms',
609 'post_status' => 'publish',
610 'post__in' => $form_ids,
611 'posts_per_page' => - 1,
612 'fields' => 'ids',
613 'tax_query' => array(
614 'relation' => 'AND',
615 ),
616 );
617
618 if ( ! empty( $atts['cats'] ) ) {
619 $cats = array_filter( array_map( 'trim', explode( ',', $atts['cats'] ) ) );
620 $form_args['tax_query'][] = array(
621 'taxonomy' => 'give_forms_category',
622 'terms' => $cats,
623 );
624 }
625
626 if ( ! empty( $atts['tags'] ) ) {
627 $tags = array_filter( array_map( 'trim', explode( ',', $atts['tags'] ) ) );
628 $form_args['tax_query'][] = array(
629 'taxonomy' => 'give_forms_tag',
630 'terms' => $tags,
631 );
632 }
633
634 $forms = new WP_Query( $form_args );
635
636 if ( isset( $forms->posts ) ) {
637 $total = 0;
638 foreach ( $forms->posts as $post ) {
639 $form_earning = give_get_meta( $post, '_give_form_earnings', true );
640 $form_earning = ! empty( $form_earning ) ? $form_earning : 0;
641
642 /**
643 * Update Form earnings.
644 *
645 * @since 2.1
646 *
647 * @param int $post Form ID.
648 * @param string $form_earning Total earning of Form.
649 */
650 $total += apply_filters( 'give_totals_form_earning', $form_earning, $post );
651 }
652 }
653
654 }
655
656 // Append link with text.
657 $donate_link = '';
658 if ( ! empty( $atts['link'] ) ) {
659 $donate_link = sprintf( ' <a class="give-totals-text-link" href="%1$s">%2$s</a>', esc_url( $atts['link'] ), esc_html( $atts['link_text'] ) );
660 }
661
662 // Replace {total} in message.
663 $message = str_replace( '{total}', give_currency_filter(
664 give_format_amount( $total,
665 array( 'sanitize' => false )
666 )
667 ), esc_html( $atts['message'] ) );
668
669 // Replace {total_goal} in message.
670 $message = str_replace( '{total_goal}', give_currency_filter(
671 give_format_amount( $total_goal,
672 array( 'sanitize' => true )
673 )
674 ), $message );
675
676 /**
677 * Update Give totals shortcode output.
678 *
679 * @since 2.1
680 *
681 * @param string $message Shortcode Message.
682 * @param array $atts ShortCode attributes.
683 */
684 $message = apply_filters( 'give_totals_shortcode_message', $message, $atts );
685
686 ob_start();
687 ?>
688 <div class="give-totals-shortcode-wrap">
689 <?php
690 // Show Progress Bar if progress_bar set true.
691 $show_progress_bar = isset( $atts['progress_bar'] ) ? filter_var( $atts['progress_bar'], FILTER_VALIDATE_BOOLEAN ) : true;
692 if ( $show_progress_bar ) {
693 give_show_goal_totals_progress( $total, $total_goal );
694 }
695
696 echo sprintf( $message ) . $donate_link;
697 ?>
698 </div>
699 <?php
700 $give_totals_output = ob_get_clean();
701
702 /**
703 * Give Totals Shortcode output.
704 *
705 * @since 2.1
706 *
707 * @param string $give_totals_output
708 */
709 return apply_filters( 'give_totals_shortcode_output', $give_totals_output );
710
711 }
712
713 add_shortcode( 'give_totals', 'give_totals_shortcode' );
714
715
716 /**
717 * Displays donation forms in a grid layout.
718 *
719 * @since 2.1.0
720 *
721 * @param array $atts {
722 * Optional. Attributes of the form grid shortcode.
723 *
724 * @type int $forms_per_page Number of forms per page. Default '12'.
725 * @type bool $paged Whether to paginate forms. Default 'true'.
726 * @type string $ids A comma-separated list of form IDs to display. Default empty.
727 * @type string $cats A comma-separated list of form categories to display. Default empty.
728 * @type string $tags A comma-separated list of form tags to display. Default empty.
729 * @type string $columns Maximum columns to display. Default 'best-fit'.
730 * Accepts 'best-fit', '1', '2', '3', '4'.
731 * @type bool $show_title Whether to display form title. Default 'true'.
732 * @type bool $show_goal Whether to display form goal. Default 'true'.
733 * @type bool $show_excerpt Whether to display form excerpt. Default 'true'.
734 * @type bool $show_featured_image Whether to display featured image. Default 'true'.
735 * @type string $image_size Featured image size. Default 'medium'. Accepts WordPress image sizes.
736 * @type string $image_height Featured image height. Default 'auto'. Accepts valid CSS heights.
737 * @type int $excerpt_length Number of words before excerpt is truncated. Default '16'.
738 * @type string $display_style How the form is displayed, either in new page or modal popup.
739 * Default 'redirect'. Accepts 'redirect', 'modal'.
740 * }
741 * @return string|bool The markup of the form grid or false.
742 */
743 function give_form_grid_shortcode( $atts ) {
744 $form_ids = array();
745 $give_settings = give_get_settings();
746
747 $atts = shortcode_atts( array(
748 'forms_per_page' => 12,
749 'paged' => true,
750 'ids' => '',
751 'cats' => '',
752 'tags' => '',
753 'columns' => 'best-fit',
754 'show_title' => true,
755 'show_goal' => true,
756 'show_excerpt' => true,
757 'show_featured_image' => true,
758 'image_size' => 'medium',
759 'image_height' => 'auto',
760 'excerpt_length' => 16,
761 'display_style' => 'modal_reveal',
762 'status' => '' // open or closed
763 ), $atts );
764
765 // Validate integer attributes.
766 $atts['forms_per_page'] = intval( $atts['forms_per_page'] );
767 $atts['excerpt_length'] = intval( $atts['excerpt_length'] );
768
769 // Validate boolean attributes.
770 $boolean_attributes = array(
771 'paged',
772 'show_title',
773 'show_goal',
774 'show_excerpt',
775 'show_featured_image',
776 );
777
778 foreach ( $boolean_attributes as $att ) {
779 $atts[ $att ] = filter_var( $atts[ $att ], FILTER_VALIDATE_BOOLEAN );
780 }
781
782 // Set default form query args.
783 $form_args = array(
784 'post_type' => 'give_forms',
785 'post_status' => 'publish',
786 'posts_per_page' => $atts['forms_per_page'],
787 'tax_query' => array(
788 'relation' => 'AND',
789 ),
790 );
791
792 // Filter results of form grid based on form status.
793 $form_closed_status = trim( $atts['status'] );
794 if ( ! empty( $form_closed_status ) ) {
795 $form_args['meta_query'] = array(
796 array(
797 'key' => '_give_form_status',
798 'value' => $form_closed_status,
799 ),
800 );
801 }
802
803 // Maybe add pagination.
804 if ( true === $atts['paged'] ) {
805 $form_args['paged'] = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;
806 }
807
808 // Maybe filter forms by IDs.
809 if ( ! empty( $atts['ids'] ) ) {
810 $form_args['post__in'] = array_filter( array_map( 'trim', explode( ',', $atts['ids'] ) ) );
811 }
812
813 // Maybe filter by form category.
814 if ( ! empty( $atts['cats'] ) ) {
815 $cats = array_filter( array_map( 'trim', explode( ',', $atts['cats'] ) ) );
816 $tax_query = array(
817 'taxonomy' => 'give_forms_category',
818 'terms' => $cats,
819 );
820 $form_args['tax_query'][] = $tax_query;
821 }
822
823 // Maybe filter by form tag.
824 if ( ! empty( $atts['tags'] ) ) {
825 $tags = array_filter( array_map( 'trim', explode( ',', $atts['tags'] ) ) );
826 $tax_query = array(
827 'taxonomy' => 'give_forms_tag',
828 'terms' => $tags,
829 );
830 $form_args['tax_query'][] = $tax_query;
831 }
832
833 // Query to output donation forms.
834 $form_query = new WP_Query( $form_args );
835
836 if ( $form_query->have_posts() ) {
837 ob_start();
838
839 add_filter( 'add_give_goal_progress_class', 'add_give_goal_progress_class', 10, 1 );
840 add_filter( 'add_give_goal_progress_bar_class', 'add_give_goal_progress_bar_class', 10, 1 );
841 add_filter( 'give_form_wrap_classes', 'add_class_for_form_grid', 10, 3 );
842 add_action( 'give_donation_form_top', 'give_is_form_grid_page_hidden_field', 10, 3 );
843
844 echo '<div class="give-wrap">';
845 echo '<div class="give-grid give-grid--' . esc_attr( $atts['columns'] ) . '">';
846
847 while ( $form_query->have_posts() ) {
848 $form_query->the_post();
849
850 // Give/templates/shortcode-form-grid.php.
851 give_get_template( 'shortcode-form-grid', array( $give_settings, $atts ) );
852
853 }
854
855 wp_reset_postdata();
856
857 echo '</div><!-- .give-grid -->';
858
859 remove_filter( 'add_give_goal_progress_class', 'add_give_goal_progress_class' );
860 remove_filter( 'add_give_goal_progress_bar_class', 'add_give_goal_progress_bar_class' );
861
862 if ( false !== $atts['paged'] ) {
863 $paginate_args = array(
864 'current' => max( 1, get_query_var( 'paged' ) ),
865 'total' => $form_query->max_num_pages,
866 'show_all' => false,
867 'end_size' => 1,
868 'mid_size' => 2,
869 'prev_next' => true,
870 'prev_text' => __( '« Previous', 'give' ),
871 'next_text' => __( 'Next »', 'give' ),
872 'type' => 'plain',
873 'add_args' => false,
874 );
875
876 printf(
877 '<div class="give-page-numbers">%s</div>',
878 paginate_links( $paginate_args )
879 );
880 }
881 echo '</div><!-- .give-wrap -->';
882
883 return ob_get_clean();
884 }
885 }
886
887 add_shortcode( 'give_form_grid', 'give_form_grid_shortcode' );
888