PluginProbe
CartFlows – Funnel Builder & Checkout Plugin for WooCommerce / 3.3.0
CartFlows – Funnel Builder & Checkout Plugin for WooCommerce v3.3.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
← All changes | classes/class-cartflows-admin.php +457 -398 1.1.0 → 3.3.0 View file →
@@ -1,398 +1,457 @@
1 -<?php
2 -/**
3 - * CartFlows Admin.
4 - *
5 - * @package CartFlows
6 - */
7 -
8 -/**
9 - * Class Cartflows_Admin.
10 - */
11 -class Cartflows_Admin {
12 -
13 - /**
14 - * Calls on initialization
15 - *
16 - * @since 1.0.0
17 - */
18 - public static function init() {
19 -
20 - self::initialise_plugin();
21 - self::init_hooks();
22 - }
23 -
24 - /**
25 - * Init Hooks.
26 - *
27 - * @since 1.0.0
28 - * @return void
29 - */
30 - static public function init_hooks() {
31 -
32 - if ( ! is_admin() ) {
33 - return;
34 - }
35 -
36 - include_once CARTFLOWS_DIR . 'classes/class-cartflows-admin-fields.php';
37 -
38 - // Add CARTFLOWS menu option to admin.
39 - add_action( 'network_admin_menu', __CLASS__ . '::menu' );
40 - add_action( 'admin_menu', __CLASS__ . '::menu' );
41 - add_action( 'admin_menu', __CLASS__ . '::submenu', 999 );
42 -
43 - add_action( 'cartflows_render_admin_content', __CLASS__ . '::render_content' );
44 -
45 - // Enqueue admin scripts.
46 - if ( isset( $_REQUEST['page'] ) && CARTFLOWS_SETTINGS == $_REQUEST['page'] ) {
47 -
48 - add_action( 'admin_enqueue_scripts', __CLASS__ . '::styles_scripts' );
49 -
50 - self::save_settings();
51 - }
52 -
53 - /* Global Addmin Script */
54 - add_action( 'admin_enqueue_scripts', __CLASS__ . '::global_admin_scripts', 20 );
55 -
56 - add_action( 'admin_footer', __CLASS__ . '::global_admin_data', 9555 );
57 - }
58 -
59 - /**
60 - * Initialises the Plugin Name.
61 - *
62 - * @since 1.0.0
63 - * @return void
64 - */
65 - static public function initialise_plugin() {
66 -
67 - $name = 'Cartflows';
68 - $short_name = 'Cflows';
69 -
70 - define( 'CARTFLOWS_PLUGIN_NAME', $name );
71 - define( 'CARTFLOWS_PLUGIN_SHORT_NAME', $short_name );
72 - }
73 -
74 - /**
75 - * Renders the admin settings menu.
76 - *
77 - * @since 1.0.0
78 - * @return void
79 - */
80 - static public function menu() {
81 -
82 - if ( ! current_user_can( 'manage_options' ) ) {
83 - return;
84 - }
85 -
86 - add_menu_page(
87 - 'CartFlows',
88 - 'CartFlows',
89 - 'manage_options',
90 - CARTFLOWS_SLUG,
91 - __CLASS__ . '::render',
92 - 'data:image/svg+xml;base64,' . base64_encode( file_get_contents( CARTFLOWS_DIR . 'assets/images/cartflows-icon.svg' ) ),
93 - 39.7
94 - );
95 -
96 - }
97 -
98 - /**
99 - * Add submenu to admin menu.
100 - *
101 - * @since 1.0.0
102 - */
103 - static function submenu() {
104 -
105 - $parent_slug = CARTFLOWS_SLUG;
106 - $page_title = __( 'Settings', 'cartflows' );
107 - $menu_title = __( 'Settings', 'cartflows' );
108 - $capability = 'manage_options';
109 - $menu_slug = 'cartflows_settings';
110 - $callback = __CLASS__ . '::render';
111 -
112 - add_submenu_page(
113 - $parent_slug,
114 - $page_title,
115 - $menu_title,
116 - $capability,
117 - $menu_slug,
118 - $callback
119 - );
120 - }
121 -
122 - /**
123 - * Renders the admin settings.
124 - *
125 - * @since 1.0.0
126 - * @return void
127 - */
128 - static public function render() {
129 - $action = ( isset( $_GET['action'] ) ) ? sanitize_text_field( $_GET['action'] ) : '';
130 - $action = ( ! empty( $action ) && '' != $action ) ? $action : 'general';
131 - $action = str_replace( '_', '-', $action );
132 -
133 - // Enable header icon filter below.
134 - $header_wrapper_class = apply_filters( 'cartflows_header_wrapper_class', array( $action ) );
135 -
136 - include_once CARTFLOWS_DIR . 'includes/admin/cartflows-admin.php';
137 - }
138 -
139 - /**
140 - * Renders the admin settings content.
141 - *
142 - * @since 1.0.0
143 - * @return void
144 - */
145 - static public function render_content() {
146 -
147 - $action = ( isset( $_GET['action'] ) ) ? sanitize_text_field( $_GET['action'] ) : '';
148 - $action = ( ! empty( $action ) && '' != $action ) ? $action : 'general';
149 - $action = str_replace( '_', '-', $action );
150 - $action = 'general';
151 -
152 - $header_wrapper_class = apply_filters( 'cartflows_header_wrapper_class', array( $action ) );
153 -
154 - include_once CARTFLOWS_DIR . 'includes/admin/cartflows-general.php';
155 - }
156 -
157 - /**
158 - * Save Global Setting options.
159 - *
160 - * @since 1.0.0
161 - */
162 - static public function save_common_settings() {
163 -
164 - if ( isset( $_POST['cartflows-common-settings-nonce'] ) && wp_verify_nonce( $_POST['cartflows-common-settings-nonce'], 'cartflows-common-settings' ) ) {
165 -
166 - $url = $_SERVER['REQUEST_URI'];
167 - $input_settings = array();
168 - $new_settings = array();
169 -
170 - if ( isset( $_POST['_cartflows_common'] ) ) {
171 -
172 - $input_settings = $_POST['_cartflows_common'];
173 -
174 - // Loop through the input and sanitize each of the values.
175 - foreach ( $input_settings as $key => $val ) {
176 -
177 - if ( is_array( $val ) ) {
178 - foreach ( $val as $k => $v ) {
179 - $new_settings[ $key ][ $k ] = ( isset( $val[ $k ] ) ) ? sanitize_text_field( $v ) : '';
180 - }
181 - } else {
182 - $new_settings[ $key ] = ( isset( $input_settings[ $key ] ) ) ? sanitize_text_field( $val ) : '';
183 - }
184 - }
185 - }
186 -
187 - Cartflows_Helper::update_admin_settings_option( '_cartflows_common', $new_settings, true );
188 -
189 - $query = array(
190 - 'message' => 'saved',
191 - );
192 -
193 - $redirect_to = add_query_arg( $query, $url );
194 -
195 - wp_redirect( $redirect_to );
196 - exit;
197 - } // End if statement.
198 - }
199 -
200 - /**
201 - * Check is cartflows admin.
202 - *
203 - * @since 1.0.0
204 - * @return boolean
205 - */
206 - static public function is_global_admin() {
207 -
208 - $current_screen = get_current_screen();
209 -
210 - if (
211 - is_object( $current_screen ) &&
212 - isset( $current_screen->post_type ) &&
213 - ( CARTFLOWS_FLOW_POST_TYPE === $current_screen->post_type ||
214 - CARTFLOWS_STEP_POST_TYPE === $current_screen->post_type
215 - )
216 - ) {
217 - return true;
218 - }
219 - return false;
220 - }
221 -
222 - /**
223 - * Check is flow admin.
224 - *
225 - * @since 1.0.0
226 - * @return boolean
227 - */
228 - static public function is_flow_edit_admin() {
229 -
230 - $current_screen = get_current_screen();
231 -
232 - if (
233 - is_object( $current_screen ) &&
234 - isset( $current_screen->post_type ) &&
235 - ( CARTFLOWS_FLOW_POST_TYPE === $current_screen->post_type ) &&
236 - isset( $current_screen->base ) &&
237 - ( 'post' === $current_screen->base )
238 - ) {
239 - return true;
240 - }
241 - return false;
242 - }
243 -
244 - /**
245 - * Global Admin Scripts.
246 - *
247 - * @since 1.0.0
248 - */
249 - static public function global_admin_scripts() {
250 -
251 - $localize = array(
252 - 'ajaxurl' => admin_url( 'admin-ajax.php' ),
253 - 'ajax_nonce' => wp_create_nonce( 'cartflows-nonce' ),
254 - );
255 -
256 - wp_localize_script( 'jquery', 'cartflows_admin', apply_filters( 'cartflows_admin_js_localize', $localize ) );
257 -
258 - if ( self::is_global_admin() ) {
259 -
260 - // Styles.
261 - wp_enqueue_style( 'cartflows-global-admin', CARTFLOWS_URL . 'admin/assets/css/global-admin.css', array(), CARTFLOWS_VER );
262 - wp_style_add_data( 'cartflows-global-admin', 'rtl', 'replace' );
263 -
264 - wp_enqueue_script(
265 - 'wcf-global-admin',
266 - CARTFLOWS_URL . 'admin/assets/js/global-admin.js',
267 - array( 'jquery' ),
268 - CARTFLOWS_VER,
269 - true
270 - );
271 -
272 - do_action( 'cartflows_global_admin_scripts' );
273 - }
274 - }
275 -
276 - /**
277 - * Global Admin Data.
278 - *
279 - * @since 1.0.0
280 - */
281 - static public function global_admin_data() {
282 -
283 - $current_screen = get_current_screen();
284 -
285 - if ( CARTFLOWS_FLOW_POST_TYPE !== $current_screen->post_type ) {
286 - return;
287 - }
288 -
289 - ?>
290 -
291 - <div id="wcf-remote-flow-importer" class="wcf-templates-popup-overlay">
292 - <div class="wcf-templates-popup-content">
293 - <div class="spinner"></div>
294 - <div class="wcf-templates-wrap wcf-templates-wrap-flows">
295 -
296 - <div id="wcf-remote-flow-actions" class="wcf-template-header">
297 - <div class="wcf-template-logo-wrap">
298 - <span class="wcf-cartflows-logo-img">
299 - <span class="cartflows-icon"></span>
300 - </span>
301 - <span class="wcf-cartflows-title"><?php _e( 'Flows Library', 'cartflows' ); ?></span>
302 - </div>
303 - <div class="wcf-tab-wrapper">
304 - <div id="wcf-page-builders">
305 - <ul class="wcf-page-builder-links filter-links">
306 - <li><a href="#" class="current" data-id="elementor"><?php _e( 'Elementor', 'cartflows' ); ?></a></li>
307 - <li><a href="#" data-id="divi"><?php _e( 'Divi', 'cartflows' ); ?></a></li>
308 - <li><a href="#" data-id="bb"><?php _e( 'Beaver Builder', 'cartflows' ); ?></a></li>
309 - </ul>
310 - </div>
311 - <!-- <div id="wcf-remote-flow-filters">
312 - <div id="cartflows-flow-funnel-type"></div>
313 - </div> -->
314 - </div>
315 - <div class="wcf-popup-close-wrap">
316 - <span class="close-icon"><span class="wcf-cartflow-icons dashicons dashicons-no"></span></span>
317 - </div>
318 - </div>
319 - <!-- <div class="wcf-search-form">
320 - <label class="screen-reader-text" for="wp-filter-search-input"><?php _e( 'Search Sites', 'cartflows' ); ?> </label>
321 - <input placeholder="<?php _e( 'Search Flow...', 'cartflows' ); ?>" type="text" aria-describedby="live-search-desc" class="wcf-flow-search-input">
322 - </div> -->
323 -
324 - <div id="wcf-remote-content">
325 - <div id="wcf-remote-flow-list" class="wcf-remote-list wcf-template-list-wrap"></div>
326 - <div id="wcf-upcoming-page-builders" style="display: none;" class="wcf-remote-list wcf-template-list-wrap"></div>
327 - </div>
328 - </div>
329 - </div>
330 - </div>
331 -
332 - <?php
333 - }
334 -
335 - /**
336 - * Enqueues the needed CSS/JS for the builder's admin settings page.
337 - *
338 - * @since 1.0.0
339 - */
340 - static public function styles_scripts() {
341 -
342 - // Styles.
343 - wp_enqueue_style( 'cartflows-admin-settings', CARTFLOWS_URL . 'admin/assets/css/admin-menu-settings.css', array(), CARTFLOWS_VER );
344 - wp_style_add_data( 'cartflows-admin-settings', 'rtl', 'replace' );
345 -
346 - // Script.
347 - wp_enqueue_script( 'cartflows-admin-settings', CARTFLOWS_URL . 'admin/assets/js/admin-menu-settings.js', array( 'jquery', 'wp-util', 'updates' ), CARTFLOWS_VER );
348 -
349 - $localize = array(
350 - 'ajax_nonce' => wp_create_nonce( 'cartflows-widget-nonce' ),
351 - );
352 -
353 - wp_localize_script( 'cartflows-admin-settings', 'cartflows', apply_filters( 'cartflows_js_localize', $localize ) );
354 - }
355 -
356 - /**
357 - * Save All admin settings here
358 - */
359 - static public function save_settings() {
360 -
361 - // Only admins can save settings.
362 - if ( ! current_user_can( 'manage_options' ) ) {
363 - return;
364 - }
365 -
366 - self::save_common_settings();
367 -
368 - // Let extensions hook into saving.
369 - do_action( 'cartflows_admin_settings_save' );
370 - }
371 -
372 - /**
373 - * Get and return page URL
374 - *
375 - * @param string $menu_slug Menu name.
376 - * @since 1.0.0
377 - * @return string page url
378 - */
379 - static public function get_page_url( $menu_slug ) {
380 -
381 - $parent_page = self::$default_menu_position;
382 -
383 - if ( strpos( $parent_page, '?' ) !== false ) {
384 - $query_var = '&page=' . self::$plugin_slug;
385 - } else {
386 - $query_var = '?page=' . self::$plugin_slug;
387 - }
388 -
389 - $parent_page_url = admin_url( $parent_page . $query_var );
390 -
391 - $url = $parent_page_url . '&action=' . $menu_slug;
392 -
393 - return esc_url( $url );
394 - }
395 -
396 -}
397 -
398 -Cartflows_Admin::init();
1 +<?php
2 +/**
3 + * CartFlows Admin.
4 + *
5 + * @package CartFlows
6 + */
7 +
8 +// Exit if accessed directly.
9 +if ( ! defined( 'ABSPATH' ) ) {
10 + exit;
11 +}
12 +/**
13 + * Class Cartflows_Admin.
14 + */
15 +class Cartflows_Admin {
16 +
17 + /**
18 + * Instance
19 + *
20 + * @access private
21 + * @var object Class object.
22 + * @since 1.0.0
23 + */
24 + private static $instance;
25 +
26 + /**
27 + * Initiator
28 + *
29 + * @since 1.0.0
30 + * @return object initialized object of class.
31 + */
32 + public static function get_instance() {
33 + if ( ! isset( self::$instance ) ) {
34 + self::$instance = new self();
35 + }
36 + return self::$instance;
37 + }
38 +
39 + /**
40 + * Constructor
41 + */
42 + public function __construct() {
43 +
44 + $this->init_hooks();
45 + }
46 +
47 + /**
48 + * Init Hooks.
49 + *
50 + * @since 1.0.0
51 + * @return void
52 + */
53 + public function init_hooks() {
54 +
55 + if ( ! is_admin() ) {
56 + return;
57 + }
58 +
59 + /* Add lite version class to body */
60 + add_action( 'admin_body_class', array( $this, 'add_admin_body_class' ) );
61 +
62 + add_filter( 'plugin_action_links_' . CARTFLOWS_BASE, array( $this, 'add_action_links' ) );
63 +
64 + add_action( 'admin_init', array( $this, 'flush_rules_after_save_permalinks' ) );
65 +
66 + add_filter( 'post_row_actions', array( $this, 'remove_flow_actions' ), 99, 2 );
67 +
68 + add_action( 'wp_dashboard_setup', array( $this, 'dashboard_widget' ) );
69 +
70 + add_action( 'init', array( $this, 'run_scheduled_docs_job' ) );
71 + add_action( 'cartflows_update_knowledge_base_data', array( $this, 'cartflows_update_knowledge_base_data' ) );
72 + add_action( 'admin_post_cartflows_rollback', array( $this, 'post_cartflows_rollback' ) );
73 +
74 + $this->do_not_cache_admin_pages_actions();
75 +
76 + // Provide pointer configuration via filter.
77 + add_filter( 'cartflows_pointer_config', array( $this, 'get_pointer_config' ) );
78 + }
79 +
80 + /**
81 + * Do not cache admin pages actions.
82 + *
83 + * @since 1.6.13
84 + * @return void
85 + */
86 + public function do_not_cache_admin_pages_actions() {
87 +
88 + add_action( 'admin_init', array( $this, 'add_admin_cache_restrict_const' ) );
89 + add_action( 'admin_head', array( $this, 'add_admin_cache_restrict_meta' ) );
90 + }
91 +
92 + /**
93 + * Run scheduled job for CartFLows knowledge base data.
94 + *
95 + * @since 2.0.0
96 + * @return void
97 + */
98 + public function run_scheduled_docs_job() {
99 +
100 + if ( wp_installing() ) {
101 + return;
102 + }
103 +
104 + // Only the legacy admin renders the Knowledge Base screen that consumes this data.
105 + if ( ! defined( 'CARTFLOWS_LEGACY_ADMIN' ) || ! CARTFLOWS_LEGACY_ADMIN ) {
106 + return;
107 + }
108 +
109 + if ( false === as_next_scheduled_action( 'cartflows_update_knowledge_base_data' ) ) {
110 + as_schedule_recurring_action( time(), WEEK_IN_SECONDS, 'cartflows_update_knowledge_base_data' );
111 + }
112 + }
113 +
114 + /**
115 + * Cartflows's REST knowledge base data.
116 + *
117 + * @since 2.0.0
118 + * @return mixed
119 + */
120 + public static function cartflows_update_knowledge_base_data() {
121 + $docs_json = json_decode( wp_remote_retrieve_body( wp_remote_get( 'https://cartflows.com//wp-json/powerful-docs/v1/get-docs' ) ) );
122 +
123 + // Never autoload — this payload runs to hundreds of KB and only the Knowledge Base screen reads it.
124 + update_option( 'cartflows_docs_data', $docs_json, false );
125 + }
126 +
127 + /**
128 + * Init dashboard widgets.
129 + */
130 + public function dashboard_widget() {
131 +
132 + if ( current_user_can( 'manage_options' ) && '1' === get_option( 'wcf_setup_skipped', false ) && '1' !== get_option( 'wcf_setup_complete', false ) ) {
133 + wp_add_dashboard_widget(
134 + 'cartFlows_setup_dashboard_widget',
135 + __( 'CartFlows Setup', 'cartflows' ),
136 + array( $this, 'status_widget' )
137 + );
138 + }
139 + }
140 +
141 + /**
142 + * Show status widget.
143 + */
144 + public function status_widget() {
145 +
146 + $admin_url = admin_url( 'index.php' ) . '?page=cartflows-onboarding&';
147 +
148 + $steps = array(
149 + 'welcome' => $admin_url . 'step=welcome',
150 + 'page-builder' => $admin_url . 'step=page-builder',
151 + 'plugin-install' => $admin_url . 'step=plugin-install',
152 + 'global-checkout' => $admin_url . 'step=global-checkout',
153 + 'optin' => $admin_url . 'step=optin',
154 + 'ready' => $admin_url . 'step=ready',
155 + );
156 +
157 + $exit_step = get_option( 'wcf_exit_setup_step', 'welcome' );
158 +
159 + $incompleted_steps = array_search( $exit_step, array_keys( $steps ), true );
160 + $remianing_steps = array_slice( $steps, 0, $incompleted_steps );
161 +
162 + $completed_tasks_count = count( $remianing_steps ) + 1;
163 + $tasks_count = count( $steps );
164 + $button_link = ! empty( $exit_step ) ? $steps[ $exit_step ] : '';
165 +
166 + $progress_percentage = ( $completed_tasks_count / $tasks_count ) * 100;
167 + $circle_r = 6.5;
168 + $circle_dashoffset = ( ( 100 - $progress_percentage ) / 100 ) * ( pi() * ( $circle_r * 2 ) );
169 +
170 + wp_enqueue_style( 'cartflows-dashboard-widget', CARTFLOWS_URL . 'admin/assets/css/admin-widget.css', array(), CARTFLOWS_VER );
171 +
172 + ?>
173 +
174 + <div class="cartflows-dashboard-widget-finish-setup">
175 + <span class='progress-wrapper'>
176 + <svg class="circle-progress" width="17" height="17" version="1.1" xmlns="http://www.w3.org/2000/svg">
177 + <circle r="6.5" cx="10" cy="10" fill="transparent" stroke-dasharray="40.859" stroke-dashoffset="0"></circle>
178 + <circle class="bar" r="6.5" cx="190" cy="10" fill="transparent" stroke-dasharray="40.859" stroke-dashoffset="<?php echo esc_attr( $circle_dashoffset ); ?>" transform='rotate(-90 100 100)'></circle>
179 + </svg>
180 + <span><?php echo esc_html_e( 'Step', 'cartflows' ); ?> <?php echo esc_html( $completed_tasks_count ); ?> <?php echo esc_html_e( 'of', 'cartflows' ); ?> <?php echo esc_html( $tasks_count ); ?></span>
181 + </span>
182 +
183 + <div class="description">
184 + <div class="wcf-left-column">
185 + <p>
186 + <?php echo esc_html_e( 'You\'re almost there! Once you complete CartFlows setup you can start receiving orders from flows.', 'cartflows' ); ?>
187 + </p>
188 + <a href='<?php echo esc_url( $button_link ); ?>' class='button button-primary'><?php echo esc_html_e( 'Complete Setup', 'cartflows' ); ?></a>
189 + </div>
190 + <div class="wcf-right-column">
191 + <img src="<?php echo esc_url( CARTFLOWS_URL . 'admin/assets/images/cartflows-home-widget.svg' ); ?>" />
192 + </div>
193 + </div>
194 + </div>
195 + <?php
196 + }
197 +
198 + /**
199 + * Add the clone link to action list for flows row actions
200 + *
201 + * @param array $actions Actions array.
202 + * @param object $post Post object.
203 + *
204 + * @return array
205 + */
206 + public function remove_flow_actions( $actions, $post ) {
207 +
208 + if ( current_user_can( 'edit_posts' ) && isset( $post ) && CARTFLOWS_FLOW_POST_TYPE === $post->post_type ) {
209 +
210 + if ( isset( $actions['duplicate'] ) ) { // Duplicate page plugin remove.
211 + unset( $actions['duplicate'] );
212 + }
213 +
214 + if ( isset( $actions['edit_as_new_draft'] ) ) { // Duplicate post plugin remove.
215 + unset( $actions['edit_as_new_draft'] );
216 + }
217 + }
218 +
219 + return $actions;
220 + }
221 +
222 + /**
223 + * After save of permalinks.
224 + */
225 + public static function flush_rules_after_save_permalinks() {
226 +
227 + $has_saved_permalinks = get_option( 'cartflows_permalink_refresh' );
228 + if ( $has_saved_permalinks ) {
229 + // Required to flush rules when permalink changes.
230 + flush_rewrite_rules(); //phpcs:ignore WordPressVIPMinimum.Functions.RestrictedFunctions.flush_rewrite_rules_flush_rewrite_rules
231 + delete_option( 'cartflows_permalink_refresh' );
232 + }
233 + }
234 +
235 + /**
236 + * Show action on plugin page.
237 + *
238 + * @param array $links links.
239 + * @return array
240 + */
241 + public function add_action_links( $links ) {
242 +
243 + $mylinks = array(
244 + '<a target="_blank" href="' . esc_url(
245 + Cartflows_Helper::get_kb_doc_link(
246 + 'https://cartflows.com/docs/',
247 + array(
248 + 'utm_source' => 'plugin-page',
249 + 'utm_campaign' => 'go-pro',
250 + )
251 + )
252 + ) . '">' . __( 'Docs', 'cartflows' ) . '</a>',
253 + );
254 +
255 + if ( current_user_can( 'cartflows_manage_settings' ) ) {
256 +
257 + $is_legacy_admin = defined( 'CARTFLOWS_LEGACY_ADMIN' ) && CARTFLOWS_LEGACY_ADMIN;
258 +
259 + $settings_args = array( 'page' => CARTFLOWS_SLUG );
260 +
261 + if ( $is_legacy_admin ) {
262 + $settings_args['settings'] = true;
263 + } else {
264 + $settings_args['path'] = 'settings';
265 + }
266 +
267 + $default_url = add_query_arg( $settings_args, admin_url( 'admin.php' ) );
268 +
269 + array_unshift( $mylinks, '<a href="' . esc_url( $default_url ) . '">' . __( 'Settings', 'cartflows' ) . '</a>' );
270 + }
271 +
272 + if ( ! _is_cartflows_pro() ) {
273 + array_push(
274 + $mylinks,
275 + '<a style="color: #39b54a; font-weight: 700;" target="_blank" href="' . esc_url(
276 + Cartflows_Helper::get_upgrade_to_pro_link( 'pricing', '', array( 'utm_source' => 'plugin-page' ) )
277 + ) . '"> ' . __( 'Get CartFlows Pro', 'cartflows' ) . ' </a>'
278 + );
279 + }
280 +
281 + return array_merge( $links, $mylinks );
282 + }
283 +
284 + /**
285 + * Check is flow admin.
286 + *
287 + * @since 1.0.0
288 + * @return boolean
289 + */
290 + public static function is_flow_edit_admin() {
291 +
292 + $current_screen = get_current_screen();
293 +
294 + if (
295 + is_object( $current_screen ) &&
296 + isset( $current_screen->post_type ) &&
297 + ( CARTFLOWS_FLOW_POST_TYPE === $current_screen->post_type ) &&
298 + isset( $current_screen->base ) &&
299 + ( 'post' === $current_screen->base )
300 + ) {
301 + return true;
302 + }
303 + return false;
304 + }
305 +
306 + /**
307 + * Admin body classes.
308 + *
309 + * Body classes to be added to <body> tag in admin page
310 + *
311 + * @param String $classes body classes returned from the filter.
312 + * @return String body classes to be added to <body> tag in admin page
313 + */
314 + public function add_admin_body_class( $classes ) {
315 +
316 + $classes .= ' cartflows-' . CARTFLOWS_VER;
317 +
318 + if ( isset( $_GET['action'] ) && 'wcf-license' === sanitize_text_field( wp_unslash( $_GET['action'] ) ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Recommended
319 + $classes .= ' wcf-debug-page ';
320 + }
321 +
322 + return $classes;
323 + }
324 +
325 + /**
326 + * Check allowed screen for notices.
327 + *
328 + * @since 1.0.0
329 + * @return bool
330 + */
331 + public function allowed_screen_for_notices() {
332 +
333 + $screen = get_current_screen();
334 + $screen_id = $screen ? $screen->id : '';
335 + $allowed_screens = array(
336 + 'toplevel_page_cartflows',
337 + 'edit-cartflows_flow',
338 + );
339 +
340 + if ( in_array( $screen_id, $allowed_screens, true ) ) {
341 + return true;
342 + }
343 +
344 + return false;
345 + }
346 +
347 + /**
348 + * Function to add the meta and headers for not to cache the CartFlows wp-admin page.
349 + *
350 + * @return void
351 + */
352 + public function add_admin_cache_restrict_meta() {
353 +
354 + if ( ! $this->allowed_screen_for_notices() ) {
355 + return;
356 + }
357 +
358 + echo '<!-- Added by CartFlows -->';
359 + echo '<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" /> <meta http-equiv="Pragma" content="no-cache" /> <meta http-equiv="Expires" content="0" />';
360 + echo '<!-- Added by CartFlows -->';
361 + }
362 +
363 + /**
364 + * Function to add the Do Not Cache Constants on the CartFlows admin pages.
365 + *
366 + * @return void
367 + */
368 + public function add_admin_cache_restrict_const() {
369 + // Ignoring nonce verification as using SuperGlobal variables on WordPress hooks.
370 + if ( isset( $_GET['page'] ) && ( 'cartflows' === sanitize_text_field( $_GET['page'] ) || false !== strpos( sanitize_text_field( $_GET['page'] ), 'cartflows_' ) ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Recommended
371 + wcf()->utils->get_cache_headers();
372 + }
373 + }
374 +
375 + /**
376 + * CartFlows version rollback.
377 + *
378 + * Rollback to previous CartFlows version.
379 + *
380 + * Fired by `admin_post_cartflows_rollback` action.
381 + *
382 + * @since 2.1.6
383 + * @access public
384 + * @return void
385 + */
386 + public function post_cartflows_rollback() {
387 +
388 + if ( ! current_user_can( 'install_plugins' ) ) {
389 + wp_die(
390 + esc_html__( 'You do not have permission to access this page.', 'cartflows' ),
391 + esc_html__( 'Rollback to Previous Version', 'cartflows' ),
392 + array(
393 + 'response' => 200,
394 + )
395 + );
396 + }
397 +
398 + check_admin_referer( 'cartflows_rollback' );
399 +
400 + $rollback_versions = \Cartflows_Helper::get_rollback_versions();
401 + $update_version = isset( $_GET['version'] ) ? sanitize_text_field( $_GET['version'] ) : '';
402 +
403 + if ( empty( $update_version ) || ! in_array( $update_version, $rollback_versions, true ) ) {
404 + wp_die( esc_html__( 'Error occurred, The version selected is invalid. Try selecting different version.', 'cartflows' ) );
405 + }
406 +
407 + $plugin_slug = basename( CARTFLOWS_FILE, '.php' );
408 +
409 + $rollback = new Cartflows_Rollback(
410 + array(
411 + 'version' => $update_version,
412 + 'plugin_name' => CARTFLOWS_BASE,
413 + 'plugin_slug' => $plugin_slug,
414 + 'package_url' => sprintf( 'https://downloads.wordpress.org/plugin/%s.%s.zip', $plugin_slug, $update_version ),
415 + )
416 + );
417 +
418 + $rollback->run();
419 +
420 + wp_die(
421 + '',
422 + esc_html__( 'Rollback to Previous Version', 'cartflows' ),
423 + array(
424 + 'response' => 200,
425 + )
426 + );
427 + }
428 +
429 + /**
430 + * Provide CartFlows Pointer configuration via filter.
431 + *
432 + * @param array<string, mixed> $config Existing configuration.
433 + * @return array<string, mixed> Pointer configuration.
434 + */
435 + public function get_pointer_config( $config ) {
436 + return array(
437 + 'option_name' => 'cartflows_pointer_data',
438 + 'title' => __( 'CartFlows is waiting for you!', 'cartflows' ),
439 + 'content' => sprintf(
440 + /* translators: %1$s opening <strong> tag, %2$s closing </strong> tag */
441 + __( '%1$sLaunch your first funnel in minutes.%2$s Follow a guided setup to start capturing leads or sales immediately.', 'cartflows' ),
442 + '<strong>',
443 + '</strong>'
444 + ),
445 + 'button_text' => __( 'Create My First Funnel', 'cartflows' ),
446 + 'button_url' => admin_url( 'admin.php?page=cartflows' ),
447 + 'dismiss_text' => __( 'Dismiss', 'cartflows' ),
448 + 'target_selector' => '#toplevel_page_cartflows',
449 + 'fallback_target' => '#menu-plugins',
450 + 'allowed_pages' => array( 'index.php', 'plugins.php' ),
451 + 'post_type' => CARTFLOWS_FLOW_POST_TYPE,
452 + 'max_posts' => 0,
453 + );
454 + }
455 +}
456 +
457 +Cartflows_Admin::get_instance();