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

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

429 lines 12.5 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( 'https://cartflows.com/docs/?utm_source=plugin-page&utm_medium=free-cartflows&utm_campaign=go-pro' ) . '">' . __( 'Docs', 'cartflows' ) . '</a>',
233 );
234
235 if ( current_user_can( 'cartflows_manage_settings' ) ) {
236
237 $default_url = add_query_arg(
238 array(
239 'page' => CARTFLOWS_SLUG,
240 'settings' => true,
241 ),
242 admin_url( 'admin.php' )
243 );
244
245 array_unshift( $mylinks, '<a href="' . esc_url( $default_url ) . '">' . __( 'Settings', 'cartflows' ) . '</a>' );
246 }
247
248 if ( ! _is_cartflows_pro() ) {
249 array_push( $mylinks, '<a style="color: #39b54a; font-weight: 700;" target="_blank" href="' . esc_url( 'https://cartflows.com/pricing/?utm_source=plugin-page&utm_medium=free-cartflows&utm_campaign=go-pro' ) . '"> ' . __( 'Get CartFlows Pro', 'cartflows' ) . ' </a>' );
250 }
251
252 return array_merge( $links, $mylinks );
253 }
254
255 /**
256 * Check is flow admin.
257 *
258 * @since 1.0.0
259 * @return boolean
260 */
261 public static function is_flow_edit_admin() {
262
263 $current_screen = get_current_screen();
264
265 if (
266 is_object( $current_screen ) &&
267 isset( $current_screen->post_type ) &&
268 ( CARTFLOWS_FLOW_POST_TYPE === $current_screen->post_type ) &&
269 isset( $current_screen->base ) &&
270 ( 'post' === $current_screen->base )
271 ) {
272 return true;
273 }
274 return false;
275 }
276
277 /**
278 * Admin body classes.
279 *
280 * Body classes to be added to <body> tag in admin page
281 *
282 * @param String $classes body classes returned from the filter.
283 * @return String body classes to be added to <body> tag in admin page
284 */
285 public function add_admin_body_class( $classes ) {
286
287 $classes .= ' cartflows-' . CARTFLOWS_VER;
288
289 if ( isset( $_GET['action'] ) && in_array( sanitize_text_field( wp_unslash( $_GET['action'] ) ), array( 'wcf-log', 'wcf-license' ) ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Recommended
290 $classes .= ' wcf-debug-page ';
291 }
292
293 return $classes;
294 }
295
296 /**
297 * Check allowed screen for notices.
298 *
299 * @since 1.0.0
300 * @return bool
301 */
302 public function allowed_screen_for_notices() {
303
304 $screen = get_current_screen();
305 $screen_id = $screen ? $screen->id : '';
306 $allowed_screens = array(
307 'toplevel_page_cartflows',
308 'edit-cartflows_flow',
309 );
310
311 if ( in_array( $screen_id, $allowed_screens, true ) ) {
312 return true;
313 }
314
315 return false;
316 }
317
318 /**
319 * Function to add the meta and headers for not to cache the CartFlows wp-admin page.
320 *
321 * @return void
322 */
323 public function add_admin_cache_restrict_meta() {
324
325 if ( ! $this->allowed_screen_for_notices() ) {
326 return;
327 }
328
329 echo '<!-- Added by CartFlows -->';
330 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" />';
331 echo '<!-- Added by CartFlows -->';
332 }
333
334 /**
335 * Function to add the Do Not Cache Constants on the CartFlows admin pages.
336 *
337 * @return void
338 */
339 public function add_admin_cache_restrict_const() {
340 // Ignoring nonce verification as using SuperGlobal variables on WordPress hooks.
341 if ( isset( $_GET['page'] ) && ( 'cartflows' === sanitize_text_field( $_GET['page'] ) || false !== strpos( sanitize_text_field( $_GET['page'] ), 'cartflows_' ) ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Recommended
342 wcf()->utils->get_cache_headers();
343 }
344 }
345
346 /**
347 * CartFlows version rollback.
348 *
349 * Rollback to previous CartFlows version.
350 *
351 * Fired by `admin_post_cartflows_rollback` action.
352 *
353 * @since 2.1.6
354 * @access public
355 * @return void
356 */
357 public function post_cartflows_rollback() {
358
359 if ( ! current_user_can( 'install_plugins' ) ) {
360 wp_die(
361 esc_html__( 'You do not have permission to access this page.', 'cartflows' ),
362 esc_html__( 'Rollback to Previous Version', 'cartflows' ),
363 array(
364 'response' => 200,
365 )
366 );
367 }
368
369 check_admin_referer( 'cartflows_rollback' );
370
371 $rollback_versions = \Cartflows_Helper::get_rollback_versions();
372 $update_version = isset( $_GET['version'] ) ? sanitize_text_field( $_GET['version'] ) : '';
373
374 if ( empty( $update_version ) || ! in_array( $update_version, $rollback_versions, true ) ) {
375 wp_die( esc_html__( 'Error occurred, The version selected is invalid. Try selecting different version.', 'cartflows' ) );
376 }
377
378 $plugin_slug = basename( CARTFLOWS_FILE, '.php' );
379
380 $rollback = new Cartflows_Rollback(
381 array(
382 'version' => $update_version,
383 'plugin_name' => CARTFLOWS_BASE,
384 'plugin_slug' => $plugin_slug,
385 'package_url' => sprintf( 'https://downloads.wordpress.org/plugin/%s.%s.zip', $plugin_slug, $update_version ),
386 )
387 );
388
389 $rollback->run();
390
391 wp_die(
392 '',
393 esc_html__( 'Rollback to Previous Version', 'cartflows' ),
394 array(
395 'response' => 200,
396 )
397 );
398 }
399
400 /**
401 * Provide CartFlows Pointer configuration via filter.
402 *
403 * @param array<string, mixed> $config Existing configuration.
404 * @return array<string, mixed> Pointer configuration.
405 */
406 public function get_pointer_config( $config ) {
407 return array(
408 'option_name' => 'cartflows_pointer_data',
409 'title' => __( 'CartFlows is waiting for you!', 'cartflows' ),
410 'content' => sprintf(
411 /* translators: %1$s opening <strong> tag, %2$s closing </strong> tag */
412 __( '%1$sLaunch your first funnel in minutes.%2$s Follow a guided setup to start capturing leads or sales immediately.', 'cartflows' ),
413 '<strong>',
414 '</strong>'
415 ),
416 'button_text' => __( 'Create My First Funnel', 'cartflows' ),
417 'button_url' => admin_url( 'admin.php?page=cartflows' ),
418 'dismiss_text' => __( 'Dismiss', 'cartflows' ),
419 'target_selector' => '#toplevel_page_cartflows',
420 'fallback_target' => '#menu-plugins',
421 'allowed_pages' => array( 'index.php', 'plugins.php' ),
422 'post_type' => CARTFLOWS_FLOW_POST_TYPE,
423 'max_posts' => 0,
424 );
425 }
426 }
427
428 Cartflows_Admin::get_instance();
429