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 );
?>