PluginProbe
Charitable – Donation & Fundraising Platform (Donation Forms, Recurring Donations & Fundraising Campaigns) / 1.4.16
Charitable – Donation & Fundraising Platform (Donation Forms, Recurring Donations & Fundraising Campaigns) v1.4.16
1.8.12.3 1.8.12.2 1.8.12.1 1.8.12 1.8.11.3 1.8.11.2 1.8.11.1 1.8.11 1.6.6 1.6.60 1.6.7 1.6.8 1.6.9 1.7.0 1.7.0.1 1.7.0.11 1.7.0.12 1.7.0.14 1.7.0.2 1.7.0.3 1.7.0.5 1.7.0.6 1.7.0.7 1.7.0.9 1.8.0 All 210 releases
charitable / charitable.php

charitable.php in Charitable – Donation & Fundraising Platform (Donation Forms, Recurring Donations & Fundraising Campaigns) 1.4.16, at charitable.php

790 lines 22.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Plugin Name: Charitable
4 * Plugin URI: https://www.wpcharitable.com
5 * Description: The WordPress fundraising alternative for non-profits, created to help non-profits raise money on their own website.
6 * Version: 1.4.16
7 * Author: WP Charitable
8 * Author URI: https://wpcharitable.com
9 * Requires at least: 4.1
10 * Tested up to: 4.7.4
11 *
12 * Text Domain: charitable
13 * Domain Path: /i18n/languages/
14 *
15 * @package Charitable
16 * @author Eric Daams
17 * @copyright Copyright (c) 2017, Studio 164a
18 * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License
19 */
20
21 if ( ! defined( 'ABSPATH' ) ) { exit; } // Exit if accessed directly
22
23 if ( ! class_exists( 'Charitable' ) ) :
24
25 /**
26 * Main Charitable class
27 *
28 * @class Charitable
29 * @version 1.4.0
30 */
31 class Charitable {
32
33 /**
34 * Current plugin version.
35 *
36 * @var string
37 */
38 const VERSION = '1.4.16';
39
40 /**
41 * Database version.
42 *
43 * @var string A date in the format: YYYYMMDD
44 */
45 const DB_VERSION = '20150615';
46
47 /**
48 * The Campaign post type.
49 *
50 * @var string
51 */
52 const CAMPAIGN_POST_TYPE = 'campaign';
53
54 /**
55 * The Donation post type.
56 *
57 * @var string
58 */
59 const DONATION_POST_TYPE = 'donation';
60
61 /**
62 * Single class object.
63 *
64 * @var Charitable
65 * @access private
66 */
67 private static $instance = null;
68
69 /**
70 * Directory path for the plugin.
71 *
72 * @var string
73 * @access private
74 */
75 private $directory_path;
76
77 /**
78 * Directory url for the plugin.
79 *
80 * @var string
81 * @access private
82 */
83 private $directory_url;
84
85 /**
86 * Directory path for the includes folder of the plugin.
87 *
88 * @var string
89 * @access private
90 */
91 private $includes_path;
92
93 /**
94 * Store of registered objects.
95 *
96 * @var array
97 * @access private
98 */
99 private $registry;
100
101 /**
102 * Donation factory instance.
103 *
104 * @var Charitable_Donation_Factory
105 */
106 public $donation_factory = null;
107
108 /**
109 * Create class instance.
110 *
111 * @since 1.0.0
112 */
113 public function __construct() {
114 $this->directory_path = plugin_dir_path( __FILE__ );
115 $this->directory_url = plugin_dir_url( __FILE__ );
116 $this->includes_path = $this->directory_path . 'includes/';
117
118 $this->load_dependencies();
119
120 register_activation_hook( __FILE__, array( $this, 'activate' ) );
121 register_deactivation_hook( __FILE__, array( $this, 'deactivate' ) );
122
123 add_action( 'plugins_loaded', array( $this, 'start' ), 1 );
124 }
125
126 /**
127 * Returns the original instance of this class.
128 *
129 * @return Charitable
130 * @since 1.0.0
131 */
132 public static function get_instance() {
133 return self::$instance;
134 }
135
136 /**
137 * Run the startup sequence.
138 *
139 * This is only ever executed once.
140 *
141 * @return void
142 * @access public
143 * @since 1.0.0
144 */
145 public function start() {
146 // If we've already started (i.e. run this function once before), do not pass go.
147 if ( $this->started() ) {
148 return;
149 }
150
151 // Set static instance.
152 self::$instance = $this;
153
154 // Factory to create new donation instances.
155 $this->donation_factory = new Charitable_Donation_Factory();
156
157 $this->maybe_start_ajax();
158
159 $this->attach_hooks_and_filters();
160
161 $this->maybe_start_admin();
162
163 $this->maybe_start_public();
164
165 Charitable_Addons::load( $this );
166 }
167
168 /**
169 * Include necessary files.
170 *
171 * @return void
172 * @access private
173 * @since 1.0.0
174 */
175 private function load_dependencies() {
176 $includes_path = $this->get_path( 'includes' );
177
178 /* Abstracts */
179 require_once( $includes_path . 'abstracts/class-charitable-form.php' );
180 require_once( $includes_path . 'abstracts/class-charitable-query.php' );
181 require_once( $includes_path . 'abstracts/class-charitable-start-object.php' );
182
183 /* Functions & Core Classes */
184 require_once( $includes_path . 'charitable-core-functions.php' );
185 require_once( $includes_path . 'charitable-utility-functions.php' );
186 require_once( $includes_path . 'class-charitable-locations.php' );
187 require_once( $includes_path . 'class-charitable-notices.php' );
188 require_once( $includes_path . 'class-charitable-post-types.php' );
189 require_once( $includes_path . 'class-charitable-request.php' );
190 require_once( $includes_path . 'class-charitable-cron.php' );
191 require_once( $includes_path . 'class-charitable-i18n.php' );
192
193 /* Addons */
194 require_once( $includes_path . 'addons/class-charitable-addons.php' );
195
196 /* Campaigns */
197 require_once( $includes_path . 'campaigns/charitable-campaign-functions.php' );
198 require_once( $includes_path . 'campaigns/class-charitable-campaign.php' );
199 require_once( $includes_path . 'campaigns/class-charitable-campaigns.php' );
200 require_once( $includes_path . 'campaigns/charitable-campaign-hooks.php' );
201
202 /* Currency */
203 require_once( $includes_path . 'currency/charitable-currency-functions.php' );
204 require_once( $includes_path . 'currency/class-charitable-currency.php' );
205
206 /* Donations */
207 require_once( $includes_path . 'donations/abstract-charitable-donation.php' );
208 require_once( $includes_path . 'donations/interface-charitable-donation-form.php' );
209 require_once( $includes_path . 'donations/class-charitable-donation-processor.php' );
210 require_once( $includes_path . 'donations/class-charitable-donation.php' );
211 require_once( $includes_path . 'donations/class-charitable-donation-factory.php' );
212 require_once( $includes_path . 'donations/class-charitable-donations.php' );
213 require_once( $includes_path . 'donations/class-charitable-donations-query.php' );
214 require_once( $includes_path . 'donations/class-charitable-donation-form.php' );
215 require_once( $includes_path . 'donations/class-charitable-donation-amount-form.php' );
216 require_once( $includes_path . 'donations/charitable-donation-hooks.php' );
217 require_once( $includes_path . 'donations/charitable-donation-functions.php' );
218
219 /* Users */
220 require_once( $includes_path . 'users/charitable-user-functions.php' );
221 require_once( $includes_path . 'users/class-charitable-user.php' );
222 require_once( $includes_path . 'users/class-charitable-roles.php' );
223 require_once( $includes_path . 'users/class-charitable-donor.php' );
224 require_once( $includes_path . 'users/class-charitable-donor-query.php' );
225
226 /* Gateways */
227 require_once( $includes_path . 'gateways/interface-charitable-gateway.php' );
228 require_once( $includes_path . 'gateways/class-charitable-gateways.php' );
229 require_once( $includes_path . 'gateways/abstract-class-charitable-gateway.php' );
230 require_once( $includes_path . 'gateways/class-charitable-gateway-offline.php' );
231 require_once( $includes_path . 'gateways/class-charitable-gateway-paypal.php' );
232
233 /* Emails */
234 require_once( $includes_path . 'emails/interface-charitable-email.php' );
235 require_once( $includes_path . 'emails/class-charitable-emails.php' );
236 require_once( $includes_path . 'emails/abstract-class-charitable-email.php' );
237 require_once( $includes_path . 'emails/class-charitable-email-new-donation.php' );
238 require_once( $includes_path . 'emails/class-charitable-email-donation-receipt.php' );
239 require_once( $includes_path . 'emails/class-charitable-email-campaign-end.php' );
240 require_once( $includes_path . 'emails/class-charitable-email-password-reset.php' );
241 require_once( $includes_path . 'emails/charitable-email-hooks.php' );
242
243 /* Database */
244 require_once( $includes_path . 'db/abstract-class-charitable-db.php' );
245 require_once( $includes_path . 'db/class-charitable-campaign-donations-db.php' );
246 require_once( $includes_path . 'db/class-charitable-donors-db.php' );
247
248 /* Licensing */
249 require_once( $includes_path . 'licensing/class-charitable-licenses.php' );
250 require_once( $includes_path . 'licensing/class-charitable-plugin-updater.php' );
251
252 /* Public */
253 require_once( $includes_path . 'public/charitable-page-functions.php' );
254 require_once( $includes_path . 'public/charitable-template-helpers.php' );
255 require_once( $includes_path . 'public/class-charitable-session.php' );
256 require_once( $includes_path . 'public/class-charitable-template.php' );
257 require_once( $includes_path . 'public/class-charitable-template-part.php' );
258 require_once( $includes_path . 'public/class-charitable-templates.php' );
259 require_once( $includes_path . 'public/class-charitable-ghost-page.php' );
260 require_once( $includes_path . 'public/class-charitable-user-dashboard.php' );
261
262 /* Shortcodes */
263 require_once( $includes_path . 'shortcodes/class-charitable-campaigns-shortcode.php' );
264 require_once( $includes_path . 'shortcodes/class-charitable-my-donations-shortcode.php' );
265 require_once( $includes_path . 'shortcodes/class-charitable-donation-receipt-shortcode.php' );
266 require_once( $includes_path . 'shortcodes/class-charitable-login-shortcode.php' );
267 require_once( $includes_path . 'shortcodes/class-charitable-registration-shortcode.php' );
268 require_once( $includes_path . 'shortcodes/class-charitable-profile-shortcode.php' );
269 require_once( $includes_path . 'shortcodes/charitable-shortcodes-hooks.php' );
270
271 /* Widgets */
272 require_once( $includes_path . 'widgets/class-charitable-widgets.php' );
273 require_once( $includes_path . 'widgets/class-charitable-campaign-terms-widget.php' );
274 require_once( $includes_path . 'widgets/class-charitable-campaigns-widget.php' );
275 require_once( $includes_path . 'widgets/class-charitable-donors-widget.php' );
276 require_once( $includes_path . 'widgets/class-charitable-donate-widget.php' );
277 require_once( $includes_path . 'widgets/class-charitable-donation-stats-widget.php' );
278
279 /* User Management */
280 require_once( $includes_path . 'user-management/class-charitable-registration-form.php' );
281 require_once( $includes_path . 'user-management/class-charitable-profile-form.php' );
282 require_once( $includes_path . 'user-management/class-charitable-forgot-password-form.php' );
283 require_once( $includes_path . 'user-management/class-charitable-reset-password-form.php' );
284 require_once( $includes_path . 'user-management/class-charitable-user-management.php' );
285 require_once( $includes_path . 'user-management/charitable-user-management-hooks.php' );
286
287 /* Customizer */
288 require_once( $includes_path . 'admin/customizer/class-charitable-customizer.php' );
289
290 /* Deprecated */
291 require_once( $includes_path . 'deprecated/charitable-deprecated-functions.php' );
292
293 /**
294 * We are registering this object only for backwards compatibility. It
295 * will be removed in or after Charitable 1.3.
296 *
297 * @deprecated
298 */
299 $this->register_object( Charitable_Emails::get_instance() );
300 $this->register_object( Charitable_Request::get_instance() );
301 $this->register_object( Charitable_Gateways::get_instance() );
302 $this->register_object( Charitable_i18n::get_instance() );
303 $this->register_object( Charitable_Post_Types::get_instance() );
304 $this->register_object( Charitable_Cron::get_instance() );
305 $this->register_object( Charitable_Widgets::get_instance() );
306 $this->register_object( Charitable_Licenses::get_instance() );
307 $this->register_object( Charitable_User_Dashboard::get_instance() );
308 }
309
310 /**
311 * Set up hook and filter callback functions.
312 *
313 * @return void
314 * @access private
315 * @since 1.0.0
316 */
317 private function attach_hooks_and_filters() {
318 add_action( 'wpmu_new_blog', array( $this, 'maybe_activate_charitable_on_new_site' ) );
319 add_action( 'plugins_loaded', array( $this, 'charitable_install' ), 100 );
320 add_action( 'plugins_loaded', array( $this, 'charitable_start' ), 100 );
321 add_action( 'setup_theme', array( 'Charitable_Customizer', 'start' ) );
322
323 /**
324 * We do this on priority 20 so that any functionality that is loaded on init (such
325 * as addons) has a chance to run before the event.
326 */
327 add_action( 'init', array( $this, 'do_charitable_actions' ), 20 );
328 add_filter( 'charitable_sanitize_donation_meta', 'charitable_sanitize_donation_meta', 10, 2 );
329 }
330
331 /**
332 * Checks whether we're in the admin area and if so, loads the admin-only functionality.
333 *
334 * @return void
335 * @access private
336 * @since 1.0.0
337 */
338 private function maybe_start_admin() {
339 if ( ! is_admin() ) {
340 return;
341 }
342
343 require_once( $this->get_path( 'admin' ) . 'class-charitable-admin.php' );
344 require_once( $this->get_path( 'admin' ) . 'charitable-admin-hooks.php' );
345
346 /**
347 * We are registering this object only for backwards compatibility. It
348 * will be removed in or after Charitable 1.3.
349 *
350 * @deprecated
351 */
352 $this->register_object( Charitable_Admin::get_instance() );
353 }
354
355 /**
356 * Checks whether we're on the public-facing side and if so, loads the public-facing functionality.
357 *
358 * @return void
359 * @access private
360 * @since 1.0.0
361 */
362 private function maybe_start_public() {
363 if ( is_admin() ) {
364 return;
365 }
366
367 require_once( $this->get_path( 'public' ) . 'class-charitable-public.php' );
368
369 /**
370 * We are registering this object only for backwards compatibility. It
371 * will be removed in or after Charitable 1.3.
372 *
373 * @deprecated
374 */
375 $this->register_object( Charitable_Public::get_instance() );
376 }
377
378 /**
379 * Checks whether we're executing an AJAX hook and if so, loads some AJAX functionality.
380 *
381 * @return void
382 * @access private
383 * @since 1.0.0
384 */
385 private function maybe_start_ajax() {
386 if ( false === ( defined( 'DOING_AJAX' ) && DOING_AJAX ) ) {
387 return;
388 }
389
390 require_once( $this->get_path( 'includes' ) . 'ajax/charitable-ajax-functions.php' );
391 require_once( $this->get_path( 'includes' ) . 'ajax/charitable-ajax-hooks.php' );
392
393 /**
394 * We are registering this object only for backwards compatibility. It
395 * will be removed in or after Charitable 1.3.
396 *
397 * @deprecated
398 */
399 $this->register_object( Charitable_Session::get_instance() );
400 }
401
402 /**
403 * This method is fired after all plugins are loaded and simply fires the charitable_start hook.
404 *
405 * Extensions can use the charitable_start event to load their own functionality.
406 *
407 * @return void
408 * @access public
409 * @since 1.0.0
410 */
411 public function charitable_start() {
412 do_action( 'charitable_start', $this );
413 }
414
415 /**
416 * Fires off an action right after Charitable is installed, allowing other
417 * plugins/themes to do something at this point.
418 *
419 * @return void
420 * @access public
421 * @since 1.0.1
422 */
423 public function charitable_install() {
424 $install = get_transient( 'charitable_install' );
425
426 if ( ! $install ) {
427 return;
428 }
429
430 require_once( $this->get_path( 'includes' ) . 'class-charitable-install.php' );
431
432 Charitable_Install::finish_installing();
433
434 do_action( 'charitable_install' );
435
436 delete_transient( 'charitable_install' );
437 }
438
439 /**
440 * Returns whether we are currently in the start phase of the plugin.
441 *
442 * @return bool
443 * @access public
444 * @since 1.0.0
445 */
446 public function is_start() {
447 return current_filter() == 'charitable_start';
448 }
449
450 /**
451 * Returns whether the plugin has already started.
452 *
453 * @return bool
454 * @access public
455 * @since 1.0.0
456 */
457 public function started() {
458 return did_action( 'charitable_start' ) || current_filter() == 'charitable_start';
459 }
460
461 /**
462 * Returns whether the plugin is being activated.
463 *
464 * @return bool
465 * @access public
466 * @since 1.0.0
467 */
468 public function is_activation() {
469 return current_filter() == 'activate_charitable/charitable.php';
470 }
471
472 /**
473 * Returns whether the plugin is being deactivated.
474 *
475 * @return bool
476 * @access public
477 * @since 1.0.0
478 */
479 public function is_deactivation() {
480 return current_filter() == 'deactivate_charitable/charitable.php';
481 }
482
483 /**
484 * Stores an object in the plugin's registry.
485 *
486 * @param mixed $object
487 * @return void
488 * @access public
489 * @since 1.0.0
490 */
491 public function register_object( $object ) {
492 if ( ! is_object( $object ) ) {
493 return;
494 }
495
496 $class = get_class( $object );
497
498 $this->registry[ $class ] = $object;
499 }
500
501 /**
502 * Returns a registered object.
503 *
504 * @param string $class The type of class you want to retrieve.
505 * @return mixed The object if its registered. Otherwise false.
506 * @access public
507 * @since 1.0.0
508 */
509 public function get_registered_object( $class ) {
510 return isset( $this->registry[ $class ] ) ? $this->registry[ $class ] : false;
511 }
512
513 /**
514 * Returns plugin paths.
515 *
516 * @param string $type If empty, returns the path to the plugin.
517 * @param bool $absolute_path If true, returns the file system path. If false, returns it as a URL.
518 * @return string
519 * @since 1.0.0
520 */
521 public function get_path( $type = '', $absolute_path = true ) {
522 $base = $absolute_path ? $this->directory_path : $this->directory_url;
523
524 switch ( $type ) {
525 case 'includes' :
526 $path = $base . 'includes/';
527 break;
528
529 case 'admin' :
530 $path = $base . 'includes/admin/';
531 break;
532
533 case 'public' :
534 $path = $base . 'includes/public/';
535 break;
536
537 case 'assets' :
538 $path = $base . 'assets/';
539 break;
540
541 case 'templates' :
542 $path = $base . 'templates/';
543 break;
544
545 case 'directory' :
546 $path = $base;
547 break;
548
549 default :
550 $path = __FILE__;
551 }
552
553 return $path;
554 }
555
556 /**
557 * Returns the plugin's version number.
558 *
559 * @return string
560 * @access public
561 * @since 1.0.0
562 */
563 public function get_version() {
564 $version = self::VERSION;
565
566 if ( false !== strpos( $version, '-' ) ) {
567 $parts = explode( '-', $version );
568 $version = $parts[0];
569 }
570
571 return $version;
572 }
573
574 /**
575 * Returns the public class.
576 *
577 * @return Charitable_Public
578 * @access public
579 * @since 1.0.0
580 */
581 public function get_public() {
582 return $this->get_registered_object( 'Charitable_Public' );
583 }
584
585 /**
586 * Returns the admin class.
587 *
588 * @return Charitable_Admin
589 * @access public
590 * @since 1.0.0
591 */
592 public function get_admin() {
593 return $this->get_registered_object( 'Charitable_Admin' );
594 }
595
596 /**
597 * Return the current request object.
598 *
599 * @return Charitable_Request
600 * @access public
601 * @since 1.0.0
602 */
603 public function get_request() {
604 $request = $this->get_registered_object( 'Charitable_Request' );
605
606 if ( false === $request ) {
607 $request = new Charitable_Request();
608 $this->register_object( $request );
609 }
610
611 return $request;
612 }
613
614 /**
615 * Returns the model for one of Charitable's database tables.
616 *
617 * @param string $table
618 * @return Charitable_DB
619 * @access public
620 * @since 1.0.0
621 */
622 public function get_db_table( $table ) {
623 $tables = $this->get_tables();
624
625 if ( ! isset( $tables[ $table ] ) ) {
626 _doing_it_wrong( __METHOD__, sprintf( 'Invalid table %s passed', $table ), '1.0.0' );
627 return null;
628 }
629
630 $class_name = $tables[ $table ];
631
632 $db_table = $this->get_registered_object( $class_name );
633
634 if ( false === $db_table ) {
635 $db_table = new $class_name;
636 $this->register_object( $db_table );
637 }
638
639 return $db_table;
640 }
641
642 /**
643 * Return the filtered list of registered tables.
644 *
645 * @return string[]
646 * @access private
647 * @since 1.0.0
648 */
649 private function get_tables() {
650 $default_tables = array(
651 'campaign_donations' => 'Charitable_Campaign_Donations_DB',
652 'donors' => 'Charitable_Donors_DB',
653 );
654
655 return apply_filters( 'charitable_db_tables', $default_tables );
656 }
657
658 /**
659 * Maybe activate Charitable when a new site is added in a multisite network.
660 *
661 * @param int $blog_id
662 * @return boolean
663 * @access public
664 * @since 1.4.6
665 */
666 public function maybe_activate_charitable_on_new_site( $blog_id ) {
667
668 if ( is_plugin_active_for_network( basename( $this->directory_path ) . '/charitable.php' ) ) {
669
670 switch_to_blog( $blog_id );
671
672 $this->activate( false );
673
674 restore_current_blog();
675 }
676 }
677
678 /**
679 * Runs on plugin activation.
680 *
681 * @see register_activation_hook
682 *
683 * @param boolean $network_wide Whether to enable the plugin for all sites in the network
684 * or just the current site. Multisite only. Default is false.
685 * @return void
686 * @access public
687 * @since 1.0.0
688 */
689 public function activate( $network_wide = false ) {
690
691 require_once( $this->get_path( 'includes' ) . 'class-charitable-install.php' );
692
693 if ( is_multisite() && $network_wide ) {
694
695 global $wpdb;
696
697 foreach ( $wpdb->get_col( "SELECT blog_id FROM $wpdb->blogs" ) as $blog_id ) {
698
699 switch_to_blog( $blog_id );
700
701 new Charitable_Install();
702
703 restore_current_blog();
704 }
705 } else {
706
707 new Charitable_Install();
708
709 }
710 }
711
712 /**
713 * Runs on plugin deactivation.
714 *
715 * @see register_deactivation_hook
716 *
717 * @return void
718 * @access public
719 * @since 1.0.0
720 */
721 public function deactivate() {
722 require_once( $this->get_path( 'includes' ) . 'class-charitable-uninstall.php' );
723 new Charitable_Uninstall();
724 }
725
726 /**
727 * If a charitable_action event is triggered, delegate the event using do_action.
728 *
729 * @return void
730 * @access public
731 * @since 1.0.0
732 */
733 public function do_charitable_actions() {
734 if ( isset( $_REQUEST['charitable_action'] ) ) {
735
736 $action = $_REQUEST['charitable_action'];
737
738 do_action( 'charitable_' . $action, 20 );
739 }
740 }
741
742 /**
743 * Throw error on object clone.
744 *
745 * This class is specifically designed to be instantiated once. You can retrieve the instance using charitable()
746 *
747 * @since 1.0.0
748 * @access public
749 * @return void
750 */
751 public function __clone() {
752 _doing_it_wrong( __FUNCTION__, __( 'Cheatin&#8217; huh?', 'charitable' ), '1.0.0' );
753 }
754
755 /**
756 * Disable unserializing of the class.
757 *
758 * @since 1.0.0
759 * @access public
760 * @return void
761 */
762 public function __wakeup() {
763 _doing_it_wrong( __FUNCTION__, __( 'Cheatin&#8217; huh?', 'charitable' ), '1.0.0' );
764 }
765
766 /**
767 * DEPRECATED METHODS
768 */
769
770 /**
771 * @deprecated
772 */
773 public function get_currency_helper() {
774 charitable_get_deprecated()->deprecated_function( __METHOD__, '1.4.0', 'charitable_get_currency_helper' );
775 return charitable_get_currency_helper();
776 }
777
778 /**
779 * @deprecated
780 */
781 public function get_location_helper() {
782 charitable_get_deprecated()->deprecated_function( __METHOD__, '1.2.0', 'charitable_get_location_helper' );
783 return charitable_get_location_helper();
784 }
785 }
786
787 $charitable = new Charitable();
788
789 endif;
790