PluginProbe
SureDonation – Donation Forms, Fundraising Campaigns & Donor Management / 1.6.1
SureDonation – Donation Forms, Fundraising Campaigns & Donor Management v1.6.1
1.6.1 1.6.0 1.5.1 1.5.0 1.4.0 1.3.0 trunk 0.0.1 1.0.0 1.1.0 1.1.1 1.1.2 1.2.0
suredonation / plugin-loader.php

plugin-loader.php in SureDonation – Donation Forms, Fundraising Campaigns & Donor Management 1.6.1, at plugin-loader.php

292 lines 8.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Plugin Loader
4 *
5 * @package SureDonation
6 */
7
8 namespace SureDonation;
9
10 use SureDonation\Inc\Admin\Admin;
11 use SureDonation\Inc\Admin\Admin_Ajax;
12 use SureDonation\Inc\Admin\Admin_Bar;
13 use SureDonation\Inc\Admin\Analytics;
14 use SureDonation\Inc\Admin\Notice_Manager;
15 use SureDonation\Inc\Admin\Notices;
16 use SureDonation\Inc\Ajax\Donation_Handler;
17 use SureDonation\Inc\Emails\Email_Handler;
18 use SureDonation\Inc\Emails\Email_Reports;
19 use SureDonation\Inc\Assets\Register as Assets_Register;
20 use SureDonation\Inc\Blocks\Register as Blocks_Register;
21 use SureDonation\Inc\Campaigns\Campaign_Cpt;
22 use SureDonation\Inc\Campaigns\Campaign_Meta_Tags;
23 use SureDonation\Inc\Campaigns\Campaign_Page;
24 use SureDonation\Inc\Database\Register as Database_Register;
25 use SureDonation\Inc\Donor_User_Link;
26 use SureDonation\Inc\FormEditor\Assets as FormEditor_Assets;
27 use SureDonation\Inc\Onboarding;
28 use SureDonation\Inc\Privacy\Privacy_Data;
29 use SureDonation\Inc\Payments\Offline\Offline_Frontend;
30 use SureDonation\Inc\Payments\Offline\Offline_Settings;
31 use SureDonation\Inc\Payments\PayPal\PayPal_Frontend;
32 use SureDonation\Inc\Payments\PayPal\PayPal_Settings;
33 use SureDonation\Inc\Payments\PayPal\PayPal_Webhook_Listener;
34 use SureDonation\Inc\Payments\Stripe\Stripe_Frontend;
35 use SureDonation\Inc\Payments\Stripe\Stripe_Settings;
36 use SureDonation\Inc\Payments\Stripe\Stripe_Webhook;
37 use SureDonation\Inc\Page_Builders\Page_Builders;
38 use SureDonation\Inc\Pdf\Pdf_Manager;
39 use SureDonation\Inc\Post_Types\Donation_Form;
40 use SureDonation\Inc\Rest_Api;
41 use SureDonation\Inc\Shortcodes\Donation_Form as Donation_Form_Shortcode;
42
43 // Exit if accessed directly.
44 if ( ! defined( 'ABSPATH' ) ) {
45 exit;
46 }
47
48 /**
49 * Main Plugin Class
50 *
51 * @since 0.0.1
52 */
53 final class Plugin_Loader {
54 /**
55 * Instance of this class.
56 *
57 * @var Plugin_Loader
58 */
59 private static $instance = null;
60
61 /**
62 * Constructor
63 */
64 private function __construct() {
65 $this->setup_autoloader();
66 $this->init_hooks();
67 }
68
69 /**
70 * Get instance of this class.
71 *
72 * @return Plugin_Loader
73 */
74 public static function get_instance() {
75 if ( null === self::$instance ) {
76 self::$instance = new self();
77 }
78 return self::$instance;
79 }
80
81 /**
82 * Autoload classes.
83 *
84 * @param string $class_name Class name.
85 * @return void
86 */
87 public function autoload( $class_name ) {
88 // Check if class belongs to our namespace.
89 if ( strpos( $class_name, 'SureDonation\\' ) !== 0 ) {
90 return;
91 }
92
93 // Remove namespace prefix.
94 $class_name = str_replace( 'SureDonation\\', '', $class_name );
95
96 // Remove 'Inc\' prefix if exists.
97 $class_name = str_replace( 'Inc\\', '', $class_name );
98
99 // Convert namespace separators to directory separators.
100 $class_name = str_replace( '\\', DIRECTORY_SEPARATOR, $class_name );
101
102 // Convert class name parts to lowercase with hyphens.
103 $parts = explode( DIRECTORY_SEPARATOR, $class_name );
104 $parts = array_map(
105 static function ( $part ) {
106 // Convert CamelCase to kebab-case.
107 $converted = preg_replace( '/([a-z])([A-Z])/', '$1-$2', $part );
108 return strtolower( str_replace( '_', '-', is_string( $converted ) ? $converted : $part ) );
109 },
110 $parts
111 );
112
113 $class_name = implode( DIRECTORY_SEPARATOR, $parts );
114
115 // Build file path.
116 $file = SUREDONATION_DIR . 'inc/' . $class_name . '.php';
117
118 // Load file if exists.
119 if ( file_exists( $file ) ) {
120 require_once $file;
121 }
122 }
123
124 /**
125 * Load plugin components.
126 *
127 * @return void
128 */
129 public function load_plugin() {
130 // Initialize database tables.
131 Database_Register::init();
132
133 // Back-fill notification identities once, in admin context only — it
134 // writes, and the path it repairs runs during donor payment requests.
135 add_action( 'admin_init', [ Email_Handler::class, 'backfill_notification_keys' ] );
136
137 // Initialize Campaign CPT.
138 Campaign_Cpt::get_instance();
139
140 // Initialize Campaign Page (default layout seeding + display block helpers).
141 Campaign_Page::get_instance();
142
143 // Output Open Graph / Twitter Card tags on singular campaign pages.
144 Campaign_Meta_Tags::get_instance();
145
146 // Page-builder integrations (Bricks now; each self-gates on the builder).
147 // Page-builder integrations (Elementor now; each self-gates on the builder).
148 Page_Builders::get_instance();
149
150 // Initialize Donation Form CPT.
151 Donation_Form::get_instance();
152
153 // Initialize Admin.
154 if ( is_admin() ) {
155 Admin::get_instance();
156 Admin_Ajax::get_instance();
157 Pdf_Manager::get_instance();
158 Onboarding::get_instance();
159 Notices::get_instance();
160 Notice_Manager::get_instance();
161 }
162
163 // Payment-mode toolbar indicator. Loaded outside is_admin() so it also
164 // appears in the front-end admin bar; it self-gates on capability.
165 Admin_Bar::get_instance();
166
167 // Initialize Analytics. Loaded outside is_admin() so usage events
168 // fired during REST requests (onboarding, campaign publish) are
169 // captured; the class gates its own admin-only behavior internally.
170 Analytics::get_instance();
171
172 // Initialize REST API.
173 Rest_Api::get_instance();
174
175 // Initialize blocks (must be before init hook fires).
176 Blocks_Register::get_instance();
177
178 // Initialize frontend assets.
179 Assets_Register::get_instance();
180
181 // Initialize form editor assets (sidebar, meta, etc.).
182 FormEditor_Assets::get_instance();
183
184 // Initialize AJAX handlers.
185 Donation_Handler::get_instance();
186
187 // Initialize shortcodes.
188 Donation_Form_Shortcode::get_instance();
189
190 // Register WordPress personal-data export/erase integration.
191 Privacy_Data::get_instance();
192
193 // Weekly donation digest: cron callback + schedule self-heal.
194 Email_Reports::get_instance();
195
196 // Initialize Stripe payment gateway.
197 Stripe_Settings::get_instance();
198 Stripe_Webhook::get_instance();
199 Stripe_Frontend::get_instance();
200
201 // Initialize Offline payment gateway.
202 Offline_Settings::get_instance();
203 Offline_Frontend::get_instance();
204
205 // Initialize PayPal payment gateway.
206 PayPal_Settings::get_instance();
207 PayPal_Frontend::get_instance();
208 PayPal_Webhook_Listener::get_instance();
209
210 // Initialize donor-user linking.
211 Donor_User_Link::get_instance();
212 }
213
214 /**
215 * Setup autoloader for plugin classes.
216 *
217 * @return void
218 */
219 private function setup_autoloader() {
220 spl_autoload_register( [ $this, 'autoload' ] );
221 }
222
223 /**
224 * Initialize plugin hooks.
225 *
226 * @return void
227 */
228 private function init_hooks() {
229 // Activation hook.
230 register_activation_hook(
231 SUREDONATION_FILE,
232 static function () {
233 // Reset rewrite rules.
234 delete_option( 'rewrite_rules' );
235
236 // Set redirect flag for onboarding.
237 update_option( '__suredonation_do_redirect', true );
238
239 // Record install time for the review-notice grace period.
240 // add_option is a no-op if the value already exists, so it
241 // never clobbers a real install time on re-activation.
242 add_option( 'suredonation_install_time', time() );
243
244 // Register the donor role.
245 if ( ! get_role( 'suredonation_donor' ) ) {
246 add_role(
247 'suredonation_donor',
248 __( 'Donor', 'suredonation' ),
249 [ 'read' => true ]
250 );
251 }
252 }
253 );
254
255 // Deactivation hook.
256 register_deactivation_hook(
257 SUREDONATION_FILE,
258 static function () {
259 update_option( '__suredonation_do_redirect', false );
260
261 // Otherwise the webhook reconciliation stays in cron after the
262 // plugin is gone, firing at a callback that no longer exists.
263 wp_clear_scheduled_hook( Stripe_Settings::WEBHOOK_SYNC_HOOK );
264 wp_clear_scheduled_hook( Email_Reports::CRON_HOOK );
265 wp_clear_scheduled_hook( PayPal_Settings::RELAY_REGISTER_HOOK );
266 }
267 );
268
269 // Ensure donor role exists (for upgrades without re-activation).
270 add_action(
271 'init',
272 static function () {
273 if ( ! get_role( 'suredonation_donor' ) ) {
274 add_role(
275 'suredonation_donor',
276 __( 'Donor', 'suredonation' ),
277 [ 'read' => true ]
278 );
279 }
280 // Load plugin text domain.
281 load_plugin_textdomain( 'suredonation', false, dirname( plugin_basename( SUREDONATION_FILE ) ) . '/languages' );
282 }
283 );
284
285 // Initialize plugin after WordPress loads.
286 add_action( 'plugins_loaded', [ $this, 'load_plugin' ], 99 );
287 }
288 }
289
290 // Initialize plugin.
291 Plugin_Loader::get_instance();
292