admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('pc_announcements_274_nonce'), 'i18n' => array( 'error_occurred' => __('An error occurred. Please try again.', 'pc-announcements-274'), 'choose_image' => __('Choose Image', 'pc-announcements-274'), 'preview' => __('Preview', 'pc-announcements-274'), 'end_date_warning' => __('End date should be after start date.', 'pc-announcements-274') ) )); } /** * Render main announcements page */ public function render_announcements_page() { $current_page = isset($_GET['paged']) ? max(1, intval($_GET['paged'])) : 1; $per_page = 20; $offset = ($current_page - 1) * $per_page; global $wpdb; $table_name = PC_Announcements_274_Install::get_table_name(); if (empty($table_name)) { include PC_ANNOUNCEMENTS_274_PLUGIN_DIR . 'admin/templates/error-page.php'; return; } // Get total count $total = $wpdb->get_var("SELECT COUNT(*) FROM $table_name"); if ($total === null) { $total = 0; } $total_pages = ceil($total / $per_page); // Get announcements $announcements = $wpdb->get_results($wpdb->prepare( "SELECT * FROM $table_name ORDER BY created_at DESC LIMIT %d OFFSET %d", $per_page, $offset )); if ($announcements === null) { $announcements = array(); } include PC_ANNOUNCEMENTS_274_PLUGIN_DIR . 'admin/templates/list-page.php'; } /** * Render add new announcement page */ public function render_add_announcement_page() { $announcement_id = isset($_GET['id']) ? intval($_GET['id']) : 0; $announcement = null; if ($announcement_id > 0) { global $wpdb; $table_name = PC_Announcements_274_Install::get_table_name(); if (!empty($table_name)) { $announcement = $wpdb->get_row($wpdb->prepare("SELECT * FROM $table_name WHERE id = %d", $announcement_id)); } } include PC_ANNOUNCEMENTS_274_PLUGIN_DIR . 'admin/templates/edit-page.php'; } /** * Handle AJAX requests */ public function handle_ajax_requests() { check_ajax_referer('pc_announcements_274_nonce', 'nonce'); if (!current_user_can('manage_options')) { wp_die(__('You do not have sufficient permissions.', 'pc-announcements-274')); } $action = isset($_POST['sub_action']) ? sanitize_text_field($_POST['sub_action']) : ''; switch ($action) { case 'save_announcement': $this->save_announcement(); break; case 'delete_announcement': $this->delete_announcement(); break; default: wp_send_json_error(array('message' => __('Invalid action.', 'pc-announcements-274'))); } } /** * Save announcement */ private function save_announcement() { global $wpdb; $table_name = PC_Announcements_274_Install::get_table_name(); $id = isset($_POST['id']) ? intval($_POST['id']) : 0; $title = sanitize_text_field($_POST['title']); $message = wp_kses_post($_POST['message']); $banner_color = sanitize_hex_color($_POST['banner_color']); $link_url = esc_url_raw($_POST['link_url']); $image_url = esc_url_raw($_POST['image_url']); $start_date = !empty($_POST['start_date']) ? sanitize_text_field($_POST['start_date']) : null; $end_date = !empty($_POST['end_date']) ? sanitize_text_field($_POST['end_date']) : null; $status = sanitize_text_field($_POST['status']); if (empty($title)) { wp_send_json_error(array('message' => __('Title is required.', 'pc-announcements-274'))); } if (empty($banner_color)) { $banner_color = '#0d47a1'; } $data = array( 'title' => $title, 'message' => $message, 'banner_color' => $banner_color, 'link_url' => $link_url, 'image_url' => $image_url, 'start_date' => $start_date, 'end_date' => $end_date, 'status' => $status, 'updated_at' => current_time('mysql') ); $format = array('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s'); if ($id > 0) { $result = $wpdb->update($table_name, $data, array('id' => $id), $format, array('%d')); } else { $data['created_at'] = current_time('mysql'); $data['created_by'] = get_current_user_id(); $format = array('%d', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s'); $result = $wpdb->insert($table_name, $data, $format); $id = $wpdb->insert_id; } if ($result === false) { wp_send_json_error(array('message' => __('Failed to save announcement.', 'pc-announcements-274'))); } wp_send_json_success(array( 'message' => $id > 0 && isset($_POST['id']) ? __('Announcement updated successfully!', 'pc-announcements-274') : __('Announcement created successfully!', 'pc-announcements-274'), 'id' => $id )); } /** * Delete announcement */ private function delete_announcement() { global $wpdb; $table_name = PC_Announcements_274_Install::get_table_name(); $id = intval($_POST['id']); if ($id <= 0) { wp_send_json_error(array('message' => __('Invalid announcement ID.', 'pc-announcements-274'))); } $result = $wpdb->delete($table_name, array('id' => $id), array('%d')); if ($result === false) { wp_send_json_error(array('message' => __('Failed to delete announcement.', 'pc-announcements-274'))); } wp_send_json_success(array('message' => __('Announcement deleted successfully!', 'pc-announcements-274'))); } }