admin_url( 'admin-ajax.php' ), 'nonce' => wp_create_nonce( ZAINLY_Chat::NONCE_ACTION ), 'i18n' => ZAINLY_Editor_Panel::chat_i18n(), ) ); wp_enqueue_style( 'zainly-blog-css', ZAINLY_URL . 'admin/css/blog-writer.css', array( 'zainly-chat-css' ), ZAINLY_VERSION ); wp_enqueue_script( 'zainly-blog-writer', ZAINLY_URL . 'admin/js/blog-writer.js', array( 'jquery' ), ZAINLY_VERSION, true ); wp_localize_script( 'zainly-blog-writer', 'zainlyBlog', ZAINLY_Blog::js_config( 0 ) ); wp_enqueue_script( 'zainly-settings', ZAINLY_URL . 'admin/js/settings.js', array( 'jquery' ), ZAINLY_VERSION, true ); wp_localize_script( 'zainly-settings', 'zainlySettings', array( 'ajaxUrl' => admin_url( 'admin-ajax.php' ), 'nonce' => wp_create_nonce( 'zainly_settings_ajax' ), 'i18n' => array( 'test' => __( 'Test connection', 'zainly-writer' ), 'testing' => __( 'Testing...', 'zainly-writer' ), 'network' => __( 'Server communication error.', 'zainly-writer' ), 'show' => __( 'Show', 'zainly-writer' ), 'unsaved' => __( 'You have unsaved changes.', 'zainly-writer' ), ), ) ); wp_enqueue_script( 'zainly-batch-runner', ZAINLY_URL . 'admin/js/batch-runner.js', array( 'jquery' ), ZAINLY_VERSION, true ); wp_localize_script( 'zainly-batch-runner', 'zainlyData', array( 'ajaxUrl' => admin_url( 'admin-ajax.php' ), 'nonce' => wp_create_nonce( 'zainly_batch_nonce' ), 'i18n' => array( 'processing' => __( 'Processing items...', 'zainly-writer' ), 'paused' => __( 'Batch paused. Click Resume to continue.', 'zainly-writer' ), 'completed' => __( 'Batch complete! All requested items have been processed.', 'zainly-writer' ), 'cancelled' => __( 'Batch cancelled.', 'zainly-writer' ), 'emptyQueue' => __( 'No items found matching the selected criteria.', 'zainly-writer' ), 'confirmStart' => __( 'Are you sure you want to start generating descriptions?', 'zainly-writer' ), 'confirmOverwrite' => __( 'You selected to overwrite existing descriptions. This will replace existing excerpts. Proceed?', 'zainly-writer' ), 'confirmStop' => __( 'Are you sure you want to stop the batch process?', 'zainly-writer' ), 'errorFetchStats' => __( 'Could not load statistics from server.', 'zainly-writer' ), 'errorFetchQueue' => __( 'Could not retrieve the queue from server.', 'zainly-writer' ), ), ) ); } /** * AJAX: test the AI connection. */ public static function ajax_test_provider() { check_ajax_referer( 'zainly_settings_ajax', 'nonce' ); if ( ! current_user_can( 'manage_options' ) ) { wp_send_json_error( array( 'message' => __( 'Unauthorized user.', 'zainly-writer' ) ) ); } $result = ZAINLY_AI_Client::test_connection(); if ( $result['success'] ) { wp_send_json_success( array( 'message' => $result['message'] ) ); } wp_send_json_error( array( 'message' => $result['message'] ) ); } /** * Handle settings and clear-logs form submissions. */ public static function handle_form_submissions() { if ( ! current_user_can( 'manage_options' ) ) { return; } // Save Settings if ( isset( $_POST['zainly_submit_settings'] ) ) { check_admin_referer( 'zainly_save_settings', 'zainly_settings_nonce' ); $submitted = isset( $_POST['zainly_settings'] ) ? (array) wp_unslash( $_POST['zainly_settings'] ) : array(); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- sanitized field by field in ZAINLY_Settings::sanitize(). ZAINLY_Settings::update_all( $submitted ); add_settings_error( 'zainly_messages', 'zainly_settings_saved', __( 'Settings have been successfully saved.', 'zainly-writer' ), 'success' ); } // Clear Logs if ( isset( $_POST['zainly_clear_logs_btn'] ) ) { check_admin_referer( 'zainly_clear_logs', 'zainly_clear_logs_nonce' ); ZAINLY_Logger::clear_logs(); add_settings_error( 'zainly_messages', 'zainly_logs_cleared', __( 'Debug logs have been cleared.', 'zainly-writer' ), 'success' ); } } /** * Render plugin dashboard with tabs. */ public static function render_admin_page() { if ( ! current_user_can( 'manage_options' ) ) { return; } $current_tab = isset( $_GET['tab'] ) ? sanitize_key( wp_unslash( $_GET['tab'] ) ) : 'settings'; // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- read-only tab switch. $valid_tabs = array( 'settings', 'chat', 'blog', 'batch', 'logs' ); if ( ! in_array( $current_tab, $valid_tabs, true ) ) { $current_tab = 'settings'; } ?>

v

' . esc_html( ZAINLY_AUTHOR ) . '', 'zaincorporations.com | LinkedIn' ); ?>