prefix . 'school_events'; $t_teachers = $wpdb->prefix . 'school_teachers'; // 1. Status Toggle Handler (Activate / Deactivate) with nonce check if ( isset( $_GET['action'] ) && 'toggle_status' === $_GET['action'] && isset( $_GET['event_id'] ) ) { $ev_id = intval( $_GET['event_id'] ); check_admin_referer( 'schoolslots_toggle_event_' . $ev_id ); $current_status = $wpdb->get_var( $wpdb->prepare( "SELECT is_active FROM {$t_events} WHERE id = %d", $ev_id ) ); if ( null !== $current_status ) { $new_status = ( 1 === intval( $current_status ) ? 0 : 1 ); $wpdb->update( $t_events, array( 'is_active' => $new_status, ), array( 'id' => $ev_id, ) ); echo '

' . esc_html__( 'Event status updated successfully.', 'schoolslots' ) . '

'; } } $edit_event = ( isset( $_GET['edit'] ) ? $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$t_events} WHERE id = %d", intval( $_GET['edit'] ) ) ) : null ); // 2. Save / Create Event if ( isset( $_POST['schoolslots_save_event'] ) ) { check_admin_referer( 'schoolslots_event_nonce' ); $ev_type = ( isset( $_POST['event_type'] ) ? sanitize_text_field( wp_unslash( $_POST['event_type'] ) ) : 'kozponti_fogado' ); $event_title = ( isset( $_POST['event_title'] ) ? sanitize_text_field( wp_unslash( $_POST['event_title'] ) ) : '' ); $event_date = ( !empty( $_POST['event_date'] ) ? sanitize_text_field( wp_unslash( $_POST['event_date'] ) ) : null ); $ev_id = ( isset( $_POST['event_id'] ) ? intval( $_POST['event_id'] ) : 0 ); $is_active = ( isset( $_POST['is_active'] ) ? 1 : 0 ); if ( empty( $event_title ) || empty( $event_date ) ) { echo '

' . esc_html__( 'Please provide both the event title and date.', 'schoolslots' ) . '

'; } else { $location_room = ( isset( $_POST['location_room'] ) ? sanitize_text_field( wp_unslash( $_POST['location_room'] ) ) : '' ); $end_date = $event_date; $start_time = '14:00:00'; $end_time = '18:00:00'; $slot_duration = 15; $buffer_minutes = 0; $max_capacity = 0; $deadline_type = 'prev_day'; $deadline_time = '17:00:00'; $daily_schedule = null; $absent_teachers = null; if ( !empty( $_POST['deadline_type'] ) ) { $deadline_type = sanitize_text_field( wp_unslash( $_POST['deadline_type'] ) ); } if ( !empty( $_POST['deadline_time'] ) ) { $dl_time = sanitize_text_field( wp_unslash( $_POST['deadline_time'] ) ); $deadline_time = ( 5 === strlen( $dl_time ) ? $dl_time . ':00' : $dl_time ); } if ( 'kozponti_fogado' === $ev_type ) { $end_date = $event_date; $s_time = ( !empty( $_POST['start_time'] ) ? sanitize_text_field( wp_unslash( $_POST['start_time'] ) ) : '14:00' ); $e_time = ( !empty( $_POST['end_time'] ) ? sanitize_text_field( wp_unslash( $_POST['end_time'] ) ) : '18:00' ); $start_time = ( 5 === strlen( $s_time ) ? $s_time . ':00' : $s_time ); $end_time = ( 5 === strlen( $e_time ) ? $e_time . ':00' : $e_time ); $slot_duration = ( isset( $_POST['slot_duration'] ) ? max( 1, intval( $_POST['slot_duration'] ) ) : 15 ); $buffer_minutes = ( isset( $_POST['buffer_minutes'] ) ? max( 0, intval( $_POST['buffer_minutes'] ) ) : 0 ); $max_capacity = 0; if ( !empty( $_POST['absent_teachers'] ) && is_array( $_POST['absent_teachers'] ) ) { $absent_ids = array_map( 'intval', wp_unslash( $_POST['absent_teachers'] ) ); $absent_teachers = wp_json_encode( array_values( array_filter( $absent_ids ) ) ); } else { $absent_teachers = wp_json_encode( array() ); } } $data_arr = array( 'event_type' => $ev_type, 'teacher_id' => 0, 'event_title' => $event_title, 'location_room' => $location_room, 'event_date' => $event_date, 'end_date' => $end_date, 'start_time' => $start_time, 'end_time' => $end_time, 'slot_duration' => $slot_duration, 'buffer_minutes' => $buffer_minutes, 'break_start' => null, 'break_end' => null, 'max_capacity' => $max_capacity, 'deadline_type' => $deadline_type, 'deadline_time' => $deadline_time, 'daily_schedule' => $daily_schedule, 'absent_teachers' => $absent_teachers, 'is_active' => $is_active, ); if ( $ev_id > 0 ) { $res = $wpdb->update( $t_events, $data_arr, array( 'id' => $ev_id, ) ); if ( false !== $res ) { echo '

' . esc_html__( 'Event updated successfully.', 'schoolslots' ) . '

'; $edit_event = null; } } else { $res = $wpdb->insert( $t_events, $data_arr ); if ( false !== $res ) { echo '

