boot(); } return self::$agenli_instance; } private function boot() { /* Admin */ add_action( 'admin_menu', array( $this, 'register_menu' ) ); add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_assets' ) ); /* Frontend */ add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_frontend_assets' ) ); /* AJAX settings */ add_action( 'wp_ajax_agenli_save_settings', array( $this, 'ajax_save_settings' ) ); /* AJAX leads */ add_action( 'wp_ajax_agenli_capture_lead', array( 'AGENLI_Leads', 'capture' ) ); add_action( 'wp_ajax_nopriv_agenli_capture_lead', array( 'AGENLI_Leads', 'capture' ) ); add_action( 'wp_ajax_agenli_export_leads', array( 'AGENLI_Leads', 'export_csv' ) ); /* AJAX sitemap */ add_action( 'wp_ajax_agenli_dismiss_review', array( 'AGENLI_Review', 'dismiss' ) ); add_action( 'wp_ajax_agenli_generate_sitemap', array( 'AGENLI_Sitemap', 'ajax_generate' ) ); /* AJAX robots */ add_action( 'wp_ajax_agenli_save_robots', array( 'AGENLI_Robots', 'ajax_save' ) ); add_action( 'wp_ajax_agenli_reset_robots', array( 'AGENLI_Robots', 'ajax_reset' ) ); /* AJAX llms */ add_action( 'wp_ajax_agenli_generate_llms', array( 'AGENLI_LLMS', 'ajax_generate' ) ); /* Boot modules */ AGENLI_SEO::init(); AGENLI_Sitemap::init(); AGENLI_Robots::init(); AGENLI_LLMS::init(); AGENLI_Schema::init(); AGENLI_Leads::init(); AGENLI_Analytics::init(); AGENLI_Review::init(); } /* Menu */ 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 features - 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', 'Import / Migrate', '💾 Import / Migrate', 'manage_options', 'agenli-import', 'agenli_page_import' ); add_submenu_page( 'agencyboost', 'Upgrade to Pro', '⭐ Upgrade', 'manage_options', 'agenli-upgrade', 'agenli_page_upgrade' ); } /* Admin assets */ public function enqueue_admin_assets( $hook ) { if ( false === strpos( $hook, 'agencyboost' ) && false === strpos( $hook, 'agenli-' ) ) { /* Still load on post edit screens for the SEO meta box */ $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' => agenli_is_pro() ? 'yes' : 'no', 'version' => AGENLI_VERSION, 'strings' => array( 'saved' => __( 'Saved!', 'agencyboost-lite' ), 'error' => __( 'Error saving. Please try again.', 'agencyboost-lite' ), 'confirm' => __( 'Are you sure?', 'agencyboost-lite' ), ), )); } /* Frontend assets */ public function enqueue_frontend_assets() { if ( agenli_get_option( 'popup_enabled', '0' ) !== '1' ) return; wp_enqueue_style( 'agenli-popup', AGENLI_URL . 'admin/css/admin.css', array(), AGENLI_VERSION ); } /* AJAX: save settings */ public function ajax_save_settings() { check_ajax_referer( 'agenli_nonce', 'nonce' ); if ( ! current_user_can( 'manage_options' ) ) { wp_send_json_error( array( 'message' => 'Unauthorised.' ) ); } // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized $raw = isset( $_POST['data'] ) ? (array) wp_unslash( $_POST['data'] ) : array(); $opts = get_option( 'agenli_options', array() ); foreach ( $raw as $k => $v ) { $opts[ sanitize_key( $k ) ] = sanitize_text_field( $v ); } update_option( 'agenli_options', $opts ); wp_send_json_success( array( 'message' => 'Settings saved.' ) ); } /* Activation */ public static function activate() { AGENLI_Leads::create_table(); AGENLI_Sitemap::on_activate(); AGENLI_Robots::on_activate(); AGENLI_LLMS::on_activate(); update_option( 'agenli_version', AGENLI_VERSION ); flush_rewrite_rules(); } /* Deactivation */ public static function deactivate() { flush_rewrite_rules(); } }