PluginProbe
CartFlows – Funnel Builder & Checkout Plugin for WooCommerce / 3.2.0
CartFlows – Funnel Builder & Checkout Plugin for WooCommerce v3.2.0
3.3.0 3.2.1 3.2.0 3.1.4 3.1.3 3.1.2 3.1.1 3.1.0 3.0.1 trunk 1.0.4 1.1.0 1.1.0.1 1.1.1 1.1.10 1.1.11 1.1.12 1.1.13 1.1.14 1.1.15 1.1.16 1.1.17 1.1.18 1.1.19 1.1.2 All 162 releases
cartflows / classes / class-cartflows-loader.php

class-cartflows-loader.php in CartFlows – Funnel Builder & Checkout Plugin for WooCommerce 3.2.0, at classes/class-cartflows-loader.php

761 lines 22.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * CartFlows Loader.
4 *
5 * @package CartFlows
6 */
7
8 // Exit if accessed directly.
9 if ( ! defined( 'ABSPATH' ) ) {
10 exit;
11 }
12 if ( ! class_exists( 'Cartflows_Loader' ) ) {
13
14 /**
15 * Class Cartflows_Loader.
16 */
17 final class Cartflows_Loader {
18
19 /**
20 * Member Variable
21 *
22 * @var instance
23 */
24 private static $instance = null;
25
26 /**
27 * Member Variable
28 *
29 * @var utils
30 */
31 public $utils = null;
32
33 /**
34 * Member Variable
35 *
36 * @var logger
37 */
38 public $logger = null;
39
40 /**
41 * Member Variable
42 *
43 * @var options
44 */
45 public $options = null;
46
47 /**
48 * Member Variable
49 *
50 * @var meta
51 */
52 public $meta = null;
53
54 /**
55 * Member Variable
56 *
57 * @var Tracking_Data
58 */
59 public $alldata;
60
61 /**
62 * Member Variable
63 *
64 * @var flow
65 */
66 public $flow = null;
67
68 /**
69 * Member Variable
70 *
71 * @var wcf_step_objs
72 */
73
74 public $wcf_step_objs = array();
75
76 /**
77 * Member Variable
78 *
79 * @var assets_vars
80 */
81 public $assets_vars = null;
82
83 /**
84 * Member Variable
85 *
86 * @var assets_vars
87 */
88
89 public $is_woo_active = true;
90
91 /**
92 * Initiator
93 */
94 public static function get_instance() {
95 if ( is_null( self::$instance ) ) {
96
97 self::$instance = new self();
98
99 /**
100 * CartFlows loaded.
101 *
102 * Fires when Cartflows was fully loaded and instantiated.
103 *
104 * @since 1.0.0
105 */
106 do_action( 'cartflows_loaded' );
107 }
108
109 return self::$instance;
110 }
111
112 /**
113 * Constructor
114 */
115 public function __construct() {
116 $this->define_constants();
117
118 // Activation hook.
119 register_activation_hook( CARTFLOWS_FILE, array( $this, 'activation_reset' ) );
120
121 // deActivation hook.
122 register_deactivation_hook( CARTFLOWS_FILE, array( $this, 'deactivation_reset' ) );
123
124 // Need to add library before the plugin loaded. https://actionscheduler.org/usage/.
125 require_once CARTFLOWS_DIR . '/libraries/action-scheduler/action-scheduler.php';
126
127 add_action( 'plugins_loaded', array( $this, 'load_plugin' ), 99 );
128 add_action( 'init', array( $this, 'load_cf_textdomain' ) );
129
130 // Priority 5 mirrors Astra's init_bsf_analytics() pattern: set_entity() must
131 // run before BSF_Analytics_Loader::load_analytics() fires at priority 10.
132 add_action( 'init', array( $this, 'deactivation_survey_data_handler' ), 5 );
133 }
134
135 /**
136 * Defines all constants
137 *
138 * @since 1.0.0
139 */
140 public function define_constants() {
141
142 define( 'CARTFLOWS_BASE', plugin_basename( CARTFLOWS_FILE ) );
143 define( 'CARTFLOWS_DIR', plugin_dir_path( CARTFLOWS_FILE ) );
144 define( 'CARTFLOWS_URL', plugins_url( '/', CARTFLOWS_FILE ) );
145
146 define( 'CARTFLOWS_VER', '3.2.0' );
147 define( 'CARTFLOWS_SLUG', 'cartflows' );
148 define( 'CARTFLOWS_SETTINGS', 'cartflows_settings' );
149 define( 'CARTFLOWS_NAME', 'CartFlows' );
150
151 define( 'CARTFLOWS_REQ_CF_PRO_VER', '3.2.0' );
152
153 // Resolves to true for users upgrading from <3.0.0 (set by Cartflows_Update on first 3.0+ admin_init)
154 // and stays true until the user opts out via the Advanced-tab toggle or the legacy in-app switch.
155 // Fresh installs never see this option set, so they default to the new UI. The toggle saves
156 // 'enable'/'disable' strings; older code paths may have stored a boolean true — accept both.
157 $cartflows_legacy_admin_saved = get_option( 'cartflows-legacy-admin', false );
158 define( 'CARTFLOWS_LEGACY_ADMIN', in_array( $cartflows_legacy_admin_saved, array( true, 1, '1', 'enable', 'yes' ), true ) );
159
160 define( 'CARTFLOWS_ASSETS_VERSION', get_option( 'cartflows-assets-version', time() ) );
161
162 define( 'CARTFLOWS_FLOW_POST_TYPE', 'cartflows_flow' );
163 define( 'CARTFLOWS_STEP_POST_TYPE', 'cartflows_step' );
164
165 define( 'CARTFLOWS_FLOW_PERMALINK_SLUG', 'flow' );
166 define( 'CARTFLOWS_STEP_PERMALINK_SLUG', 'step' );
167
168 if ( ! defined( 'CARTFLOWS_SERVER_URL' ) ) {
169 define( 'CARTFLOWS_SERVER_URL', 'https://my.cartflows.com/' );
170 }
171 if ( ! defined( 'CARTFLOWS_DOMAIN_URL' ) ) {
172 define( 'CARTFLOWS_DOMAIN_URL', 'https://cartflows.com/' );
173 }
174 if ( ! defined( 'CARTFLOWS_TEMPLATES_URL' ) ) {
175 define( 'CARTFLOWS_TEMPLATES_URL', 'https://templates.cartflows.com/' );
176 }
177 define( 'CARTFLOWS_TAXONOMY_STEP_TYPE', 'cartflows_step_type' );
178 define( 'CARTFLOWS_TAXONOMY_STEP_FLOW', 'cartflows_step_flow' );
179
180 if ( ! defined( 'CARTFLOWS_TAXONOMY_STEP_PAGE_BUILDER' ) ) {
181 define( 'CARTFLOWS_TAXONOMY_STEP_PAGE_BUILDER', 'cartflows_step_page_builder' );
182 }
183 if ( ! defined( 'CARTFLOWS_TAXONOMY_FLOW_PAGE_BUILDER' ) ) {
184 define( 'CARTFLOWS_TAXONOMY_FLOW_PAGE_BUILDER', 'cartflows_flow_page_builder' );
185 }
186 if ( ! defined( 'CARTFLOWS_TAXONOMY_FLOW_CATEGORY' ) ) {
187 define( 'CARTFLOWS_TAXONOMY_FLOW_CATEGORY', 'cartflows_flow_category' );
188 }
189
190 if ( ! defined( 'CARTFLOWS_LOG_DIR' ) ) {
191
192 $upload_dir = wp_upload_dir( null, false );
193
194 define( 'CARTFLOWS_LOG_DIR', $upload_dir['basedir'] . '/cartflows-logs/' );
195 }
196
197 $cookie_prefix = '';
198
199 if ( defined( 'CARTFLOWS_COOKIE_PREFIX' ) ) {
200 $cookie_prefix = CARTFLOWS_COOKIE_PREFIX;
201 }
202
203 define( 'CARTFLOWS_ACTIVE_CHECKOUT', $cookie_prefix . 'wcf_active_checkout' );
204
205 define( 'CARTFLOWS_PINTEREST_CONSENT', $cookie_prefix . 'cartflows_pinterest_consent' );
206
207 if ( ! defined( 'CARTFLOWS_HTTPS' ) ) {
208 define( 'CARTFLOWS_HTTPS', is_ssl() ? true : false );
209 }
210
211 define( 'CARTFLOWS_NPS_WEBHOOK_URL', 'https://webhook.ottokit.com/ottokit/af2151cc-6fe3-40a4-a9d3-12859be4d602' );
212
213 $GLOBALS['wcf_step'] = null;
214 }
215
216 /**
217 * Get site slug
218 *
219 * @since 1.6.15
220 * @return string
221 */
222 public function get_site_slug() {
223 return Cartflows_Helper::get_common_setting( 'default_page_builder' );
224 }
225
226 /**
227 * Get site URL
228 *
229 * @since 1.6.15
230 * @param string $page_builder_slug Page builder slug.
231 * @return string
232 */
233 public function get_site_url( $page_builder_slug = '' ) {
234
235 $page_builder_slug = ( ! empty( $page_builder_slug ) ) ? $page_builder_slug : wcf()->get_site_slug();
236
237 if ( ! empty( $page_builder_slug ) ) {
238 return trailingslashit( CARTFLOWS_TEMPLATES_URL ) . $page_builder_slug . '/';
239 }
240
241 return CARTFLOWS_TEMPLATES_URL;
242 }
243
244 /**
245 * Loads plugin files.
246 *
247 * @since 1.0.0
248 *
249 * @return void
250 */
251 public function load_plugin() {
252 $this->load_helper_files_components();
253 $this->load_core_files();
254 $this->load_core_components();
255
256 add_action( 'wp_loaded', array( $this, 'initialize' ) );
257 add_action( 'cartflows_pro_init', array( $this, 'after_cartflows_pro_init' ) );
258
259 if ( ! $this->is_woo_active ) {
260 add_action( 'admin_notices', array( $this, 'fails_to_load' ) );
261 }
262
263 /**
264 * CartFlows Init.
265 *
266 * Fires when Cartflows is instantiated.
267 *
268 * @since 1.0.0
269 */
270 do_action( 'cartflows_init' );
271 }
272
273 /**
274 * After CartFlows Pro init.
275 *
276 * @since 1.1.19
277 *
278 * @return void
279 */
280 public function after_cartflows_pro_init() {
281 if ( ! is_admin() ) {
282 return;
283 }
284
285 if ( version_compare( CARTFLOWS_PRO_VER, CARTFLOWS_REQ_CF_PRO_VER, '<' ) ) {
286 add_action( 'admin_notices', array( $this, 'required_cartflows_pro_notice' ) );
287 }
288
289 if ( version_compare( CARTFLOWS_PRO_VER, '1.11.14', '=' ) && 'starter' === CARTFLOWS_PRO_PLUGIN_TYPE ) {
290 add_action( 'admin_notices', array( $this, 'show_upgrade_starter_plan_notice' ) );
291 }
292 }
293
294 /**
295 * Show CartFlows Pro: Starter plan update Notice.
296 *
297 * @since 1.11.14
298 *
299 * @return void
300 */
301 public function show_upgrade_starter_plan_notice() {
302
303 $class = 'notice notice-warning wcf-notice';
304 /* translators: %s: html tags */
305 $message = sprintf( __( 'The new version of %1$s%3$s%2$s is released. Please download the latest zip to install the new updates. Click here to %4$sdownload%5$s.', 'cartflows' ), '<strong>', '</strong>', CARTFLOWS_PRO_DISPLAY_TITLE, '<a href="https://my.cartflows.com/" target="_blank">', '</a>' );
306
307 printf( '<div class="%1$s"><p>%2$s</p></div>', esc_attr( $class ), wp_kses_post( $message ) );
308 }
309
310 /**
311 * Required CartFlows Pro Notice.
312 *
313 * @since 1.1.19
314 *
315 * @return void
316 */
317 public function required_cartflows_pro_notice() {
318 $required_pro_version = CARTFLOWS_REQ_CF_PRO_VER;
319
320 $class = 'notice notice-warning wcf-notice';
321 /* translators: %s: html tags */
322 $message = sprintf( __( 'You are using an older version of %1$s%3$s%2$s. Please update %1$s%3$s%2$s plugin to version %1$s%4$s%2$s or higher.', 'cartflows' ), '<strong>', '</strong>', CARTFLOWS_PRO_DISPLAY_TITLE, $required_pro_version );
323
324 printf( '<div class="%1$s"><p>%2$s</p></div>', esc_attr( $class ), wp_kses_post( $message ) );
325 }
326
327 /**
328 * Load Helper Files and Components.
329 *
330 * @since 1.0.0
331 *
332 * @return void
333 */
334 public function load_helper_files_components() {
335 $this->is_woo_active = function_exists( 'WC' );
336
337 /* Public Utils */
338 include_once CARTFLOWS_DIR . 'classes/class-cartflows-utils.php';
339
340 /* Public Global Name space Functions */
341 include_once CARTFLOWS_DIR . 'classes/class-cartflows-functions.php';
342
343 /* Admin Helper */
344 include_once CARTFLOWS_DIR . 'classes/class-cartflows-helper.php';
345
346 /* Factory objects */
347 include_once CARTFLOWS_DIR . 'classes/class-cartflows-step-factory.php';
348
349 /* Meta Default Values */
350 include_once CARTFLOWS_DIR . 'classes/class-cartflows-default-meta.php';
351
352 require_once CARTFLOWS_DIR . 'classes/class-cartflows-tracking.php';
353 require_once CARTFLOWS_DIR . 'classes/class-cartflows-rollback.php';
354
355 if ( is_admin() ) {
356 require_once CARTFLOWS_DIR . 'libraries/astra-notices/class-bsf-admin-notices.php';
357 }
358
359 if ( ! class_exists( 'BSF_Analytics_Loader' ) ) {
360 require_once CARTFLOWS_DIR . 'libraries/bsf-analytics/class-bsf-analytics-loader.php';
361 }
362
363 $this->utils = Cartflows_Utils::get_instance();
364 $this->options = Cartflows_Default_Meta::get_instance();
365
366 // Plugin major update notice.
367 if ( ! class_exists( 'Cartflows_Plugin_Update_Notifications' ) ) {
368 require_once CARTFLOWS_DIR . 'libraries/cartflows-plugin-update-notifications/class-cartflows-plugin-update-notifications.php';
369 }
370
371 // Load the NPS Survey library.
372 if ( ! class_exists( 'Cartflows_Nps_Survey' ) ) {
373 require_once CARTFLOWS_DIR . 'libraries/class-cartflows-nps-survey.php';
374 }
375
376 // Load the CartFlows Pointer library.
377 if ( ! class_exists( 'Cartflows_Pointer' ) ) {
378 require_once CARTFLOWS_DIR . 'libraries/cartflows-pointer/class-cartflows-pointer.php';
379 }
380 }
381
382 /**
383 * Deactivation Survey Data Handler
384 *
385 * @since 2.1.17
386 *
387 * @return void
388 */
389 public function deactivation_survey_data_handler() {
390 $bsf_analytics = BSF_Analytics_Loader::get_instance();
391
392 $bsf_analytics->set_entity(
393 array(
394 'cf' => array(
395 'hide_optin_checkbox' => true,
396 'product_name' => 'CartFlows',
397 'usage_doc_link' => 'https://my.cartflows.com/usage-tracking/',
398 'path' => CARTFLOWS_DIR . 'libraries/bsf-analytics',
399 'author' => 'CartFlows Inc',
400 'deactivation_survey' => apply_filters(
401 'cartflows_bsf_analytics_deactivation_survey_data',
402 array(
403 array(
404 'id' => 'deactivation-survey-cartflows',
405 'popup_logo' => CARTFLOWS_URL . 'admin-core/assets/images/cartflows-icon.svg',
406 'plugin_slug' => 'cartflows',
407 'plugin_version' => CARTFLOWS_VER,
408 'popup_title' => __( 'Quick Feedback', 'cartflows' ),
409 'support_url' => 'https://cartflows.com/contact/',
410 'popup_description' => __( 'If you have a moment, please share why you are deactivating CartFlows:', 'cartflows' ),
411 'show_on_screens' => array( 'plugins' ),
412 ),
413 )
414 ),
415 ),
416 )
417 );
418 }
419
420 /**
421 * Init hooked function.
422 *
423 * @since 1.0.0
424 *
425 * @return void
426 */
427 public function initialize() {
428 $this->assets_vars = $this->utils->get_assets_path();
429 }
430
431 /**
432 * Load Core Files.
433 *
434 * @since 1.0.0
435 *
436 * @return void
437 */
438 public function load_core_files() {
439 /* Update compatibility. */
440 require_once CARTFLOWS_DIR . 'classes/class-cartflows-update.php';
441
442 /* Page builder compatibilty class */
443 include_once CARTFLOWS_DIR . 'compatibilities/class-cartflows-compatibility.php';
444
445 /* Theme support */
446 if ( $this->is_woo_active ) {
447 /* Woo hooks */
448 include_once CARTFLOWS_DIR . 'classes/class-cartflows-woo-hooks.php';
449 }
450
451 /* Importer */
452 include_once CARTFLOWS_DIR . 'classes/importer/class-cartflows-importer-loader.php';
453
454 /* Admin Meta Fields*/
455 include_once CARTFLOWS_DIR . 'classes/fields/typography/class-cartflows-font-families.php';
456
457 // Analytics — BSF Analytics Events integration. Loaded on every request so the
458 // bsf_core_stats filter is registered for both frontend and admin transmissions.
459 include_once CARTFLOWS_DIR . 'classes/class-cartflows-analytics.php';
460
461 if ( is_admin() ) {
462
463 /* Admin helper */
464 include_once CARTFLOWS_DIR . 'classes/class-cartflows-admin.php';
465
466 /* Dashboard widget — funnel performance summary on wp-admin/index.php. */
467 include_once CARTFLOWS_DIR . 'classes/class-cartflows-dashboard-widget.php';
468 }
469
470 /* Admin loader — fork between legacy (admin-legacy-core/) and current (admin-core/) UI. */
471 if ( defined( 'CARTFLOWS_LEGACY_ADMIN' ) && CARTFLOWS_LEGACY_ADMIN ) {
472 include_once CARTFLOWS_DIR . 'admin-legacy-loader.php';
473 } else {
474 include_once CARTFLOWS_DIR . 'admin-loader.php';
475 }
476
477 if ( class_exists( 'WP_CLI' ) ) {
478 /* WP-CLI registration follows the active UI tree. */
479 if ( defined( 'CARTFLOWS_LEGACY_ADMIN' ) && CARTFLOWS_LEGACY_ADMIN ) {
480 require_once CARTFLOWS_DIR . 'admin-legacy-core/inc/wp-cli.php';
481 } else {
482 require_once CARTFLOWS_DIR . 'admin-core/inc/wp-cli.php';
483 }
484 }
485
486 /* Logger */
487 include_once CARTFLOWS_DIR . 'classes/logger/class-cartflows-log-handler-interface.php';
488 include_once CARTFLOWS_DIR . 'classes/logger/class-cartflows-log-handler.php';
489 include_once CARTFLOWS_DIR . 'classes/logger/class-cartflows-log-handler-file.php';
490 include_once CARTFLOWS_DIR . 'classes/logger/class-cartflows-log-levels.php';
491 include_once CARTFLOWS_DIR . 'classes/logger/class-cartflows-logger-interface.php';
492 include_once CARTFLOWS_DIR . 'classes/logger/class-cartflows-wc-logger.php';
493
494 /* Core Modules */
495 include_once CARTFLOWS_DIR . 'classes/class-cartflows-logger.php';
496
497 /* Frontend Global */
498 include_once CARTFLOWS_DIR . 'classes/class-cartflows-frontend.php';
499 require_once CARTFLOWS_DIR . 'classes/class-cartflows-flow-frontend.php';
500
501 /* Modules */
502 include_once CARTFLOWS_DIR . 'modules/flow/class-cartflows-flow.php';
503 include_once CARTFLOWS_DIR . 'modules/landing/class-cartflows-landing.php';
504
505 if ( $this->is_woo_active ) {
506 include_once CARTFLOWS_DIR . 'modules/checkout/class-cartflows-checkout.php';
507 include_once CARTFLOWS_DIR . 'modules/thankyou/class-cartflows-thankyou.php';
508 include_once CARTFLOWS_DIR . 'modules/optin/class-cartflows-optin.php';
509 include_once CARTFLOWS_DIR . 'modules/woo-dynamic-flow/class-cartflows-woo-dynamic-flow.php';
510 include_once CARTFLOWS_DIR . 'modules/email-report/class-cartflows-admin-report-emails.php';
511 include_once CARTFLOWS_DIR . 'modules/frequently-bought-together/class-cartflows-fbt.php';
512 }
513
514 if ( class_exists( '\Elementor\Plugin' ) ) {
515 // Load the widgets.
516 include_once CARTFLOWS_DIR . 'modules/elementor/class-cartflows-el-widgets-loader.php';
517 }
518
519 if ( class_exists( 'FLBuilder' ) ) {
520
521 include_once CARTFLOWS_DIR . 'modules/beaver-builder/class-cartflows-bb-modules-loader.php';
522 }
523
524 include_once CARTFLOWS_DIR . 'classes/class-cartflows-admin-notices.php';
525
526 include_once CARTFLOWS_DIR . 'classes/deprecated/deprecated-hooks.php';
527
528 include_once CARTFLOWS_DIR . 'modules/gutenberg/classes/class-cartflows-block-loader.php';
529
530 // Abilities API (WordPress 6.9+).
531 require_once CARTFLOWS_DIR . 'abilities/class-cartflows-abilities-loader.php';
532 include_once CARTFLOWS_DIR . 'modules/webhook/class-cartflows-webhook-loader.php';
533
534 include_once CARTFLOWS_DIR . 'modules/content-generation/class-cartflows-ai-init.php';
535 }
536
537 /**
538 * Load Core Components.
539 *
540 * @since 1.0.0
541 *
542 * @return void
543 */
544 public function load_core_components() {
545 $this->logger = Cartflows_Logger::get_instance();
546 $this->flow = Cartflows_Flow_Frontend::get_instance();
547 }
548
549 /**
550 * Create files/directories.
551 */
552 public function create_files() {
553 // Install files and folders for uploading files and prevent hotlinking.
554 $upload_dir = wp_upload_dir();
555
556 $files = array(
557 array(
558 'base' => CARTFLOWS_LOG_DIR,
559 'file' => '.htaccess',
560 'content' => 'deny from all',
561 ),
562 array(
563 'base' => CARTFLOWS_LOG_DIR,
564 'file' => 'index.html',
565 'content' => '',
566 ),
567 );
568
569 foreach ( $files as $file ) {
570 if ( wp_mkdir_p( $file['base'] ) && ! file_exists( trailingslashit( $file['base'] ) . $file['file'] ) ) {
571 $file_handle = @fopen( trailingslashit( $file['base'] ) . $file['file'], 'w' ); // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged, WordPress.WP.AlternativeFunctions.file_system_read_fopen
572 if ( $file_handle ) {
573 fwrite( $file_handle, $file['content'] ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_read_fwrite, WordPressVIPMinimum.Functions.RestrictedFunctions.file_ops_fwrite
574 fclose( $file_handle ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_read_fclose
575 }
576 }
577 }
578 }
579
580 /**
581 * Load CartFlows Pro Text Domain.
582 * This will load the translation textdomain depending on the file priorities.
583 * 1. Global Languages /wp-content/languages/cartflows/ folder
584 * 2. Local dorectory /wp-content/plugins/cartflows/languages/ folder
585 *
586 * @since 1.0.3
587 * @return void
588 */
589 public function load_cf_textdomain() {
590 // Default languages directory for CartFlows Pro.
591 $lang_dir = CARTFLOWS_DIR . 'languages/';
592
593 /**
594 * Filters the languages directory path to use for CartFlows Pro.
595 *
596 * @param string $lang_dir The languages directory path.
597 */
598 $lang_dir = apply_filters( 'cartflows_languages_directory', $lang_dir );
599
600 // Traditional WordPress plugin locale filter.
601 global $wp_version;
602
603 $get_locale = get_locale();
604
605 if ( $wp_version >= 4.7 ) {
606 $get_locale = get_user_locale();
607 }
608
609 /**
610 * Language Locale for CartFlows Pro
611 *
612 * @var $get_locale The locale to use.
613 * Uses get_user_locale()` in WordPress 4.7 or greater,
614 * otherwise uses `get_locale()`.
615 */
616 $locale = apply_filters( 'plugin_locale', $get_locale, 'cartflows' );
617 $mofile = sprintf( '%1$s-%2$s.mo', 'cartflows', $locale );
618
619 // Setup paths to current locale file.
620 $mofile_local = $lang_dir . $mofile;
621 $mofile_global = WP_LANG_DIR . '/plugins/' . $mofile;
622
623 if ( file_exists( $mofile_global ) ) {
624 // Look in global /wp-content/languages/cartflows/ folder.
625 load_textdomain( 'cartflows', $mofile_global );
626 } elseif ( file_exists( $mofile_local ) ) {
627 // Look in local /wp-content/plugins/cartflows/languages/ folder.
628 load_textdomain( 'cartflows', $mofile_local );
629 } else {
630 // Load the default language files.
631 load_plugin_textdomain( 'cartflows', false, $lang_dir );
632 }
633 }
634
635 /**
636 * Fires admin notice when Elementor is not installed and activated.
637 *
638 * @since 1.0.0
639 *
640 * @return void
641 */
642 public function fails_to_load() {
643 $screen = get_current_screen();
644
645 if ( ! wcf()->utils->is_step_post_type() ) {
646 return;
647 }
648
649 if ( ! wcf()->utils->check_is_woo_required_page() ) {
650 return;
651 }
652
653 $skip_notice = false;
654
655 wp_localize_script( 'wcf-global-admin', 'cartflows_woo', array( 'show_update_post' => $skip_notice ) );
656
657 $class = 'notice notice-warning';
658 /* translators: %s: html tags */
659 $message = sprintf( __( 'This %1$sCartFlows%2$s page requires %1$sWooCommerce%2$s plugin installed & activated.', 'cartflows' ), '<strong>', '</strong>' );
660
661 $plugin = 'woocommerce/woocommerce.php';
662
663 if ( _is_woo_installed() ) {
664 if ( ! current_user_can( 'activate_plugins' ) ) {
665 return;
666 }
667
668 $action_url = wp_nonce_url( 'plugins.php?action=activate&amp;plugin=' . $plugin . '&amp;plugin_status=all&amp;paged=1&amp;s', 'activate-plugin_' . $plugin );
669 $button_label = __( 'Activate WooCommerce', 'cartflows' );
670 } else {
671 if ( ! current_user_can( 'install_plugins' ) ) {
672 return;
673 }
674
675 $action_url = wp_nonce_url( self_admin_url( 'update.php?action=install-plugin&plugin=woocommerce' ), 'install-plugin_woocommerce' );
676 $button_label = __( 'Install WooCommerce', 'cartflows' );
677 }
678
679 $button = '<p><a href="' . $action_url . '" class="button-primary">' . $button_label . '</a></p><p></p>';
680
681 printf( '<div class="%1$s"><p>%2$s</p>%3$s</div>', esc_attr( $class ), wp_kses_post( $message ), wp_kses_post( $button ) );
682 }
683
684 /**
685 * Activation Reset
686 */
687 public function activation_reset() {
688 if ( ! defined( 'CARTFLOWS_LOG_DIR' ) ) {
689
690 $upload_dir = wp_upload_dir( null, false );
691
692 define( 'CARTFLOWS_LOG_DIR', $upload_dir['basedir'] . '/cartflows-logs/' );
693 }
694
695 $this->create_files();
696 include_once CARTFLOWS_DIR . 'classes/class-cartflows-helper.php';
697 include_once CARTFLOWS_DIR . 'classes/class-cartflows-functions.php';
698 include_once CARTFLOWS_DIR . 'modules/flow/classes/class-cartflows-flow-post-type.php';
699 include_once CARTFLOWS_DIR . 'modules/flow/classes/class-cartflows-step-post-type.php';
700
701 Cartflows_Flow_Post_Type::get_instance()->flow_post_type();
702 Cartflows_Step_Post_Type::get_instance()->step_post_type();
703 // Required to flush rules while registering custom post type.
704 flush_rewrite_rules(); //phpcs:ignore WordPressVIPMinimum.Functions.RestrictedFunctions.flush_rewrite_rules_flush_rewrite_rules
705
706 // Update the cartflows asset version when plugin activated.
707 update_option( 'cartflows-assets-version', time() );
708
709 update_option( 'wcf_start_onboarding', true );
710
711 // Record install time for time-to-value analytics (only on fresh install).
712 Cartflows_Helper::set_analytics_flag( 'usage_installed_time', time() );
713 }
714
715 /**
716 * Deactivation Reset
717 */
718 public function deactivation_reset() {
719 }
720
721 /**
722 * Logger Class Instance
723 */
724 public function logger() {
725 return Cartflows_Logger::get_instance();
726 }
727 }
728
729 /**
730 * Prepare if class 'Cartflows_Loader' exist.
731 * Kicking this off by calling 'get_instance()' method
732 */
733 Cartflows_Loader::get_instance();
734 }
735
736 /**
737 * Get global class.
738 *
739 * @return object
740 */
741 function wcf() { //phpcs:ignore Universal.Files.SeparateFunctionsFromOO.Mixed
742 return Cartflows_Loader::get_instance();
743 }
744
745 if ( ! function_exists( '_is_woo_installed' ) ) {
746
747 /**
748 * Is woocommerce plugin installed.
749 *
750 * @since 1.0.0
751 *
752 * @access public
753 */
754 function _is_woo_installed() {
755 $path = 'woocommerce/woocommerce.php';
756 $plugins = get_plugins();
757
758 return isset( $plugins[ $path ] );
759 }
760 }
761