Sviluppo tema WordPress con Understrap, parte 4: functions.php

Il file functions.php è il cuore funzionale di un tema WordPress. In questa guida, esploreremo varie tecniche per personalizzarlo, inclusa la creazione di custom post types, funzioni avanzate, gestione del frontend, e l’uso di action e hook.

1. Creazione di Custom Post Types

I Custom Post Types (CPT) permettono di estendere WordPress oltre i classici post e pagine.

function create_movie_post_type() {
    register_post_type('movie',
        array(
            'labels' => array(
                'name' => __('Movies'),
                'singular_name' => __('Movie')
            ),
            'public' => true,
            'has_archive' => true,
            'supports' => array('title', 'editor', 'thumbnail', 'excerpt'),
            'menu_icon' => 'dashicons-video-alt2'
        )
    );
}
add_action('init', 'create_movie_post_type');

Questo codice crea un nuovo CPT chiamato “Movie”.

2. Aggiunta di Custom Fields ai CPT

Per aggiungere campi personalizzati al CPT:

function add_movie_meta_boxes() {
    add_meta_box('movie_details', 'Movie Details', 'movie_details_callback', 'movie', 'normal', 'default');
}
add_action('add_meta_boxes', 'add_movie_meta_boxes');

function movie_details_callback($post) {
    wp_nonce_field(basename(__FILE__), 'movie_details_nonce');
    $release_date = get_post_meta($post->ID, 'release_date', true);
    echo '<label for="release_date">Release Date:</label>';
    echo '<input type="date" id="release_date" name="release_date" value="' . esc_attr($release_date) . '">';
}

function save_movie_details($post_id) {
    if (!isset($_POST['movie_details_nonce']) || !wp_verify_nonce($_POST['movie_details_nonce'], basename(__FILE__))) {
        return $post_id;
    }
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return $post_id;
    }
    if (!current_user_can('edit_post', $post_id)) {
        return $post_id;
    }
    if (isset($_POST['release_date'])) {
        update_post_meta($post_id, 'release_date', sanitize_text_field($_POST['release_date']));
    }
}
add_action('save_post_movie', 'save_movie_details');function add_movie_meta_boxes() {    add_meta_box('movie_details', 'Movie Details', 'movie_details_callback', 'movie', 'normal', 'default');
}
add_action('add_meta_boxes', 'add_movie_meta_boxes');

function movie_details_callback($post) {
    wp_nonce_field(basename(__FILE__), 'movie_details_nonce');
    $release_date = get_post_meta($post->ID, 'release_date', true);
    echo '<label for="release_date">Release Date:</label>';
    echo '<input type="date" id="release_date" name="release_date" value="' . esc_attr($release_date) . '">';
}

function save_movie_details($post_id) {
    if (!isset($_POST['movie_details_nonce']) || !wp_verify_nonce($_POST['movie_details_nonce'], basename(__FILE__))) {
        return $post_id;
    }
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return $post_id;
    }
    if (!current_user_can('edit_post', $post_id)) {
        return $post_id;
    }
    if (isset($_POST['release_date'])) {
        update_post_meta($post_id, 'release_date', sanitize_text_field($_POST['release_date']));
    }
}
add_action('save_post_movie', 'save_movie_details');

Questo codice aggiunge un campo “Release Date” al CPT “Movie”.

3. Funzioni avanzate per il frontend

3.1 Personalizzazione del loop di WordPress

function custom_movie_loop($query) {
    if (!is_admin() && $query->is_main_query() && is_post_type_archive('movie')) {
        $query->set('posts_per_page', 12);
        $query->set('orderby', 'meta_value');
        $query->set('meta_key', 'release_date');
        $query->set('order', 'DESC');
    }
}
add_action('pre_get_posts', 'custom_movie_loop');

Questo codice personalizza il loop per l’archivio dei film, mostrando 12 film per pagina ordinati per data di uscita.

3.2 Aggiunta di script e stili

