PluginProbe
SellKit – Funnel builder and checkout optimizer for WooCommerce to sell more, faster / 2.7.0
SellKit – Funnel builder and checkout optimizer for WooCommerce to sell more, faster v2.7.0
2.7.0 2.6.0 trunk 1.1.0 1.1.4 1.2.1 1.2.2 1.2.3 1.2.5 1.2.9 1.3.1 1.3.2 1.5.0 1.5.1 1.5.4 1.5.7 1.5.8 1.5.9 1.6.2 1.6.5 1.6.8 1.7.2 1.7.4 1.7.5 1.7.9 All 43 releases
← All changes | sellkit.php +104 -12 1.5.02.7.0 View file →
@@ -1,14 +1,14 @@
1 1 <?php
2 2 /**
3 - * Plugin Name: Sellkit
3 + * Plugin Name: SellKit - Funnel builder and checkout optimizer for WooCommerce to sell more, faster
4 4 * Plugin URI: https://getsellkit.com/
5 5 * Description: Build unlimited sales funnels, one-click order bumps and upsells, custom thank you pages, and more. The free version of SellKit also offers a huge round of features to optimize your WooCommerce store: build and style single or multi-step checkout pages with advanced styling options. Add, remove & reorder form fields. Fasten the form submission process with pre-populated form data, Instant form validation, and removing cart page. All this and more is 100% free and for an unlimited number of sites.
6 - * Version: 1.5.0
6 + * Version: 2.7.0
7 7 * Author: Artbees
8 8 * Author URI: https://artbees.net
9 9 * Text Domain: sellkit
10 - * License: GPL2
10 + * License: GPLv2 or later
11 11 *
12 12 * @package Sellkit
13 13 */
14 14
@@ -122,8 +122,9 @@
122 122 public $sellkit_menus = [
123 123 'sellkit-dashboard',
124 124 'sellkit-funnel',
125 125 'sellkit-settings',
126 + 'sellkit-checkout',
126 127 ];
127 128
128 129 /**
129 130 * Has pro plugin or not.
@@ -158,14 +159,24 @@
158 159
159 160 $this->load_files( [
160 161 'db',
161 162 'functions',
163 + 'funnel/redirect',
164 + 'funnel/homepage',
162 165 'funnel/analytics/data-updater',
166 + 'global-checkout/class',
163 167 'funnel/class',
164 168 'funnel/contacts/base-contacts',
165 169 'funnel/steps',
166 170 ] );
167 171
172 + if ( class_exists( 'SitePress' ) ) {
173 + $this->load_files([
174 + 'compatibility/wpml/module',
175 + 'compatibility/module',
176 + ] );
177 + }
178 +
168 179 $this->db = new Database();
169 180
170 181 add_action( 'plugins_loaded', [ $this, 'check_if_has_sellkit_pro' ], 11 );
171 182 add_action( 'plugins_loaded', [ $this, 'plugins_loaded' ] );
@@ -176,8 +187,10 @@
176 187
177 188 // Editor script.
178 189 add_action( 'elementor/editor/before_enqueue_scripts', [ $this, 'enqueue_editor_script' ] );
179 190
191 + add_action( 'requests-curl.before_request', [ $this, 'actions_before_curl_requests' ], 9999 );
192 +
180 193 // Register activation hook.
181 194 register_activation_hook( __FILE__, array( $this, 'activation' ) );
182 195
183 196 if ( ! $this->is_sellkit_screen() ) {
@@ -189,15 +202,27 @@
189 202 add_filter( 'admin_body_class', [ $this, 'sellkit_admin_body_class' ] );
190 203 }
191 204
192 205 /**
206 + * Actions before all curl requests.
207 + *
208 + * @since 1.5.4
209 + * @return void
210 + */
211 + public function actions_before_curl_requests() {
212 + session_write_close();
213 + }
214 +
215 + /**
193 216 * Has sellKit pro.
194 217 *
195 218 * @since 1.1.0
196 219 */
197 220 public function check_if_has_sellkit_pro() {
198 - if ( class_exists( 'Sellkit_Pro' ) ) {
199 - $this->has_pro = true;
221 + if ( class_exists( 'Sellkit_Pro' ) && function_exists( 'sellkit_pro' ) ) {
222 + if ( sellkit_pro()->is_active_sellkit_pro ) {
223 + $this->has_pro = true;
224 + }
200 225 }
201 226 }
202 227
203 228 /**
@@ -221,12 +246,25 @@
221 246 *
222 247 * @since 1.1.0
223 248 */
224 249 public function plugins_loaded() {
250 + if ( 'elementor' === $this->page_builder() ) {
251 + $this->load_files( [
252 + 'elementor/class',
253 + ] );
254 + }
255 +
225 256 $this->load_files( [
226 - 'elementor/class',
227 257 'admin/class-promote-sellkit-pro',
258 + 'admin/class-promotion-banner',
228 259 ] );
260 +
261 + if ( class_exists( 'WooCommerce' ) && 'gutenberg' === $this->page_builder() ) {
262 + $this->load_files( [
263 + 'block-editor/helper',
264 + 'block-editor/class',
265 + ] );
266 + }
229 267 }
230 268
231 269 /**
232 270 * Do some stuff on plugin activation.
@@ -249,18 +287,30 @@
249 287
250 288 if ( ! wp_next_scheduled( 'sellkit_update_rfm_score' ) ) {
251 289 wp_schedule_event( time(), 'twicedaily', 'sellkit_update_rfm_score' );
252 290 }
291 +
292 + $this->sellkit_installed_time();
253 293 }
254 294
255 295 /**
256 - * Adding sellkit class to body.
296 + * Saves sellkit installation time.
257 297 *
258 - * @param string $classes Sellkit the sellkit class.
298 + * @since 1.5.9
299 + */
300 + private function sellkit_installed_time() {
301 + update_option( 'sellkit-installed-time', time() );
302 + }
303 +
304 + /**
305 + * Adds `sellkit` on the admin body so `.sellkit …` Bootstrap/Reboot selectors apply.
306 + * wp-admin sidebar chrome is toned down in `src/style.scss` where Reboot bleeds through.
307 + *
308 + * @param string $classes Existing body classes.
259 309 * @return string
260 310 */
261 311 public function sellkit_admin_body_class( $classes ) {
262 - return "{$classes} sellkit";
312 + return "{$classes} sellkit sellkit-admin-screen";
263 313 }
264 314
265 315 /**
266 316 * Initialize admin.
@@ -282,8 +332,9 @@
282 332 'admin/class-posts',
283 333 'admin/settings/class-settings',
284 334 'admin/class-custom-tables',
285 335 'admin/funnel/class',
336 + 'admin/class-global-checkout',
286 337 'core/install',
287 338 ] );
288 339 }
289 340
@@ -316,9 +367,9 @@
316 367 'public' => false,
317 368 ] );
318 369 }
319 370
320 - load_plugin_textdomain( 'sellkit', false, dirname( plugin_basename( __FILE__ ) ) . '/languages/' );
371 + // Translations load automatically (WP 4.6+) from wp-content/languages/plugins/ and this plugin's languages directory.
321 372 }
322 373
323 374 /**
324 375 * Enqueue editor scripts.
@@ -385,14 +436,25 @@
385 436 $initial_page = 'sellkit-dashboard';
386 437 $submenu = [
387 438 'sellkit-dashboard' => esc_html__( 'Dashboard', 'sellkit' ),
388 439 'sellkit-funnel' => esc_html__( 'Funnels', 'sellkit' ),
440 + 'sellkit-checkout' => esc_html__( 'Global Checkout', 'sellkit' ),
389 441 ];
390 442
391 443 $submenu = apply_filters( 'sellkit_sub_menu', $submenu );
392 444
393 - $svg_file = wp_remote_get( self::plugin_url() . 'assets/img/icons/sellkit-dashboard.svg' );
445 + // Load SVG from disk. wp_remote_get() to the plugin URL often fails on local/SSL sites and yields an empty icon.
446 + $icon_path = sellkit()->plugin_dir() . 'assets/img/icons/sellkit-dashboard.svg';
447 + $menu_icon = 'dashicons-cart';
394 448
449 + if ( is_readable( $icon_path ) ) {
450 + // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents -- Reading a bundled asset from the filesystem.
451 + $svg_contents = file_get_contents( $icon_path );
452 + if ( false !== $svg_contents && '' !== $svg_contents ) {
453 + $menu_icon = 'data:image/svg+xml;base64,' . base64_encode( $svg_contents );
454 + }
455 + }
456 +
395 457 add_menu_page(
396 458 $menu_name,
397 459 $menu_name,
398 460 'manage_options',
@@ -397,9 +459,9 @@
397 459 $menu_name,
398 460 'manage_options',
399 461 $initial_page,
400 462 [ $this, 'register_admin_menu_callback' ],
401 - 'data:image/svg+xml;base64,' . base64_encode( wp_remote_retrieve_body( $svg_file ) ),
463 + $menu_icon,
402 464 '58.1'
403 465 );
404 466
405 467 foreach ( $submenu as $slug => $title ) {
@@ -491,10 +553,40 @@
491 553 'elementorActivation' => class_exists( 'Elementor\Plugin' ) ? true : false,
492 554 'funnelsTemplateSource' => Funnel::SELLKIT_FUNNELS_TEMPLATE_SOURCE,
493 555 'removedContentBoxes' => Sellkit_Admin_Settings::get_removed_content_box(),
494 556 'sellkitProIsActive' => $this->has_pro,
557 + 'sellkitProPluginInstalled' => class_exists( 'Sellkit_Pro' ) && function_exists( 'sellkit_pro' ),
558 + 'sellkitLicensePageUrl' => ( class_exists( 'Sellkit_Pro' ) && function_exists( 'sellkit_pro' ) )
559 + ? ( is_multisite() ? network_admin_url( 'admin.php?page=sellkit-license' ) : admin_url( 'admin.php?page=sellkit-license' ) )
560 + : '',
495 561 'wcIsActivated' => $this->has_valid_dependencies(),
562 + 'activeTheme' => wp_get_theme()->get( 'Name' ),
563 + 'pageBuilder' => $this->page_builder(),
496 564 ];
565 + }
566 +
567 + /**
568 + * Get page builder.
569 + *
570 + * @since 2.3.0
571 + * @return string
572 + */
573 + public function page_builder() {
574 + $default = 'gutenberg';
575 +
576 + if ( class_exists( 'Elementor\Plugin' ) ) {
577 + $default = 'elementor';
578 + }
579 +
580 + $page_builder = sellkit_get_option( 'page_builder', '' );
581 +
582 + if ( empty( $page_builder ) ) {
583 + sellkit_update_option( 'page_builder', $default );
584 +
585 + return $default;
586 + }
587 +
588 + return $page_builder;
497 589 }
498 590
499 591 /**
500 592 * Get woocommerce settings data.