'; echo '
' . esc_html( $desc ) . '
'; } echo 'Upgrade to Pro → $19.99/yr'; echo '30-day money-back guarantee • Instant activation
'; echo ''; return false; } class AGENLI_Core { private static $instance = null; public static function instance() { if ( null === self::$instance ) { self::$instance = new self(); self::$instance->boot(); } return self::$instance; } private function boot() { /* Flush rewrite rules once after activation */ if ( get_option( 'agenli_flush_rewrite' ) === '1' ) { AGENLI_Sitemap::register_rewrites(); AGENLI_LLMS::register_rewrites(); delete_option( 'agenli_flush_rewrite' ); flush_rewrite_rules(); } add_action( 'admin_menu', array( $this, 'register_menu' ) ); add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_assets' ) ); add_action( 'wp_enqueue_scripts', array( $this, 'frontend' ) ); /* AJAX */ add_action( 'wp_ajax_agenli_save_settings', array( $this, 'ajax_save_settings' ) ); add_action( 'wp_ajax_agenli_export_leads', array( 'AGENLI_Leads', 'export_csv' ) ); add_action( 'wp_ajax_nopriv_agenli_capture_lead', array( 'AGENLI_Leads', 'capture' ) ); add_action( 'wp_ajax_agenli_capture_lead', array( 'AGENLI_Leads', 'capture' ) ); add_action( 'wp_ajax_agenli_generate_sitemap', array( 'AGENLI_Sitemap', 'ajax_generate' ) ); add_action( 'wp_ajax_agenli_save_robots', array( 'AGENLI_Robots', 'ajax_save' ) ); add_action( 'wp_ajax_agenli_reset_robots', array( 'AGENLI_Robots', 'ajax_reset' ) ); add_action( 'wp_ajax_agenli_generate_llms', array( 'AGENLI_LLMS', 'ajax_generate' ) ); /* Boot modules */ AGENLI_Analytics::init(); AGENLI_Leads::init(); AGENLI_SEO::init(); AGENLI_Sitemap::init(); AGENLI_Robots::init(); AGENLI_LLMS::init(); AGENLI_Schema::init(); } public function register_menu() { add_menu_page( 'AgencyBoost', 'AgencyBoost', 'manage_options', 'agencyboost', 'agenli_page_dashboard', 'dashicons-star-filled', 30 ); /* Free features */ add_submenu_page( 'agencyboost', 'Dashboard', 'Dashboard', 'manage_options', 'agencyboost', 'agenli_page_dashboard' ); add_submenu_page( 'agencyboost', 'On-Page SEO', 'On-Page SEO', 'manage_options', 'agenli-seo', 'agenli_page_seo' ); add_submenu_page( 'agencyboost', 'Sitemap', 'Sitemap', 'manage_options', 'agenli-sitemap', 'agenli_page_sitemap' ); add_submenu_page( 'agencyboost', 'Robots.txt', 'Robots.txt', 'manage_options', 'agenli-robots', 'agenli_page_robots' ); add_submenu_page( 'agencyboost', 'Lead Capture', 'Lead Capture', 'manage_options', 'agenli-leads', 'agenli_page_leads' ); /* Pro gated */ add_submenu_page( 'agencyboost', 'AI Content', 'AI Content 🔒', 'manage_options', 'agenli-ai-content', 'agenli_page_pro_feature' ); add_submenu_page( 'agencyboost', 'Keyword Intel', 'Keyword Intel 🔒', 'manage_options', 'agenli-keyword', 'agenli_page_pro_feature' ); add_submenu_page( 'agencyboost', 'Analytics', 'Analytics 🔒', 'manage_options', 'agenli-analytics', 'agenli_page_pro_feature' ); add_submenu_page( 'agencyboost', 'Local SEO', 'Local SEO 🔒', 'manage_options', 'agenli-local-seo', 'agenli_page_pro_feature' ); add_submenu_page( 'agencyboost', 'PDF Reports', 'PDF Reports 🔒', 'manage_options', 'agenli-reports', 'agenli_page_pro_feature' ); add_submenu_page( 'agencyboost', 'LLMs.txt', 'LLMs.txt 🔒', 'manage_options', 'agenli-llms', 'agenli_page_llms' ); add_submenu_page( 'agencyboost', 'Schema Markup', 'Schema Markup 🔒', 'manage_options', 'agenli-schema', 'agenli_page_schema' ); /* Settings */ add_submenu_page( 'agencyboost', 'AI Providers', 'AI Providers 🔒', 'manage_options', 'agenli-ai-providers', 'agenli_page_pro_feature' ); add_submenu_page( 'agencyboost', 'Email / SMTP', 'Email / SMTP 🔒', 'manage_options', 'agenli-email', 'agenli_page_pro_feature' ); add_submenu_page( 'agencyboost', 'Analytics Setup', 'Analytics Setup', 'manage_options', 'agenli-analytics-setup', 'agenli_page_analytics_setup' ); add_submenu_page( 'agencyboost', 'License', '🔑 License', 'manage_options', 'agenli-license', 'agenli_page_license' ); add_submenu_page( 'agencyboost', 'Upgrade to Pro', '⭐ Upgrade', 'manage_options', 'agenli-upgrade', 'agenli_page_upgrade' ); } public function enqueue_assets( $hook ) { if ( strpos( $hook, 'agencyboost' ) === false && strpos( $hook, 'agenli-' ) === false ) { $screen = get_current_screen(); if ( ! $screen || 'post' !== $screen->base ) return; } wp_enqueue_style( 'agenli-admin', AGENLI_URL . 'admin/css/admin.css', array(), AGENLI_VERSION ); wp_enqueue_script( 'agenli-admin', AGENLI_URL . 'admin/js/admin.js', array( 'jquery' ), AGENLI_VERSION, true ); wp_localize_script( 'agenli-admin', 'AGENLI', array( 'ajax' => admin_url( 'admin-ajax.php' ), 'nonce' => wp_create_nonce( 'agenli_nonce' ), 'is_pro' => 'no', 'version' => AGENLI_VERSION, 'strings' => array( 'saved' => 'Saved!', 'error' => 'Error saving.', 'confirm' => 'Are you sure?', ), )); $agenli_js = '(function(jq){jq(document).on("click",".agenli-tab",function(){var t=jq(this).data("tab");jq(".agenli-tab").removeClass("active");jq(this).addClass("active");jq(".agenli-panel").removeClass("active");jq("#agenli-panel-"+t).addClass("active");});jq(document).on("input","#agenli_seo_title",function(){var l=jq(this).val().length;jq("#agenli-title-count").text(l).attr("class",l<=60?"agenli-ok":(l<=70?"agenli-warn":"agenli-err"));if(jq(this).val())jq("#agenli-sp-title").text(jq(this).val());});jq(document).on("input","#agenli_seo_desc",function(){var l=jq(this).val().length;jq("#agenli-desc-count").text(l).attr("class",(l>=120&&l<=160)?"agenli-ok":(l>0&&l<120?"agenli-warn":(l>160?"agenli-err":"agenli-muted")));if(jq(this).val())jq("#agenli-sp-desc").text(jq(this).val());})})(jQuery);'; wp_add_inline_script( 'agenli-admin', $agenli_js ); } public function frontend() { if ( agenli_get_option( 'popup_enabled', '0' ) !== '1' ) return; wp_enqueue_style( 'agenli-popup', AGENLI_URL . 'admin/css/admin.css', array(), AGENLI_VERSION ); } public function ajax_save_settings() { check_ajax_referer( 'agenli_nonce', 'nonce' ); if ( ! current_user_can( 'manage_options' ) ) wp_die( 'Unauthorised' ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.ValidatedSanitizedInput.MissingUnslash $data = isset( $_POST['data'] ) ? (array) wp_unslash( $_POST['data'] ) : array(); $opts = get_option( 'agenli_options', array() ); foreach ( $data as $k => $v ) { $opts[ sanitize_key( $k ) ] = sanitize_text_field( $v ); } update_option( 'agenli_options', $opts ); wp_send_json_success( array( 'message' => 'Saved.' ) ); } public static function activate() { AGENLI_Leads::create_table(); AGENLI_Robots::on_activate(); update_option( 'agenli_version', AGENLI_VERSION ); update_option( 'agenli_flush_rewrite', '1' ); } public static function deactivate() {} }