function enqueue_custom_scripts_and_styles() {
    wp_enqueue_style('custom-style', get_template_directory_uri() . '/css/custom-style.css');
    wp_enqueue_script('custom-script', get_template_directory_uri() . '/js/custom-script.js', array('jquery'), '1.0', true);
}
add_action('wp_enqueue_scripts', 'enqueue_custom_scripts_and_styles');

Questo codice aggiunge un file CSS personalizzato e un file JavaScript al frontend.

4. Utilizzo di Action e Hook

4.1 Aggiunta di contenuto dopo il contenuto del post

function add_movie_details_after_content($content) {
    if (is_singular('movie') && in_the_loop() && is_main_query()) {
        $release_date = get_post_meta(get_the_ID(), 'release_date', true);
        $content .= '<div class="movie-details">';
        $content .= '<p><strong>Release Date:</strong> ' . esc_html($release_date) . '</p>';
        $content .= '</div>';
    }
    return $content;
}
add_filter('the_content', 'add_movie_details_after_content');

Questo hook aggiunge i dettagli del film dopo il contenuto principale nei singoli post di tipo “movie”.

4.2 Personalizzazione del titolo della pagina

function custom_page_title($title) {
if (is_post_type_archive('movie')) {
$title = 'Our Movie Collection';
}
return $title;
}
add_filter('wp_title', 'custom_page_title');

Questo hook personalizza il titolo della pagina per l’archivio dei film.

5. Creazione di shortcode personalizzati

function latest_movies_shortcode($atts) {
    $atts = shortcode_atts(array(
        'count' => 5,
    ), $atts);

    $query = new WP_Query(array(
        'post_type' => 'movie',
        'posts_per_page' => $atts['count'],
        'orderby' => 'date',
        'order' => 'DESC'
    ));

    $output = '<ul class="latest-movies">';
    while ($query->have_posts()) {
        $query->the_post();
        $output .= '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>'; 
    }
    $output .= '</ul>';

    wp_reset_postdata();

    return $output;
}
add_shortcode('latest_movies', 'latest_movies_shortcode');

Questo shortcode permette di visualizzare una lista dei film più recenti. Può essere usato in questo modo: [latest_movies count="3"].

Conclusione

Il file functions.php offre infinite possibilità di personalizzazione in WordPress. Questi esempi coprono solo una piccola parte di ciò che è possibile fare. Ricorda sempre di testare accuratamente le modifiche in un ambiente di sviluppo prima di applicarle a un sito in produzione.

Approfondimenti in questo articolo:

Funzioni

Le funzioni in programmazione sono blocchi di codice riutilizzabili che eseguono un compito specifico. Possono accettare dati in input (parametri) ed eventualmente restituire un risultato. Rappresentano uno dei concetti fondamentali…

jQuery

jQuery è una popolare libreria JavaScript open-source che semplifica la manipolazione del DOM (Document Object Model), la gestione degli eventi, le animazioni e le chiamate AJAX in una pagina web.…

CSS

Il CSS è un linguaggio di stile utilizzato per definire l'aspetto visuale e la formattazione di documenti HTML e XML. Permette di controllare caratteristiche come colori, layout, spaziature, dimensioni e…

WordPress

WordPress è un sistema di gestione dei contenuti (CMS) open-source, il più popolare al mondo per la creazione di siti web e blog. Semplice da usare e altamente personalizzabile, WordPress…

JavaScript

Un linguaggio di programmazione utilizzato per creare interazioni dinamiche e complesse su un sito web. È essenziale per aggiungere funzionalità come animazioni, moduli interattivi e altre caratteristiche che migliorano l'esperienza…

Frontend

La parte visibile di un sito web o di un'applicazione con cui gli utenti interagiscono direttamente. Comprende tutto ciò che riguarda il design e l'interfaccia utente, sviluppato con linguaggi come…

22 Ottobre 2024

Altri articoli dal mio blog