PluginProbe
SureDonation – Donation Forms, Fundraising Campaigns & Donor Management / trunk
SureDonation – Donation Forms, Fundraising Campaigns & Donor Management vtrunk
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 trunk, at plugin-loader.php

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