PluginProbe
CartFlows – Funnel Builder & Checkout Plugin for WooCommerce / 3.1.2
CartFlows – Funnel Builder & Checkout Plugin for WooCommerce v3.1.2
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-admin.php

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

442 lines 12.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
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 if ( false === as_next_scheduled_action( 'cartflows_update_knowledge_base_data' ) && ! wp_installing() ) {
100 as_schedule_recurring_action( time(), WEEK_IN_SECONDS, 'cartflows_update_knowledge_base_data' );
101 }
102 }
103
104 /**
105 * Cartflows's REST knowledge base data.
106 *
107 * @since 2.0.0
108 * @return mixed
109 */
110 public static function cartflows_update_knowledge_base_data() {
111 $docs_json = json_decode( wp_remote_retrieve_body( wp_remote_get( 'https://cartflows.com//wp-json/powerful-docs/v1/get-docs' ) ) );
112 Cartflows_Helper::update_admin_settings_option( 'cartflows_docs_data', $docs_json );
113 }
114
115 /**
116 * Init dashboard widgets.
117 */
118 public function dashboard_widget() {
119
120 if ( current_user_can( 'manage_options' ) && '1' === get_option( 'wcf_setup_skipped', false ) && '1' !== get_option( 'wcf_setup_complete', false ) ) {
121 wp_add_dashboard_widget(
122 'cartFlows_setup_dashboard_widget',
123 __( 'CartFlows Setup', 'cartflows' ),
124 array( $this, 'status_widget' )
125 );
126 }
127 }
128
129 /**
130 * Show status widget.
131 */
132 public function status_widget() {
133
134 $admin_url = admin_url( 'index.php' ) . '?page=cartflows-onboarding&';
135
136 $steps = array(
137 'welcome' => $admin_url . 'step=welcome',
138 'page-builder' => $admin_url . 'step=page-builder',
139 'plugin-install' => $admin_url . 'step=plugin-install',
140 'global-checkout' => $admin_url . 'step=global-checkout',
141 'optin' => $admin_url . 'step=optin',
142 'ready' => $admin_url . 'step=ready',
143 );
144
145 $exit_step = get_option( 'wcf_exit_setup_step', 'welcome' );
146
147 $incompleted_steps = array_search( $exit_step, array_keys( $steps ), true );
148 $remianing_steps = array_slice( $steps, 0, $incompleted_steps );
149
150 $completed_tasks_count = count( $remianing_steps ) + 1;
151 $tasks_count = count( $steps );
152 $button_link = ! empty( $exit_step ) ? $steps[ $exit_step ] : '';
153
154 $progress_percentage = ( $completed_tasks_count / $tasks_count ) * 100;
155 $circle_r = 6.5;
156 $circle_dashoffset = ( ( 100 - $progress_percentage ) / 100 ) * ( pi() * ( $circle_r * 2 ) );
157
158 wp_enqueue_style( 'cartflows-dashboard-widget', CARTFLOWS_URL . 'admin/assets/css/admin-widget.css', array(), CARTFLOWS_VER );
159
160 ?>
161
162 <div class="cartflows-dashboard-widget-finish-setup">
163 <span class='progress-wrapper'>
164 <svg class="circle-progress" width="17" height="17" version="1.1" xmlns="http://www.w3.org/2000/svg">
165 <circle r="6.5" cx="10" cy="10" fill="transparent" stroke-dasharray="40.859" stroke-dashoffset="0"></circle>
166 <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>
167 </svg>
168 <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>
169 </span>
170
171 <div class="description">
172 <div class="wcf-left-column">
173 <p>
174 <?php echo esc_html_e( 'You\'re almost there! Once you complete CartFlows setup you can start receiving orders from flows.', 'cartflows' ); ?>
175 </p>
176 <a href='<?php echo esc_url( $button_link ); ?>' class='button button-primary'><?php echo esc_html_e( 'Complete Setup', 'cartflows' ); ?></a>
177 </div>
178 <div class="wcf-right-column">
179 <img src="<?php echo esc_url( CARTFLOWS_URL . 'admin/assets/images/cartflows-home-widget.svg' ); ?>" />
180 </div>
181 </div>
182 </div>
183 <?php
184 }
185
186 /**
187 * Add the clone link to action list for flows row actions
188 *
189 * @param array $actions Actions array.
190 * @param object $post Post object.
191 *
192 * @return array
193 */
194 public function remove_flow_actions( $actions, $post ) {
195
196 if ( current_user_can( 'edit_posts' ) && isset( $post ) && CARTFLOWS_FLOW_POST_TYPE === $post->post_type ) {
197
198 if ( isset( $actions['duplicate'] ) ) { // Duplicate page plugin remove.
199 unset( $actions['duplicate'] );
200 }
201
202 if ( isset( $actions['edit_as_new_draft'] ) ) { // Duplicate post plugin remove.
203 unset( $actions['edit_as_new_draft'] );
204 }
205 }
206
207 return $actions;
208 }
209
210 /**
211 * After save of permalinks.
212 */
213 public static function flush_rules_after_save_permalinks() {
214
215 $has_saved_permalinks = get_option( 'cartflows_permalink_refresh' );
216 if ( $has_saved_permalinks ) {
217 // Required to flush rules when permalink changes.
218 flush_rewrite_rules(); //phpcs:ignore WordPressVIPMinimum.Functions.RestrictedFunctions.flush_rewrite_rules_flush_rewrite_rules
219 delete_option( 'cartflows_permalink_refresh' );
220 }
221 }
222
223 /**
224 * Show action on plugin page.
225 *
226 * @param array $links links.
227 * @return array
228 */
229 public function add_action_links( $links ) {
230
231 $mylinks = array(
232 '<a target="_blank" href="' . esc_url(
233 Cartflows_Helper::get_kb_doc_link(
234 'https://cartflows.com/docs/',
235 array(
236 'utm_source' => 'plugin-page',
237 'utm_campaign' => 'go-pro',
238 )
239 )
240 ) . '">' . __( 'Docs', 'cartflows' ) . '</a>',
241 );
242
243 if ( current_user_can( 'cartflows_manage_settings' ) ) {
244
245 $default_url = add_query_arg(
246 array(
247 'page' => CARTFLOWS_SLUG,
248 'settings' => true,
249 ),
250 admin_url( 'admin.php' )
251 );
252
253 array_unshift( $mylinks, '<a href="' . esc_url( $default_url ) . '">' . __( 'Settings', 'cartflows' ) . '</a>' );
254 }
255
256 if ( ! _is_cartflows_pro() ) {
257 array_push(
258 $mylinks,
259 '<a style="color: #39b54a; font-weight: 700;" target="_blank" href="' . esc_url(
260 Cartflows_Helper::get_upgrade_to_pro_link( 'pricing', '', array( 'utm_source' => 'plugin-page' ) )
261 ) . '"> ' . __( 'Get CartFlows Pro', 'cartflows' ) . ' </a>'
262 );
263 }
264
265 return array_merge( $links, $mylinks );
266 }
267
268 /**
269 * Check is flow admin.
270 *
271 * @since 1.0.0
272 * @return boolean
273 */
274 public static function is_flow_edit_admin() {
275
276 $current_screen = get_current_screen();
277
278 if (
279 is_object( $current_screen ) &&
280 isset( $current_screen->post_type ) &&
281 ( CARTFLOWS_FLOW_POST_TYPE === $current_screen->post_type ) &&
282 isset( $current_screen->base ) &&
283 ( 'post' === $current_screen->base )
284 ) {
285 return true;
286 }
287 return false;
288 }
289
290 /**
291 * Admin body classes.
292 *
293 * Body classes to be added to <body> tag in admin page
294 *
295 * @param String $classes body classes returned from the filter.
296 * @return String body classes to be added to <body> tag in admin page
297 */
298 public function add_admin_body_class( $classes ) {
299
300 $classes .= ' cartflows-' . CARTFLOWS_VER;
301
302 if ( isset( $_GET['action'] ) && in_array( sanitize_text_field( wp_unslash( $_GET['action'] ) ), array( 'wcf-log', 'wcf-license' ) ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Recommended
303 $classes .= ' wcf-debug-page ';
304 }
305
306 return $classes;
307 }
308
309 /**
310 * Check allowed screen for notices.
311 *
312 * @since 1.0.0
313 * @return bool
314 */
315 public function allowed_screen_for_notices() {
316
317 $screen = get_current_screen();
318 $screen_id = $screen ? $screen->id : '';
319 $allowed_screens = array(
320 'toplevel_page_cartflows',
321 'edit-cartflows_flow',
322 );
323
324 if ( in_array( $screen_id, $allowed_screens, true ) ) {
325 return true;
326 }
327
328 return false;
329 }
330
331 /**
332 * Function to add the meta and headers for not to cache the CartFlows wp-admin page.
333 *
334 * @return void
335 */
336 public function add_admin_cache_restrict_meta() {
337
338 if ( ! $this->allowed_screen_for_notices() ) {
339 return;
340 }
341
342 echo '<!-- Added by CartFlows -->';
343 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" />';
344 echo '<!-- Added by CartFlows -->';
345 }
346
347 /**
348 * Function to add the Do Not Cache Constants on the CartFlows admin pages.
349 *
350 * @return void
351 */
352 public function add_admin_cache_restrict_const() {
353 // Ignoring nonce verification as using SuperGlobal variables on WordPress hooks.
354 if ( isset( $_GET['page'] ) && ( 'cartflows' === sanitize_text_field( $_GET['page'] ) || false !== strpos( sanitize_text_field( $_GET['page'] ), 'cartflows_' ) ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Recommended
355 wcf()->utils->get_cache_headers();
356 }
357 }
358
359 /**
360 * CartFlows version rollback.
361 *
362 * Rollback to previous CartFlows version.
363 *
364 * Fired by `admin_post_cartflows_rollback` action.
365 *
366 * @since 2.1.6
367 * @access public
368 * @return void
369 */
370 public function post_cartflows_rollback() {
371
372 if ( ! current_user_can( 'install_plugins' ) ) {
373 wp_die(
374 esc_html__( 'You do not have permission to access this page.', 'cartflows' ),
375 esc_html__( 'Rollback to Previous Version', 'cartflows' ),
376 array(
377 'response' => 200,
378 )
379 );
380 }
381
382 check_admin_referer( 'cartflows_rollback' );
383
384 $rollback_versions = \Cartflows_Helper::get_rollback_versions();
385 $update_version = isset( $_GET['version'] ) ? sanitize_text_field( $_GET['version'] ) : '';
386
387 if ( empty( $update_version ) || ! in_array( $update_version, $rollback_versions, true ) ) {
388 wp_die( esc_html__( 'Error occurred, The version selected is invalid. Try selecting different version.', 'cartflows' ) );
389 }
390
391 $plugin_slug = basename( CARTFLOWS_FILE, '.php' );
392
393 $rollback = new Cartflows_Rollback(
394 array(
395 'version' => $update_version,
396 'plugin_name' => CARTFLOWS_BASE,
397 'plugin_slug' => $plugin_slug,
398 'package_url' => sprintf( 'https://downloads.wordpress.org/plugin/%s.%s.zip', $plugin_slug, $update_version ),
399 )
400 );
401
402 $rollback->run();
403
404 wp_die(
405 '',
406 esc_html__( 'Rollback to Previous Version', 'cartflows' ),
407 array(
408 'response' => 200,
409 )
410 );
411 }
412
413 /**
414 * Provide CartFlows Pointer configuration via filter.
415 *
416 * @param array<string, mixed> $config Existing configuration.
417 * @return array<string, mixed> Pointer configuration.
418 */
419 public function get_pointer_config( $config ) {
420 return array(
421 'option_name' => 'cartflows_pointer_data',
422 'title' => __( 'CartFlows is waiting for you!', 'cartflows' ),
423 'content' => sprintf(
424 /* translators: %1$s opening <strong> tag, %2$s closing </strong> tag */
425 __( '%1$sLaunch your first funnel in minutes.%2$s Follow a guided setup to start capturing leads or sales immediately.', 'cartflows' ),
426 '<strong>',
427 '</strong>'
428 ),
429 'button_text' => __( 'Create My First Funnel', 'cartflows' ),
430 'button_url' => admin_url( 'admin.php?page=cartflows' ),
431 'dismiss_text' => __( 'Dismiss', 'cartflows' ),
432 'target_selector' => '#toplevel_page_cartflows',
433 'fallback_target' => '#menu-plugins',
434 'allowed_pages' => array( 'index.php', 'plugins.php' ),
435 'post_type' => CARTFLOWS_FLOW_POST_TYPE,
436 'max_posts' => 0,
437 );
438 }
439 }
440
441 Cartflows_Admin::get_instance();
442