' . sprintf( /* translators: %s: event title */ esc_html__( 'Event "%s" created successfully.', 'schoolslots' ), esc_html( $event_title ) ) . '

'; } } } } // 3. Bulk Delete & Single Delete Event if ( isset( $_POST['bulk_action_events'] ) && 'delete' === $_POST['bulk_action_events'] && !empty( $_POST['event_ids'] ) ) { check_admin_referer( 'schoolslots_bulk_events_action_nonce' ); $e_ids = array_map( 'intval', (array) wp_unslash( $_POST['event_ids'] ) ); $del_cnt = 0; foreach ( $e_ids as $eid ) { if ( $wpdb->delete( $t_events, array( 'id' => $eid, ) ) ) { ++$del_cnt; } } if ( $del_cnt > 0 ) { /* translators: %d: number of deleted events */ $bulk_msg = sprintf( _n( '%d event deleted successfully.', '%d events deleted successfully.', (int) $del_cnt, 'schoolslots' ), (int) $del_cnt ); echo '

' . esc_html( $bulk_msg ) . '

'; } } if ( isset( $_GET['delete'] ) ) { $del_id = intval( $_GET['delete'] ); check_admin_referer( 'schoolslots_delete_event_' . $del_id ); $del_res = $wpdb->delete( $t_events, array( 'id' => $del_id, ) ); if ( false !== $del_res ) { echo '

' . esc_html__( 'Event deleted successfully.', 'schoolslots' ) . '

'; } } // 4. Filtering and Sorting $filter_type = ( isset( $_GET['filter_type'] ) ? sanitize_text_field( wp_unslash( $_GET['filter_type'] ) ) : '' ); $filter_date = ( isset( $_GET['filter_date'] ) ? sanitize_text_field( wp_unslash( $_GET['filter_date'] ) ) : '' ); $where_sql = '1=1'; $query_args = array(); if ( !empty( $filter_type ) ) { $where_sql .= ' AND event_type = %s'; $query_args[] = $filter_type; } $today = current_time( 'Y-m-d' ); if ( 'upcoming' === $filter_date ) { $where_sql .= ' AND (IFNULL(end_date, event_date) >= %s)'; $query_args[] = $today; } elseif ( 'past' === $filter_date ) { $where_sql .= ' AND (IFNULL(end_date, event_date) < %s)'; $query_args[] = $today; } $orderby = ( isset( $_GET['orderby'] ) ? sanitize_text_field( wp_unslash( $_GET['orderby'] ) ) : 'event_date' ); $order = ( isset( $_GET['order'] ) && 'ASC' === strtoupper( sanitize_text_field( wp_unslash( $_GET['order'] ) ) ) ? 'ASC' : 'DESC' ); $allowed_orderby = array( 'event_title' => 'event_title', 'event_type' => 'event_type', 'location_room' => 'location_room', 'max_capacity' => 'max_capacity', 'event_date' => 'event_date', 'is_active' => 'is_active', ); $orderby_sql = ( isset( $allowed_orderby[$orderby] ) ? $allowed_orderby[$orderby] : 'event_date' ); $sql = "SELECT * FROM {$t_events} WHERE {$where_sql} ORDER BY {$orderby_sql} " . (( 'ASC' === strtoupper( $order ) ? 'ASC' : 'DESC' )); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, PluginCheck.Security.DirectDB.UnescapedDBParameter $events = ( !empty( $query_args ) ? $wpdb->get_results( $wpdb->prepare( $sql, $query_args ) ) : $wpdb->get_results( $sql ) ); $saved_schedule = ( $edit_event && !empty( $edit_event->daily_schedule ) ? json_decode( $edit_event->daily_schedule, true ) : array() ); $saved_absent = ( $edit_event && !empty( $edit_event->absent_teachers ) ? json_decode( $edit_event->absent_teachers, true ) : array() ); if ( !is_array( $saved_absent ) ) { $saved_absent = array(); } $all_teachers = $wpdb->get_results( "SELECT id, name, room_number FROM {$t_teachers} ORDER BY name ASC" ); $form_is_active = ( $edit_event ? intval( $edit_event->is_active ) : 1 ); ?>



__( 'Central Conference', 'schoolslots' ), 'nyiltnap' => __( 'Open Day', 'schoolslots' ), 'tablo' => __( 'Photo Session', 'schoolslots' ), 'bali_belepo' => __( 'Ball Tickets', 'schoolslots' ), ); $type_label = ( isset( $type_names[$e->event_type] ) ? $type_names[$e->event_type] : ucfirst( $e->event_type ) ); $date_time_str = esc_html( $e->event_date ); if ( $e->end_date && $e->end_date !== $e->event_date ) { $date_time_str .= ' – ' . esc_html( $e->end_date ); } $time_range = substr( $e->start_time, 0, 5 ) . ' – ' . substr( $e->end_time, 0, 5 ); $is_active = 1 === intval( $e->is_active ); $toggle_url = wp_nonce_url( admin_url( 'admin.php?page=schoolslots&action=toggle_status&event_id=' . $e->id ), 'schoolslots_toggle_event_' . $e->id ); ?>
event_title ); ?>
location_room ) { ?> | location_room ); } ?>
●
id ), 'schoolslots_delete_event_' . $e->id ); ?>