Usare FullCalendar in Wordpress

Mattepuffo's logo
Usare FullCalendar in Wordpress

Usare FullCalendar in Wordpress

In questo articolo vedremo come creare una pagina custom in Wordpress in cui useremo FullCalendar.

I dati li prenderemo con una query custom.

Tutte le operazioni su files verranno fatte dentro al tema child, senza che ve lo specifico ogni volta.

Per prima cosa ho creato un template page-templates/calendario.php:

<?php
/**
 * Template Name: Calendario
 */
 
defined('ABSPATH') || exit;

get_header();
?>

<div id="calendar" style="max-width: 900px; margin: 40px auto;"></div>

<?php 
get_footer();

Poi create la vostra pagina e assegnategli quel template.

Poi creiamo un file js/calendar-init.js:

document.addEventListener('DOMContentLoaded', function () {
    const calendarEl = document.getElementById('calendar');

    const calendar = new FullCalendar.Calendar(calendarEl, {
		locale: 'it',
        initialView: 'dayGridMonth',
		firstDay: 1,
        events: {
            url: ajaxurl, // WordPress variabile globale
            method: 'POST',
            extraParams: {
                action: 'get_tour_events'
            },
            failure: function () {
                alert('Errore nel caricamento degli eventi!');
            }
        },
        eventClick: function(info) {
            location.href = info.event.url;
            info.jsEvent.preventDefault();
        }
    });

    calendar.render();
});

Questo è l'init del calendario.

La parte più importante è dentro al functions.php:

function enqueue_fullcalendar_assets() {
    if (is_page_template('page-templates/calendario.php')) {
        wp_enqueue_style(
            'fullcalendar-css',
            'https://cdn.jsdelivr.net/npm/fullcalendar@6.1.8/main.min.css'
        );

        wp_enqueue_script(
            'fullcalendar-js',
            'https://cdn.jsdelivr.net/npm/fullcalendar@6.1.8/index.global.min.js',
            array(), null, true
        );
		
		wp_enqueue_script(
			'fullcalendar-it',
    		'https://cdn.jsdelivr.net/npm/fullcalendar@6.1.8/locales/it.global.min.js',
    		array('fullcalendar-js'),
    		null,
    		true
		);

        wp_enqueue_script(
            'custom-calendar-init',
            get_stylesheet_directory_uri() . '/js/calendar-init.js',
            array('fullcalendar-js'), null, true
        );

		wp_localize_script('custom-calendar-init', 'ajaxurl', admin_url('admin-ajax.php'));
    }
}

add_action('wp_enqueue_scripts', 'enqueue_fullcalendar_assets');

add_action('wp_ajax_get_tour_events', 'get_tour_events');
add_action('wp_ajax_nopriv_get_tour_events', 'get_tour_events');

function get_tour_events() {
    global $wpdb;

    $results = $wpdb->get_results("
        SELECT 
            p.ID,
            p.post_title,
            pm_date.meta_value AS start,
            pm_days.meta_value AS days,
            DATE_ADD(pm_date.meta_value, INTERVAL pm_days.meta_value DAY) AS end
        FROM {$wpdb->prefix}posts p
        LEFT JOIN {$wpdb->prefix}postmeta pm_date 
            ON p.ID = pm_date.post_id AND pm_date.meta_key = 'tourmaster-tour-date'
        LEFT JOIN {$wpdb->prefix}postmeta pm_days 
            ON p.ID = pm_days.post_id AND pm_days.meta_key = 'tourmaster-tour-duration'
        WHERE p.post_status = 'publish'
          AND p.post_type = 'tour'
          AND pm_date.meta_value IS NOT NULL
          AND pm_days.meta_value IS NOT NULL
    ");

    $events = [];

    foreach ($results as $row) {
        $events[] = [
            'id'    => $row->ID,
            'title' => $row->post_title,
            'start' => $row->start,
            'end'   => $row->end,
            'url'   => get_permalink($row->ID)
        ];
    }

    wp_send_json($events);
}

Qui in pratica facciamo un sacco di roba:

  • includiamo tutto solo nel template creato sopra
  • includiamo il CSS da CDN
  • includiamo la libreria da CDN
  • includiamo anche la localizzazione in italiano
  • includiamo il nostro file js
  • sotto eseguiamo una query custom per i dati, che verrà richiamata dal nostro js tramite AJAX

Enjoy!


Condividi

Commentami!