%s', admin_url( 'options-general.php?page=ai-internal-links' ), __( 'Settings', 'ai-internal-links' ) ); array_unshift( $links, $settings_link ); return $links; } /** * Register settings. */ public static function register_settings() { register_setting( 'aiil_settings', 'aiil_settings', array( 'type' => 'array', 'sanitize_callback' => array( __CLASS__, 'sanitize_settings' ), ) ); // General section. add_settings_section( 'aiil_general', __( 'General Settings', 'ai-internal-links' ), array( __CLASS__, 'render_general_section' ), 'ai-internal-links' ); // License field (only if Pro is installed). if ( function_exists( 'aiil_pro' ) || class_exists( 'AIIL_Pro_Plugin' ) ) { add_settings_field( 'license_key', __( 'License Key', 'ai-internal-links' ), array( __CLASS__, 'render_license_field' ), 'ai-internal-links', 'aiil_general' ); } add_settings_field( 'provider', __( 'AI Provider', 'ai-internal-links' ), array( __CLASS__, 'render_provider_field' ), 'ai-internal-links', 'aiil_general' ); add_settings_field( 'max_links', __( 'Maximum Links', 'ai-internal-links' ), array( __CLASS__, 'render_max_links_field' ), 'ai-internal-links', 'aiil_general' ); add_settings_field( 'post_types', __( 'Enable for Post Types', 'ai-internal-links' ), array( __CLASS__, 'render_post_types_field' ), 'ai-internal-links', 'aiil_general' ); add_settings_field( 'linking_post_types', __( 'Available Post Types for Linking', 'ai-internal-links' ), array( __CLASS__, 'render_linking_post_types_field' ), 'ai-internal-links', 'aiil_general' ); // OpenAI section. add_settings_section( 'aiil_openai', __( 'OpenAI Configuration', 'ai-internal-links' ), array( __CLASS__, 'render_openai_section' ), 'ai-internal-links' ); add_settings_field( 'openai_api_key', __( 'API Key', 'ai-internal-links' ), array( __CLASS__, 'render_openai_api_key_field' ), 'ai-internal-links', 'aiil_openai' ); add_settings_field( 'openai_model', __( 'Model', 'ai-internal-links' ), array( __CLASS__, 'render_openai_model_field' ), 'ai-internal-links', 'aiil_openai' ); } /** * Register advanced settings section (called with priority 30 to appear last). * Only show this section if there are fields to display (Pro active). */ public static function register_advanced_settings() { // Only show Advanced section if Pro is active (otherwise it would be empty). if ( ! AIIL_Core::is_licence_active() ) { return; } // Advanced section. add_settings_section( 'aiil_advanced', __( 'Advanced Settings', 'ai-internal-links' ), array( __CLASS__, 'render_advanced_section' ), 'ai-internal-links' ); /*add_settings_field( 'enable_logging', __( 'Enable Logging', 'ai-internal-links' ), array( __CLASS__, 'render_logging_field' ), 'ai-internal-links', 'aiil_advanced' );*/ // Additional system prompt field (Premium only). add_settings_field( 'additional_system_prompt', __( 'Additional System Prompt', 'ai-internal-links' ), array( __CLASS__, 'render_additional_system_prompt_field' ), 'ai-internal-links', 'aiil_advanced' ); } /** * Sanitize settings. * * @param array $input Input settings. * @return array */ public static function sanitize_settings( $input ) { $sanitized = array(); $sanitized['provider'] = isset( $input['provider'] ) ? sanitize_text_field( $input['provider'] ) : 'openai'; $sanitized['max_links'] = isset( $input['max_links'] ) ? absint( $input['max_links'] ) : 5; $sanitized['openai_api_key'] = isset( $input['openai_api_key'] ) ? sanitize_text_field( $input['openai_api_key'] ) : ''; $sanitized['openai_model'] = isset( $input['openai_model'] ) ? sanitize_text_field( $input['openai_model'] ) : 'gpt-4o-mini'; $sanitized['enable_logging'] = isset( $input['enable_logging'] ) ? (bool) $input['enable_logging'] : false; $sanitized['post_types'] = isset( $input['post_types'] ) && is_array( $input['post_types'] ) ? array_map( 'sanitize_text_field', $input['post_types'] ) : array( 'post', 'page' ); $sanitized['linking_post_types'] = isset( $input['linking_post_types'] ) && is_array( $input['linking_post_types'] ) ? array_map( 'sanitize_text_field', $input['linking_post_types'] ) : array(); // Additional system prompt (only sanitize if Pro is active, otherwise don't save it). $sanitized['additional_system_prompt'] = ( AIIL_Core::is_licence_active() && isset( $input['additional_system_prompt'] ) ) ? sanitize_textarea_field( $input['additional_system_prompt'] ) : ''; /** * Filter sanitized settings. * * @since 1.0.0 * @param array $sanitized Sanitized settings. * @param array $input Raw input. */ return apply_filters( 'aiil_sanitize_settings', $sanitized, $input ); } /** * Enqueue settings assets. * * @param string $hook Page hook. */ public static function enqueue_assets( $hook ) { if ( 'settings_page_ai-internal-links' !== $hook ) { return; } wp_enqueue_style( 'aiil-settings', AIIL_PLUGIN_URL . 'assets/css/settings.css', array(), AIIL_VERSION ); wp_enqueue_script( 'aiil-settings', AIIL_PLUGIN_URL . 'assets/js/settings.js', array( 'jquery' ), AIIL_VERSION, true ); wp_localize_script( 'aiil-settings', 'aiilSettings', array( 'ajaxUrl' => admin_url( 'admin-ajax.php' ), 'nonce' => wp_create_nonce( 'aiil_settings' ), 'isPremium' => AIIL_Core::is_licence_active(), 'i18n' => array( 'testing' => __( 'Testing...', 'ai-internal-links' ), 'testSuccess' => __( 'Connection successful!', 'ai-internal-links' ), 'testFailed' => __( 'Connection failed. Please check your credentials.', 'ai-internal-links' ), ), ) ); } /** * Render settings page. */ public static function render_page() { if ( ! current_user_can( 'manage_options' ) ) { return; } // Get current tab. // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Tab parameter is read-only for UI display, no state changes occur. $current_tab = isset( $_GET['tab'] ) ? sanitize_text_field( wp_unslash( $_GET['tab'] ) ) : 'settings'; // Check if user can access bulk tab. $can_access_bulk = current_user_can( 'edit_posts' ) && AIIL_Core::is_licence_active(); ?>
Pro version.', 'ai-internal-links' ),
'https://ai-internal-links.com/'
)
);
?>
Pro version.', 'ai-internal-links' ),
'https://ai-internal-links.com/'
)
);
?>
Pro version.', 'ai-internal-links' ),
'https://ai-internal-links.com/'
)
);
?>
Pro version to access advanced models like Gemini 2.0 Flash for improved link prediction quality.', 'ai-internal-links' ),
'https://ai-internal-links.com/'
)
);
?>
license ) || ! is_object( $pro->license ) ) { // Initialize it manually if needed. if ( class_exists( 'AIIL_Pro_License_Manager' ) ) { $pro->license = new AIIL_Pro_License_Manager(); } else { return; } } $license = $pro->license; $data = $license->get_license_data(); $is_valid = $license->is_valid(); if ( $is_valid ) { // License is active - show status only (no form elements). ?>
get_masked_key() ); ?>
' . esc_html( $data['domain'] ) . ''
);
?>
Purchase a license', 'ai-internal-links' ), 'https://ai-internal-links.com/' ) ); ?>