\n\n */\nclass WP_N8N_Admin_Ajax_Core {\n\n\t/**\n\t * Register AJAX handlers.\n\t *\n\t * @since 1.3.0\n\t */\n\tpublic static function register_handlers() {\n\t\t// Connection testing\n\t\tadd_action( 'wp_ajax_wp_n8n_test_connection', array( __CLASS__, 'test_connection' ) );\n\t\t\n\t\t// Log management\n\t\tadd_action( 'wp_ajax_wp_n8n_clear_logs', array( __CLASS__, 'clear_logs' ) );\n\t\tadd_action( 'wp_ajax_wp_n8n_load_clear_logs_modal', array( __CLASS__, 'load_clear_logs_modal' ) );\n\t}\n\n\t/**\n\t * Handle AJAX connection testing.\n\t *\n\t * @since 1.3.0\n\t */\n\tpublic static function test_connection() {\n\t\t// Verify nonce\n\t\tif ( ! wp_verify_nonce( $_POST['nonce'], 'wp_n8n_test_connection' ) ) {\n\t\t\twp_die( __( 'Security check failed', WP_N8N_AUTOMATOR_TEXT_DOMAIN ) );\n\t\t}\n\n\t\t// Check permissions\n\t\tif ( ! current_user_can( 'manage_options' ) ) {\n\t\t\twp_die( __( 'Insufficient permissions', WP_N8N_AUTOMATOR_TEXT_DOMAIN ) );\n\t\t}\n\n\t\t$webhook_url = sanitize_url( $_POST['webhook_url'] );\n\t\t$shared_secret = sanitize_text_field( $_POST['shared_secret'] );\n\t\t$timeout = intval( $_POST['timeout'] );\n\n\t\tif ( empty( $webhook_url ) || ! filter_var( $webhook_url, FILTER_VALIDATE_URL ) ) {\n\t\t\twp_send_json_error( __( 'Invalid webhook URL', WP_N8N_AUTOMATOR_TEXT_DOMAIN ) );\n\t\t}\n\n\t\t// Test the connection\n\t\t$webhook_handler = new WP_N8N_Webhook_Handler( $webhook_url, $shared_secret, $timeout );\n\t\t\n\t\t$test_data = array(\n\t\t\t'test' => true,\n\t\t\t'message' => 'Connection test from WP-n8n Automator',\n\t\t\t'timestamp' => current_time( 'Y-m-d H:i:s' ),\n\t\t\t'site_url' => get_site_url()\n\t\t);\n\n\t\t$result = $webhook_handler->send( $test_data, 'connection-test', 'admin-test' );\n\n\t\tif ( $result['success'] ) {\n\t\t\twp_send_json_success( array(\n\t\t\t\t'message' => __( 'Connection successful!', WP_N8N_AUTOMATOR_TEXT_DOMAIN ),\n\t\t\t\t'status_code' => $result['status_code'],\n\t\t\t\t'execution_time' => round( $result['execution_time'], 3 )\n\t\t\t));\n\t\t} else {\n\t\t\twp_send_json_error( array(\n\t\t\t\t'message' => $result['message'],\n\t\t\t\t'status_code' => $result['status_code'],\n\t\t\t\t'execution_time' => round( $result['execution_time'], 3 )\n\t\t\t));\n\t\t}\n\t}\n\n\t/**\n\t * Handle AJAX log clearing.\n\t *\n\t * @since 1.3.0\n\t */\n\tpublic static function clear_logs() {\n\t\t// Verify nonce\n\t\tif ( ! wp_verify_nonce( $_POST['nonce'], 'wp_n8n_clear_logs' ) ) {\n\t\t\twp_die( __( 'Security check failed', WP_N8N_AUTOMATOR_TEXT_DOMAIN ) );\n\t\t}\n\n\t\t// Check permissions\n\t\tif ( ! current_user_can( 'manage_options' ) ) {\n\t\t\twp_die( __( 'Insufficient permissions', WP_N8N_AUTOMATOR_TEXT_DOMAIN ) );\n\t\t}\n\n\t\t$clear_type = sanitize_text_field( $_POST['clear_type'] );\n\t\t$logger = new WP_N8N_Logger();\n\t\t$result = false;\n\t\t$message = '';\n\n\t\tswitch ( $clear_type ) {\n\t\t\tcase 'all':\n\t\t\t\t$result = $logger->clear_all_logs();\n\t\t\t\tif ( $result !== false ) {\n\t\t\t\t\t$message = sprintf( __( 'Successfully cleared %d log entries.', WP_N8N_AUTOMATOR_TEXT_DOMAIN ), $result );\n\t\t\t\t} else {\n\t\t\t\t\t$message = __( 'Failed to clear logs.', WP_N8N_AUTOMATOR_TEXT_DOMAIN );\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'failed':\n\t\t\t\t$result = $logger->clear_logs_by_status( 'failed' );\n\t\t\t\tif ( $result !== false ) {\n\t\t\t\t\t$message = sprintf( __( 'Successfully cleared %d failed log entries.', WP_N8N_AUTOMATOR_TEXT_DOMAIN ), $result );\n\t\t\t\t} else {\n\t\t\t\t\t$message = __( 'Failed to clear failed logs.', WP_N8N_AUTOMATOR_TEXT_DOMAIN );\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'old':\n\t\t\t\t$days = isset( $_POST['days'] ) ? intval( $_POST['days'] ) : 30;\n\t\t\t\t$result = $logger->cleanup_old_logs( $days );\n\t\t\t\tif ( $result !== false ) {\n\t\t\t\t\t$message = sprintf( __( 'Successfully cleared %d log entries older than %d days.', WP_N8N_AUTOMATOR_TEXT_DOMAIN ), $result, $days );\n\t\t\t\t} else {\n\t\t\t\t\t$message = __( 'Failed to clear old logs.', WP_N8N_AUTOMATOR_TEXT_DOMAIN );\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'preserve':\n\t\t\t\t$preserve = isset( $_POST['preserve'] ) ? intval( $_POST['preserve'] ) : 10;\n\t\t\t\t$result = $logger->clear_logs_preserve_recent( $preserve );\n\t\t\t\tif ( $result !== false ) {\n\t\t\t\t\t$message = sprintf( __( 'Successfully cleared %d log entries, preserving the %d most recent.', WP_N8N_AUTOMATOR_TEXT_DOMAIN ), $result, $preserve );\n\t\t\t\t} else {\n\t\t\t\t\t$message = __( 'Failed to clear logs while preserving recent entries.', WP_N8N_AUTOMATOR_TEXT_DOMAIN );\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\twp_send_json_error( __( 'Invalid clear type specified.', WP_N8N_AUTOMATOR_TEXT_DOMAIN ) );\n\t\t\t\treturn;\n\t\t}\n\n\t\tif ( $result !== false ) {\n\t\t\twp_send_json_success( array(\n\t\t\t\t'message' => $message,\n\t\t\t\t'cleared_count' => $result\n\t\t\t) );\n\t\t} else {\n\t\t\twp_send_json_error( $message );\n\t\t}\n\t}\n\n\t/**\n\t * Load the clear logs modal content via AJAX.\n\t *\n\t * @since 1.3.0\n\t */\n\tpublic static function load_clear_logs_modal() {\n\t\t// Verify nonce\n\t\tif ( ! wp_verify_nonce( $_POST['nonce'], 'wp_n8n_clear_logs' ) ) {\n\t\t\twp_die( __( 'Security check failed', WP_N8N_AUTOMATOR_TEXT_DOMAIN ) );\n\t\t}\n\n\t\t// Check permissions\n\t\tif ( ! current_user_can( 'manage_options' ) ) {\n\t\t\twp_die( __( 'Insufficient permissions', WP_N8N_AUTOMATOR_TEXT_DOMAIN ) );\n\t\t}\n\n\t\t// Load the modal template\n\t\tob_start();\n\t\tinclude_once WP_N8N_AUTOMATOR_PLUGIN_DIR . 'admin/views/view-clear-logs-modal.php';\n\t\t$modal_html = ob_get_clean();\n\n\t\twp_send_json_success( array( 'html' => $modal_html ) );\n\t}\n}\n https://www.arnet.co.uk/post-sitemap.xml 2025-05-07T14:34:44+00:00 https://www.arnet.co.uk/page-sitemap.xml 2025-08-04T22:03:20+00:00 https://www.arnet.co.uk/category-sitemap.xml 2025-05-07T14:34:44+00:00 https://www.arnet.co.uk/author-sitemap.xml 2025-07-25T13:37:34+00:00