define_constants(); $this->load_files( [ 'db', 'functions', 'funnel/redirect', 'funnel/homepage', 'funnel/analytics/data-updater', 'global-checkout/class', 'funnel/class', 'funnel/contacts/base-contacts', 'funnel/steps', ] ); if ( class_exists( 'SitePress' ) ) { $this->load_files([ 'compatibility/wpml/module', 'compatibility/module', ] ); } $this->db = new Database(); add_action( 'plugins_loaded', [ $this, 'check_if_has_sellkit_pro' ], 11 ); add_action( 'plugins_loaded', [ $this, 'plugins_loaded' ] ); add_action( 'init', [ $this, 'init' ] ); add_action( 'admin_init', [ $this, 'admin_init' ] ); add_action( 'admin_menu', [ $this, 'register_admin_menu' ] ); add_action( 'admin_menu', [ $this, 'register_admin_settings_menu' ], 12 ); // Editor script. add_action( 'elementor/editor/before_enqueue_scripts', [ $this, 'enqueue_editor_script' ] ); add_action( 'requests-curl.before_request', [ $this, 'actions_before_curl_requests' ], 9999 ); // Register activation hook. register_activation_hook( __FILE__, array( $this, 'activation' ) ); if ( ! $this->is_sellkit_screen() ) { return; } add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_admin_scripts' ] ); add_action( 'admin_head', [ $this, 'remove_notice_for_sellkit_pages' ] ); add_filter( 'admin_body_class', [ $this, 'sellkit_admin_body_class' ] ); } /** * Actions before all curl requests. * * @since 1.5.4 * @return void */ public function actions_before_curl_requests() { session_write_close(); } /** * Has sellKit pro. * * @since 1.1.0 */ public function check_if_has_sellkit_pro() { if ( class_exists( 'Sellkit_Pro' ) && function_exists( 'sellkit_pro' ) ) { if ( sellkit_pro()->is_active_sellkit_pro ) { $this->has_pro = true; } } } /** * Defines constants used by the plugin. * * @since 1.1.0 */ protected function define_constants() { $plugin_data = get_file_data( __FILE__, array( 'Plugin Name', 'Version' ), 'sellkit' ); self::$plugin_basename = plugin_basename( __FILE__ ); self::$plugin_name = array_shift( $plugin_data ); self::$version = array_shift( $plugin_data ); self::$plugin_dir = trailingslashit( plugin_dir_path( __FILE__ ) ); self::$plugin_url = trailingslashit( plugin_dir_url( __FILE__ ) ); self::$plugin_assets_url = trailingslashit( self::$plugin_url . 'assets' ); } /** * Plugins loaded. * * @since 1.1.0 */ public function plugins_loaded() { if ( 'elementor' === $this->page_builder() ) { $this->load_files( [ 'elementor/class', ] ); } $this->load_files( [ 'admin/class-promote-sellkit-pro', 'admin/class-promotion-banner', ] ); if ( class_exists( 'WooCommerce' ) && 'gutenberg' === $this->page_builder() ) { $this->load_files( [ 'block-editor/helper', 'block-editor/class', ] ); } } /** * Do some stuff on plugin activation. * * @since NEXT * @return void */ public function activation() { $this->load_files( [ 'core/libraries/wp-async-request', 'core/libraries/wp-background-process', 'core/install', ] ); Install::check_database_tables(); if ( empty( sellkit_get_option( 'current_db_version' ) ) ) { sellkit_update_option( 'current_db_version', '1.2.7' ); // @since 1.5.0 } if ( ! wp_next_scheduled( 'sellkit_update_rfm_score' ) ) { wp_schedule_event( time(), 'twicedaily', 'sellkit_update_rfm_score' ); } $this->sellkit_installed_time(); } /** * Saves sellkit installation time. * * @since 1.5.9 */ private function sellkit_installed_time() { update_option( 'sellkit-installed-time', time() ); } /** * Adds `sellkit` on the admin body so `.sellkit …` Bootstrap/Reboot selectors apply. * wp-admin sidebar chrome is toned down in `src/style.scss` where Reboot bleeds through. * * @param string $classes Existing body classes. * @return string */ public function sellkit_admin_body_class( $classes ) { return "{$classes} sellkit sellkit-admin-screen"; } /** * Initialize admin. * * @since 1.1.0 */ public function admin_init() { $this->load_files( [ 'admin/class-notices', 'admin/class', ] ); $this->load_files( [ 'admin/utilities', 'admin/class-components', 'admin/components/class-list-table', 'admin/components/class-filters', 'admin/components/class-analytics', 'admin/class-posts', 'admin/settings/class-settings', 'admin/class-custom-tables', 'admin/funnel/class', 'admin/class-global-checkout', 'core/install', ] ); } /** * Initialize. * * @since 1.1.0 */ public function init() { $this->load_files( [ 'admin/class-steps', 'utilities/functions', 'contact-segmentation/class', 'dynamic-keywords/class', 'core/libraries/wp-async-request', 'core/libraries/wp-background-process', 'settings/class', 'contact-segmentation/rfm/class', 'admin/settings/integration/class', ] ); // Register post types. $post_types = [ // 'sellkit-analytics', 'sellkit-funnels', ]; foreach ( $post_types as $post_type ) { register_post_type( $post_type, [ 'public' => false, ] ); } // Translations load automatically (WP 4.6+) from wp-content/languages/plugins/ and this plugin's languages directory. } /** * Enqueue editor scripts. * * @since 1.1.0 * @return void */ public function enqueue_editor_script() { wp_enqueue_script( 'sellkit-editor', sellkit()->plugin_url() . 'assets/dist/js/editor.min.js', [ 'jquery' ], self::$version, true ); } /** * Enqueue admin scripts. * * @since 1.1.0 */ public function enqueue_admin_scripts() { $page = ! empty( $_GET['page'] ) ? $_GET['page'] : ''; // phpcs:ignore if ( ! in_array( $page, $this->sellkit_menus, true ) ) { return false; } wp_enqueue_editor(); wp_enqueue_script( 'sellkit', sellkit()->plugin_url() . 'assets/dist/admin/sellkit.js', [ 'lodash', 'wp-element', 'wp-i18n', 'wp-util' ], sellkit()->version(), true ); wp_localize_script( 'sellkit', 'sellkit', $this->get_localize_data() ); wp_enqueue_style( 'sellkit', sellkit()->plugin_url() . 'assets/dist/admin/sellkit.css', [], sellkit()->version() ); wp_set_script_translations( 'sellkit', 'sellkit', sellkit()->plugin_dir() . 'languages' ); } /** * Register admin menu. * * @since 1.1.0 * @SuppressWarnings(PHPMD.NPathComplexity) */ public function register_admin_menu() { $menu_name = esc_html__( 'Sellkit', 'sellkit' ); $initial_page = 'sellkit-dashboard'; $submenu = [ 'sellkit-dashboard' => esc_html__( 'Dashboard', 'sellkit' ), 'sellkit-funnel' => esc_html__( 'Funnels', 'sellkit' ), 'sellkit-checkout' => esc_html__( 'Global Checkout', 'sellkit' ), ]; $submenu = apply_filters( 'sellkit_sub_menu', $submenu ); // Load SVG from disk. wp_remote_get() to the plugin URL often fails on local/SSL sites and yields an empty icon. $icon_path = sellkit()->plugin_dir() . 'assets/img/icons/sellkit-dashboard.svg'; $menu_icon = 'dashicons-cart'; if ( is_readable( $icon_path ) ) { // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents -- Reading a bundled asset from the filesystem. $svg_contents = file_get_contents( $icon_path ); if ( false !== $svg_contents && '' !== $svg_contents ) { $menu_icon = 'data:image/svg+xml;base64,' . base64_encode( $svg_contents ); } } add_menu_page( $menu_name, $menu_name, 'manage_options', $initial_page, [ $this, 'register_admin_menu_callback' ], $menu_icon, '58.1' ); foreach ( $submenu as $slug => $title ) { add_submenu_page( $initial_page, "{$menu_name} {$title}", $title, 'edit_theme_options', $slug, [ $this, 'register_admin_menu_callback' ] ); } } /** * Adds settings menu. * * @since 1.1.0 */ public function register_admin_settings_menu() { add_submenu_page( 'sellkit-dashboard', esc_html__( 'Sellkit', 'sellkit' ) . ' ' . esc_html__( 'Settings', 'sellkit' ), esc_html__( 'Settings', 'sellkit' ), 'edit_theme_options', 'sellkit-settings', [ $this, 'register_admin_menu_callback' ] ); } /** * Register admin menu callback. * * @since 1.1.0 */ public function register_admin_menu_callback() { ?>