PluginProbe ʕ •ᴥ•ʔ
SureForms – Contact Form Builder, AI Forms, Payment Form, Survey & Quiz / 2.12.6
SureForms – Contact Form Builder, AI Forms, Payment Form, Survey & Quiz v2.12.6
2.12.6 2.12.5 2.12.4 2.12.3 2.12.2 2.12.1 2.12.0 2.11.1 2.11.0 2.10.1 2.10.0 2.9.1 2.9.0 2.8.2 2.8.1 2.7.0 2.7.1 2.8.0 trunk 0.0.10 0.0.11 0.0.12 0.0.13 0.0.2 0.0.3 0.0.4 0.0.5 0.0.6 0.0.7 0.0.8 0.0.9 1.0.0 1.0.1 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.1.0 1.1.1 1.1.2 1.10.0 1.10.1 1.11.0 1.12.0 1.12.1 1.12.2 1.12.3 1.13.0 1.13.1 1.13.2 1.2.0 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.3.0 1.3.1 1.3.2 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.5.0 1.5.1 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.7.0 1.7.1 1.7.2 1.7.3 1.7.4 1.8.0 1.9.0 1.9.1 2.0.0 2.0.1 2.0.2 2.1.0 2.1.1 2.2.0 2.2.1 2.2.2 2.3.0 2.4.0 2.5.0 2.5.2 2.6.0
sureforms / plugin-loader.php
sureforms Last commit date
admin 1 day ago assets 1 day ago images 2 months ago inc 1 day ago languages 1 day ago modules 2 weeks ago templates 4 weeks ago plugin-loader.php 1 day ago readme.txt 1 day ago sureforms.php 1 day ago wpml-config.xml 2 months ago
plugin-loader.php
367 lines
1 <?php
2 /**
3 * Plugin Loader.
4 *
5 * @package sureforms
6 * @since 0.0.1
7 */
8
9 namespace SRFM;
10
11 if ( ! defined( 'ABSPATH' ) ) {
12 exit; // Exit if accessed directly.
13 }
14
15 use SRFM\Admin\Admin;
16 use SRFM\Admin\Analytics;
17 use SRFM\Admin\Notice_Manager;
18 use SRFM\Inc\Abilities\Abilities_Registrar;
19 use SRFM\Inc\Activator;
20 use SRFM\Inc\Admin\Editor_Nudge;
21 use SRFM\Inc\Admin\Html_Form_Detector;
22 use SRFM\Inc\Admin_Ajax;
23 use SRFM\Inc\AI_Form_Builder\AI_Auth;
24 use SRFM\Inc\AI_Form_Builder\AI_Form_Builder;
25 use SRFM\Inc\AI_Form_Builder\AI_Helper;
26 use SRFM\Inc\AI_Form_Builder\Field_Mapping;
27 use SRFM\Inc\Background_Process;
28 use SRFM\Inc\Blocks\Register;
29 use SRFM\Inc\Compatibility\Multilingual\Multilingual_Manager;
30 use SRFM\Inc\Compatibility\Multilingual\String_Backfill;
31 use SRFM\Inc\Compatibility\Multilingual\String_Collector;
32 use SRFM\Inc\Compatibility\Themes\Astra;
33 use SRFM\Inc\Create_New_Form;
34 use SRFM\Inc\Database\Register as DatabaseRegister;
35 use SRFM\Inc\Duplicate_Form;
36 use SRFM\Inc\Events_Scheduler;
37 use SRFM\Inc\Export;
38 use SRFM\Inc\Form_Restriction;
39 use SRFM\Inc\Form_Submit;
40 use SRFM\Inc\Form_Views;
41 use SRFM\Inc\Forms_Data;
42 use SRFM\Inc\Frontend_Assets;
43 use SRFM\Inc\Generate_Form_Markup;
44 use SRFM\Inc\Global_Settings\Email_Summary;
45 use SRFM\Inc\Global_Settings\Global_Settings;
46 use SRFM\Inc\Global_Settings\Global_Settings_Defaults;
47 use SRFM\Inc\Gutenberg_Hooks;
48 use SRFM\Inc\Helper;
49 use SRFM\Inc\Learn;
50 // region: form-migration — Phase P1 foundation.
51 use SRFM\Inc\Migrator\Bootstrap as Migrator_Bootstrap;
52 // endregion: form-migration.
53 use SRFM\Inc\Onboarding;
54 use SRFM\Inc\Page_Builders\Page_Builders;
55 use SRFM\Inc\Payments\Payments;
56 use SRFM\Inc\Post_Types;
57 use SRFM\Inc\Rest_Api;
58 use SRFM\Inc\Single_Form_Settings\Compliance_Settings;
59 use SRFM\Inc\Single_Form_Settings\Form_Settings_Api;
60 use SRFM\Inc\Smart_Tags;
61 use SRFM\Inc\Updater;
62
63 /**
64 * Plugin_Loader
65 *
66 * @since 0.0.1
67 */
68 class Plugin_Loader {
69 /**
70 * Instance
71 *
72 * @access private
73 * @var object Class Instance.
74 * @since 0.0.1
75 */
76 private static $instance = null;
77
78 /**
79 * Constructor
80 *
81 * @since 0.0.1
82 */
83 public function __construct() {
84 if ( ! defined( 'SRFM_DIR' ) || ! defined( 'SRFM_FILE' ) ) {
85 return;
86 }
87 // Load the action scheduler before plugin loads.
88 require_once SRFM_DIR . 'inc/lib/action-scheduler/action-scheduler.php';
89
90 spl_autoload_register( [ $this, 'autoload' ] );
91
92 add_action( 'plugins_loaded', [ $this, 'load_textdomain' ] );
93 add_action( 'plugins_loaded', [ $this, 'load_plugin' ], 99 );
94 add_action( 'init', [ $this, 'load_classes' ] );
95 add_action( 'admin_init', [ $this, 'activation_redirect' ] );
96 Analytics::get_instance();
97 /**
98 * The code that runs during plugin activation
99 */
100 register_activation_hook(
101 SRFM_FILE,
102 static function () {
103 Activator::activate();
104 }
105 );
106
107 register_deactivation_hook(
108 SRFM_FILE,
109 static function () {
110 update_option( '__sureforms_do_redirect', false );
111 Events_Scheduler::unschedule_events( 'srfm_weekly_scheduled_events' );
112 Events_Scheduler::unschedule_events( 'srfm_daily_scheduled_action' );
113 }
114 );
115 }
116
117 /**
118 * Initiator
119 *
120 * @since 0.0.1
121 * @return object initialized object of class.
122 */
123 public static function get_instance() {
124 if ( null === self::$instance ) {
125 self::$instance = new self();
126
127 /**
128 * SureForms loaded.
129 *
130 * Fires when SureForms was fully loaded and instantiated.
131 *
132 * @since 0.0.1
133 */
134 do_action( 'srfm_core_loaded' );
135 }
136 return self::$instance;
137 }
138
139 /**
140 * Autoload classes.
141 *
142 * @param string $class class name.
143 * @return void
144 */
145 public function autoload( $class ) {
146 if ( 0 !== strpos( $class, __NAMESPACE__ ) ) {
147 return;
148 }
149
150 $filename = preg_replace(
151 [ '/^' . __NAMESPACE__ . '\\\/', '/([a-z])([A-Z])/', '/_/', '/\\\/' ],
152 [ '', '$1-$2', '-', DIRECTORY_SEPARATOR ],
153 $class
154 );
155
156 if ( ! is_string( $filename ) ) {
157 return;
158 }
159
160 // Check for directory traversal.
161 if ( strpos( $filename, '..' ) !== false ) {
162 return;
163 }
164
165 $filename = strtolower( $filename );
166
167 $file = SRFM_DIR . $filename . '.php';
168
169 // if the file is readable, include it.
170 if ( is_readable( $file ) ) {
171 require_once $file;
172 }
173 }
174
175 /**
176 * Activation Reset
177 *
178 * @return void
179 * @since 0.0.1
180 */
181 public function activation_redirect() {
182 // Avoid redirection in case of WP_CLI calls.
183 if ( defined( 'WP_CLI' ) && \WP_CLI ) {
184 return;
185 }
186
187 // Avoid redirection in case of ajax calls.
188 if ( wp_doing_ajax() ) {
189 return;
190 }
191
192 $do_redirect = apply_filters( 'srfm_enable_redirect_activation', get_option( '__srfm_do_redirect' ) );
193
194 if ( $do_redirect ) {
195
196 update_option( '__srfm_do_redirect', false );
197
198 if ( ! is_multisite() ) {
199 wp_safe_redirect(
200 add_query_arg(
201 [
202 'page' => 'sureforms_menu',
203 'srfm-activation-redirect' => true,
204 ],
205 admin_url( 'admin.php' )
206 )
207 );
208 exit;
209 }
210 }
211 }
212
213 /**
214 * Load Classes.
215 *
216 * @return void
217 * @since 0.0.1
218 */
219 public function load_classes() {
220
221 Register::get_instance();
222 if ( is_admin() ) {
223 Admin::get_instance();
224 // phpcs:ignore /** @phpstan-ignore-next-line */ -- Class is loaded dynamically in WordPress
225 Notice_Manager::get_instance();
226 Editor_Nudge::get_instance();
227 }
228 // Always instantiate — script enqueue is self-gated by `allow_load()`,
229 // while the REST endpoint for converting HTML forms must register
230 // outside the admin context (REST dispatch runs with `is_admin()` ===
231 // false, so admin-only instantiation would 404 the endpoint).
232 Html_Form_Detector::get_instance();
233 Payments::get_instance();
234 Duplicate_Form::get_instance();
235 Learn::get_instance();
236 }
237
238 /**
239 * Load Plugin Text Domain.
240 * This will load the translation textdomain depending on the file priorities.
241 * 1. Global Languages /wp-content/languages/sureforms/ folder
242 * 2. Local directory /wp-content/plugins/sureforms/languages/ folder
243 *
244 * @since 0.0.1
245 * @return void
246 */
247 public function load_textdomain() {
248 // Default languages directory.
249 $lang_dir = SRFM_DIR . 'languages/';
250
251 /**
252 * Filters the languages directory path to use for plugin.
253 *
254 * @param string $lang_dir The languages directory path.
255 */
256 $lang_dir = apply_filters( 'srfm_languages_directory', $lang_dir );
257
258 // Traditional WordPress plugin locale filter.
259 global $wp_version;
260
261 $get_locale = get_locale();
262
263 if ( $wp_version >= 4.7 ) {
264 $get_locale = get_user_locale();
265 }
266
267 /**
268 * Language Locale for plugin
269 *
270 * Uses get_user_locale()` in WordPress 4.7 or greater,
271 * otherwise uses `get_locale()`.
272 */
273 $locale = apply_filters( 'plugin_locale', $get_locale, 'sureforms' );//phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound -- wordpress hook
274 $mofile = sprintf( '%1$s-%2$s.mo', 'sureforms', $locale );
275
276 // Setup paths to current locale file.
277 $mofile_global = WP_LANG_DIR . '/plugins/' . $mofile;
278 $mofile_local = $lang_dir . $mofile;
279
280 if ( file_exists( $mofile_global ) ) {
281 // Look in global /wp-content/languages/sureforms/ folder.
282 load_textdomain( 'sureforms', $mofile_global );
283 } elseif ( file_exists( $mofile_local ) ) {
284 // Look in local /wp-content/plugins/sureforms/languages/ folder.
285 load_textdomain( 'sureforms', $mofile_local );
286 } else {
287 // Load the default language files.
288 // phpcs:ignore PluginCheck.CodeAnalysis.DiscouragedFunctions.load_plugin_textdomainFound -- Fallback when no global/local .mo override is present.
289 load_plugin_textdomain( 'sureforms', false, $lang_dir );
290 }
291 }
292
293 /**
294 * Loads plugin files.
295 *
296 * @since 0.0.1
297 *
298 * @return void
299 */
300 public function load_plugin() {
301 Post_Types::get_instance();
302 Form_Submit::get_instance();
303 Gutenberg_Hooks::get_instance();
304 Frontend_Assets::get_instance();
305 Helper::get_instance();
306 Activator::get_instance();
307 Admin_Ajax::get_instance();
308 Forms_Data::get_instance();
309 Form_Views::get_instance();
310 Export::get_instance();
311 Smart_Tags::get_instance();
312 Generate_Form_Markup::get_instance();
313 Create_New_Form::get_instance();
314 Global_Settings::get_instance();
315 Global_Settings_Defaults::get_instance();
316 Email_Summary::get_instance();
317 Compliance_Settings::get_instance();
318 Form_Settings_Api::get_instance();
319 Events_Scheduler::get_instance();
320 AI_Form_Builder::get_instance();
321 Field_Mapping::get_instance();
322 Background_Process::get_instance();
323 Page_Builders::get_instance();
324 Rest_Api::get_instance();
325 // region: form-migration — Phase P1 foundation.
326 Migrator_Bootstrap::get_instance();
327 // endregion: form-migration.
328 AI_Helper::get_instance();
329 AI_Auth::get_instance();
330 Updater::get_instance();
331 Onboarding::get_instance();
332 DatabaseRegister::init();
333 Form_Restriction::get_instance();
334 Abilities_Registrar::get_instance();
335 // Initializing Compatibilities.
336 Astra::get_instance();
337 Multilingual_Manager::get_instance();
338 String_Collector::get_instance();
339 String_Backfill::get_instance();
340
341 /**
342 * Load core files necessary for the Spectra block.
343 * This method is called in the Spectra block loader to ensure core files are loaded during the 'plugins_loaded' action.
344 *
345 * Note: This code is added at the bottom to ensure the form block is loaded first,
346 * followed by the Spectra blocks such as heading, image, and icon blocks.
347 */
348 $this->load_core_files();
349 }
350
351 /**
352 * Load Core Files.
353 *
354 * @since 0.0.1
355 *
356 * @return void
357 */
358 public function load_core_files() {
359 include_once SRFM_DIR . 'modules/gutenberg/classes/class-spec-block-loader.php';
360 }
361 }
362
363 /**
364 * Kicking this off by calling 'get_instance()' method
365 */
366 Plugin_Loader::get_instance();
367