'16154', 'slug' => 'king-addons', 'premium_slug' => 'king-addons-pro', 'type' => 'plugin', 'public_key' => 'pk_eac3624cbc14c1846cf1ab9abbd68', 'is_premium' => false, 'premium_suffix' => 'pro', // If your plugin is a serviceware, set this option to false. 'has_premium_version' => true, 'has_addons' => false, 'has_paid_plans' => true, 'has_affiliation' => 'selected', 'menu' => array( 'slug' => 'king-addons', 'first-path' => 'plugins.php', 'pricing' => false, 'contact' => false, 'support' => false, 'affiliation' => false, ), )); } return $king_addons_freemius; } // Init Freemius. king_addons_freemius(); // Signal that SDK was initiated. do_action('king_addons_freemius_loaded'); king_addons_freemius()->add_filter('show_deactivation_subscription_cancellation', '__return_false'); king_addons_freemius()->add_filter('deactivate_on_activation', '__return_false'); } /** * Safe check for Pro/Premium availability. * * This helper function safely checks if the premium code can be used, * preventing fatal errors if Freemius is not properly initialized. * * @since 51.1.40 * @return bool True if premium code can be used, false otherwise. */ if (!function_exists('king_addons_can_use_pro')) { function king_addons_can_use_pro(): bool { if (!function_exists('king_addons_freemius')) { return false; } $fs = king_addons_freemius(); if (!is_object($fs) || !method_exists($fs, 'can_use_premium_code')) { return false; } return (bool) $fs->can_use_premium_code(); } } if (!function_exists('king_addons_doActivation')) { function king_addons_doActivation() { add_option('king_addons_plugin_activated', true); if (false === get_option('king_addons_optionActivationTime')) { add_option('king_addons_optionActivationTime', absint(intval(strtotime('now')))); } // Ensure wishlist tables are created on activation. require_once plugin_dir_path(__FILE__) . 'includes/wishlist/Wishlist_DB.php'; \King_Addons\Wishlist\Wishlist_DB::maybe_create_tables(); // Ensure Smart Links tables are created on activation. require_once plugin_dir_path(__FILE__) . 'includes/extensions/Smart_Links/Smart_Links_DB.php'; \King_Addons\Smart_Links\Smart_Links_DB::maybe_create_tables(); update_option('king_addons_smart_links_flush_rewrite', 1); } register_activation_hook(__FILE__, 'king_addons_doActivation'); } if (!function_exists('king_addons_doDectivation')) { function king_addons_doDectivation() { delete_option('king_addons_HFB_flushed_rewrite_rules'); delete_option('king_addons_optionActivationTime'); } register_deactivation_hook(__FILE__, 'king_addons_doDectivation'); } if (!function_exists('king_addons_doRedirect_after_activation')) { function king_addons_doRedirect_after_activation() { if (did_action('elementor/loaded')) { if (get_option('king_addons_plugin_activated', false)) { delete_option('king_addons_plugin_activated'); wp_redirect(admin_url('admin.php?page=king-addons')); exit; } } } add_action('admin_init', 'king_addons_doRedirect_after_activation'); } /** * Main function * * @return void * @since 1.0.0 * @access public */ if (!function_exists('king_addons_doPlugin')) { /** @noinspection PhpMissingReturnTypeInspection */ function king_addons_doPlugin() { require_once(KING_ADDONS_PATH . 'includes/Core.php'); } // Using after_setup_theme to fix: PHP Notice: Function _load_textdomain_just_in_time was called incorrectly. add_action('after_setup_theme', 'king_addons_doPlugin'); } /** * Register Assets * * @return void * @since 1.0.0 * @access public */ if (!function_exists('king_addons_registerAssets')) { /** @noinspection PhpMissingReturnTypeInspection */ function king_addons_registerAssets() { require_once(KING_ADDONS_PATH . 'includes/RegisterAssets.php'); } add_action('wp_loaded', 'king_addons_registerAssets'); } /** * Enqueue small frontend-only CSS fixes. * * @return void * @since 51.1.42 */ if (!function_exists('king_addons_enqueue_frontend_fixes_css')) { function king_addons_enqueue_frontend_fixes_css(): void { if (is_admin()) { return; } wp_enqueue_style( KING_ADDONS_ASSETS_UNIQUE_KEY . '-fixes-for-elementor', KING_ADDONS_URL . 'includes/assets/css/fixes-for-elementor.css', [], KING_ADDONS_VERSION ); } add_action('wp_enqueue_scripts', 'king_addons_enqueue_frontend_fixes_css', 99); // Ensure the stylesheet is also loaded in Elementor's preview iframe inside the editor. add_action('elementor/frontend/after_enqueue_styles', 'king_addons_enqueue_frontend_fixes_css', 99); add_action('elementor/preview/enqueue_styles', 'king_addons_enqueue_frontend_fixes_css', 99); } /** * Hides spaming notices from another plugins on the plugin settings page * * @return void * @since 1.0.0 * @access public */ if (!function_exists('king_addons_hideAnotherNotices')) { /** @noinspection PhpMissingReturnTypeInspection */ function king_addons_hideAnotherNotices() { // Exclude the account page from notice hiding. // URL: /wp-admin/admin.php?page=king-addons-account if (isset($_GET['page']) && $_GET['page'] === 'king-addons-account') { return; } $screen = function_exists('get_current_screen') ? get_current_screen() : null; if (!$screen || empty($screen->id)) { return; } $current_screen = (string) $screen->id; // Legacy explicit screens that do not follow the generic prefixes. $legacy_screens = [ 'edit-king-addons-el-hf', 'edit-king-addons-fb-sub', 'header-footer_page_king-addons-el-hf-settings', ]; $is_king_addons_screen = (strpos($current_screen, 'king-addons_') === 0) || (strpos($current_screen, 'toplevel_page_king-addons') === 0) || in_array($current_screen, $legacy_screens, true); if ($is_king_addons_screen) { // Remove all notices remove_all_actions('user_admin_notices'); remove_all_actions('admin_notices'); } } add_action('in_admin_header', 'king_addons_hideAnotherNotices', 99); } /** * Custom admin footer text on King Addons pages * Shows rating request similar to WooCommerce * * @param string $footer_text Default footer text. * @return string Modified footer text. * @since 51.2.0 */ if (!function_exists('king_addons_admin_footer_text')) { function king_addons_admin_footer_text($footer_text) { if (!current_user_can('manage_options')) { return $footer_text; } $screen = function_exists('get_current_screen') ? get_current_screen() : null; if (!$screen || empty($screen->id)) { return $footer_text; } $current_screen = (string) $screen->id; // Check if we're on a King Addons admin page $legacy_screens = [ 'edit-king-addons-el-hf', 'edit-king-addons-fb-sub', 'header-footer_page_king-addons-el-hf-settings', ]; $is_king_addons_screen = (strpos($current_screen, 'king-addons_') === 0) || (strpos($current_screen, 'toplevel_page_king-addons') === 0) || in_array($current_screen, $legacy_screens, true); if (!$is_king_addons_screen) { return $footer_text; } // Check if user has already rated if (!get_option('king_addons_admin_footer_text_rated')) { $footer_text = sprintf( /* translators: 1: King Addons 2: five stars */ __('If you like %1$s please leave us a %2$s rating. A huge thanks in advance!', 'king-addons'), sprintf('%s', esc_html__('King Addons', 'king-addons')), '★★★★★' ); } else { $footer_text = __('Thank you for using King Addons!', 'king-addons'); } return '' . $footer_text . ''; } add_filter('admin_footer_text', 'king_addons_admin_footer_text', 1); } /** * Enqueue script for rating link click handler * * @return void * @since 51.2.0 */ if (!function_exists('king_addons_rating_script')) { function king_addons_rating_script() { if (!current_user_can('manage_options')) { return; } // Only on King Addons pages and only if not already rated $screen = function_exists('get_current_screen') ? get_current_screen() : null; if (!$screen || empty($screen->id)) { return; } $current_screen = (string) $screen->id; $legacy_screens = [ 'edit-king-addons-el-hf', 'edit-king-addons-fb-sub', 'header-footer_page_king-addons-el-hf-settings', ]; $is_king_addons_screen = (strpos($current_screen, 'king-addons_') === 0) || (strpos($current_screen, 'toplevel_page_king-addons') === 0) || in_array($current_screen, $legacy_screens, true); if (!$is_king_addons_screen || get_option('king_addons_admin_footer_text_rated')) { return; } $script = " (function() { 'use strict'; var ratingLink = document.querySelector('a.king-addons-rating-link'); if (ratingLink) { ratingLink.addEventListener('click', function(e) { var link = e.currentTarget; var formData = new FormData(); formData.append('action', 'king_addons_rated'); formData.append('nonce', '" . esc_js(wp_create_nonce('king_addons_rated')) . "'); fetch('" . esc_js(admin_url('admin-ajax.php')) . "', { method: 'POST', body: formData, credentials: 'same-origin' }); var parent = link.parentElement; if (parent) { parent.textContent = link.getAttribute('data-rated'); } }); } })(); "; $handle = 'king-addons-admin-footer-rating'; wp_register_script($handle, '', [], KING_ADDONS_VERSION, true); wp_enqueue_script($handle); wp_add_inline_script($handle, $script); } add_action('admin_enqueue_scripts', 'king_addons_rating_script'); } /** * AJAX handler for saving rated status * * @return void * @since 51.2.0 */ if (!function_exists('king_addons_rated_callback')) { function king_addons_rated_callback() { if (!current_user_can('manage_options')) { wp_die(-1, 403); } check_ajax_referer('king_addons_rated', 'nonce'); update_option('king_addons_admin_footer_text_rated', 1); wp_die(); } add_action('wp_ajax_king_addons_rated', 'king_addons_rated_callback'); } /** * Apply theme detection script to Account page * Reads user's theme preference and applies ka-v3-dark class if needed * * @return void * @since 51.2.0 */ if (!function_exists('king_addons_account_page_theme_script')) { function king_addons_account_page_theme_script() { $screen = function_exists('get_current_screen') ? get_current_screen() : null; if (!$screen || $screen->id !== 'king-addons_page_king-addons-account') { return; } // Get user's theme preference $theme_mode = get_user_meta(get_current_user_id(), 'king_addons_theme_mode', true); $allowed_theme_modes = ['dark', 'light', 'auto']; if (!in_array($theme_mode, $allowed_theme_modes, true)) { $theme_mode = 'dark'; // Default to dark theme } ?> id == 'king-addons_page_king-addons-pricing') { wp_enqueue_style('king-addons-plugin-style-pricing', plugin_dir_url(__FILE__) . 'includes/admin/css/pricing.css', '', KING_ADDONS_VERSION); } // Load Account page styles if (get_current_screen()->id == 'king-addons_page_king-addons-account') { wp_enqueue_style('king-addons-plugin-style-account', plugin_dir_url(__FILE__) . 'includes/admin/css/account.css', '', KING_ADDONS_VERSION); } } add_action('admin_enqueue_scripts', 'king_addons_styleMenuIcon'); } /** * Add "Upgrade to Pro" link to the Plugins list table. * * @param array $links Existing plugin action links. * * @return array Modified action links with Upgrade link. * @since 24.12.78 */ if (! function_exists('king_addons_add_action_links')) { function king_addons_add_action_links(array $links): array { // Pricing page with UTM parameters for tracking. $pro_url = 'https://kingaddons.com/pricing/?utm_source=kng-plugin-list&utm_medium=wp-plugins-page&utm_campaign=kng'; // Prepend the Upgrade link. $links['go_pro'] = sprintf( '%2$s', esc_url($pro_url), esc_html__('Upgrade to Pro', 'king-addons') ); return $links; } if (!king_addons_freemius()->can_use_premium_code__premium_only()) { add_filter('plugin_action_links_' . plugin_basename(__FILE__), 'king_addons_add_action_links'); add_filter('network_admin_plugin_action_links_' . plugin_basename(__FILE__), 'king_addons_add_action_links'); } }