ios26-calendar/ ios26-calendar.php includes/ class-ios26-events.php class-ios26-elementor-register.php widget-ios26-calendar.php assets/ css/style.css js/calendar.js esc_url_raw( rest_url() ), 'nonce' => wp_create_nonce( 'wp_rest' ), ) ); } // REST route to get events by date (YYYY-MM-DD) function ios26_register_rest_routes() { register_rest_route( 'ios26/v1', '/events', array( 'methods' => 'GET', 'callback' => 'ios26_get_events_by_date', 'permission_callback' => '__return_true', 'args' => array( 'date' => array( 'required' => true ), ), ) ); } function ios26_get_events_by_date( $request ) { $date = sanitize_text_field( $request->get_param( 'date' ) ); $args = array( 'post_type' => 'ios26_event', 'posts_per_page' => -1, 'meta_query' => array( array( 'key' => 'ios26_event_date', 'value' => $date, 'compare' => '=', ), ), ); $q = new WP_Query( $args ); $events = array(); while ( $q->have_posts() ) { $q->the_post(); $events[] = array( 'id' => get_the_ID(), 'title' => get_the_title(), 'content' => apply_filters( 'the_content', get_the_content() ), 'date' => get_post_meta( get_the_ID(), 'ios26_event_date', true ), 'time' => get_post_meta( get_the_ID(), 'ios26_event_time', true ), 'location' => get_post_meta( get_the_ID(), 'ios26_event_location', true ), ); } wp_reset_postdata(); return rest_ensure_response( $events ); } 'Eventos do Calendário', 'singular_name' => 'Evento do Calendário', ); $args = array( 'label' => 'Eventos do Calendário', 'labels' => $labels, 'public' => true, 'show_in_menu' => true, 'supports' => array( 'title', 'editor' ), 'menu_icon' => 'dashicons-calendar-alt', ); register_post_type( 'ios26_event', $args ); } public function add_meta_boxes() { add_meta_box( 'ios26_event_meta', 'Detalhes do Evento', array( $this, 'render_meta_box' ), 'ios26_event', 'normal', 'high' ); } public function render_meta_box( $post ) { wp_nonce_field( 'ios26_event_save', 'ios26_event_nonce' ); $date = get_post_meta( $post->ID, 'ios26_event_date', true ); $time = get_post_meta( $post->ID, 'ios26_event_time', true ); $location = get_post_meta( $post->ID, 'ios26_event_location', true ); ?>




register( new \IOS26_Calendar_Widget() ); } } new IOS26_Elementor_Register(); start_controls_section( 'section_content', [ 'label' => 'Conteúdo' ] ); $this->add_control( 'start_week', [ 'label' => 'Primeiro dia da semana', 'type' => Controls_Manager::SELECT, 'default' => '1', 'options' => [ '0' => 'Domingo', '1' => 'Segunda' ], ] ); $this->end_controls_section(); } protected function render() { ?>
').addClass('day-cell inactive').text(''); grid.append(cell); } for(var d=1; d<=daysInMonth; d++){ var cell = $('
').addClass('day-cell').attr('data-day', d).text(d); var isoDate = year + '-' + String(month+1).padStart(2,'0') + '-' + String(d).padStart(2,'0'); (function(cell, isoDate){ $.ajax({ url: IOS26_CALENDAR.root + 'ios26/v1/events', method: 'GET', data: { date: isoDate }, beforeSend: function(xhr){ xhr.setRequestHeader('X-WP-Nonce', IOS26_CALENDAR.nonce); } }).done(function(data){ if(data && data.length){ cell.addClass('has-event'); cell.data('events', data); } }); })(cell, isoDate); var today = new Date(); if(d==today.getDate() && month==today.getMonth() && year==today.getFullYear()){ cell.addClass('today'); } grid.append(cell); } } IOS26Calendar.prototype.prevMonth = function(){ this.date.setMonth(this.date.getMonth()-1); this.render(); } IOS26Calendar.prototype.nextMonth = function(){ this.date.setMonth(this.date.getMonth()+1); this.render(); } IOS26Calendar.prototype.onClickDay = function(e){ var cell = $(e.currentTarget); var events = cell.data('events') || []; var isoDate = this.date.getFullYear() + '-' + String(this.date.getMonth()+1).padStart(2,'0') + '-' + String(cell.data('day')).padStart(2,'0'); if(events.length===0){ var self = this; $.ajax({ url: IOS26_CALENDAR.root + 'ios26/v1/events', method: 'GET', data: { date: isoDate }, beforeSend: function(xhr){ xhr.setRequestHeader('X-WP-Nonce', IOS26_CALENDAR.nonce); } }).done(function(data){ self.showEventsModal(isoDate, data); }); } else { this.showEventsModal(isoDate, events); } } IOS26Calendar.prototype.showEventsModal = function(date, events){ var modal = this.root.find('.ios26-modal'); var body = modal.find('.ios26-modal-body'); body.empty(); body.append('

Eventos — ' + date + '

'); if(events.length===0){ body.append('

Nenhum evento nesta data.

'); } events.forEach(function(ev){ var el = $('
'); el.append('

'+ ev.title +'

'); if(ev.time) el.append('

Hora: '+ ev.time +'

'); if(ev.location) el.append('

Local: '+ ev.location +'

'); el.append('
'+ ev.content +'
'); body.append(el); }); modal.attr('aria-hidden', 'false'); } IOS26Calendar.prototype.closeModal = function(){ this.root.find('.ios26-modal').attr('aria-hidden','true'); } $(document).ready(function(){ $('.ios26-calendar-root').each(function(){ new IOS26Calendar( $(this) ); }); }); })(jQuery);

CONTATOS