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