functions.php di WordPress: modifiche utili per il proprio sito web

Indice

Il functions.php

Il file functions.php è uno strumento fondamentale per personalizzare un sito web su WordPress. Si trova nella directory wp-content/themes/nometema/functions.php di ogni tema e svolge un ruolo cruciale nell’aggiunta di nuove funzionalità.

Grazie al functions.php, è possibile sfruttare le funzioni native di WordPress o inserire codice PHP personalizzato per adattare il sito alle proprie esigenze. Questo approccio consente di semplificare la gestione delle personalizzazioni.

functions.php di WordPress: modifiche utili per il proprio sito web

Tuttavia, una limitazione da tenere a mente è che le modifiche al functions.php sono strettamente legate al tema in uso. Cambiando tema, tali personalizzazioni vengono perse, a differenza dei plugin, che restano attivi indipendentemente dal tema scelto.

Per ovviare a questo inconveniente è possibile utilizzare il plugin Code Snippets oppure WPCode. Questi strumenti consentono di aggiungere e gestire facilmente frammenti di codice, garantendo che le personalizzazioni rimangano disponibili anche dopo un cambio di tema. Inoltre, permettono di attivare o disattivare le funzionalità con semplicità, adattandole alle necessità del momento.

Nei prossimi paragrafi, verranno indicate alcune funzioni utili da integrare utilizzando queste modalità.

Sicurezza e best practice nell’uso di functions.php

Quando si modificano i file del tema, è importante seguire alcune best practice per garantire la sicurezza e l’affidabilità del sito. Utilizzare sempre un tema child è una delle raccomandazioni principali, poiché consente di mantenere intatti i file del tema principale e di evitare che le modifiche vengano sovrascritte durante gli aggiornamenti. Inoltre, è fondamentale testare le modifiche in un ambiente di staging prima di applicarle sul sito live. L’ambiente di staging replica il sito in un ambiente sicuro dove è possibile verificare il funzionamento delle nuove funzionalità senza rischiare di danneggiare il sito online. Ciò permette di rilevare eventuali conflitti con altri plugin o temi, prevenendo problemi che potrebbero impattare l’esperienza dell’utente.

Performance e ottimizzazione del codice nel functions.php

Ogni volta che si aggiungono funzioni personalizzate al file functions.php, è necessario fare attenzione a non appesantire il sito. Il codice inefficiente, come le query al database non ottimizzate o l’inclusione di script troppo pesanti, può rallentare il caricamento delle pagine e influire negativamente sulla performance del sito. Le buone pratiche per ottimizzare il codice includono la riduzione al minimo delle operazioni ripetitive, l’uso di caching per ridurre il carico sul server e il lazy loading delle risorse non essenziali.

Monitoraggio e risoluzione dei problemi nel file functions.php

Durante lo sviluppo, possono verificarsi errori nel file functions.php che compromettono il funzionamento del sito. È consigliabile attivare la modalità debug di WordPress per monitorare e risolvere eventuali problemi. Inoltre, è utile utilizzare editor di codice che supportano la sintassi PHP e l’autocompletamento per ridurre la possibilità di errori di codifica e semplificare il processo di sviluppo.

Gestione delle personalizzazioni con il versioning del codice

Un altro approccio utile è quello di utilizzare un sistema di versionamento del codice, come Git, per tenere traccia delle modifiche apportate al file functions.php. Questo consente di recuperare facilmente versioni precedenti del file in caso di errori, oltre a facilitare il lavoro in team, mantenendo un registro dettagliato delle modifiche. Utilizzare Git permette anche di integrare pratiche di integrazione continua, dove ogni modifica viene testata prima di essere applicata al sito live, migliorando così la qualità e la sicurezza del codice.

Disabilitare Gutenberg per i post

add_filter('use_block_editor_for_post', '__return_false');

Disattiva l’editor Gutenberg per tutti i tipi di post (post standard e personalizzati). WordPress userà l’editor classico al suo posto.

Disabilitare Gutenberg per i widget

add_filter('gutenberg_use_widgets_block_editor', '__return_false', 100);
add_filter('use_widgets_block_editor', '__return_false');

Disabilita l’editor a blocchi anche per i widget, reintroducendo l’interfaccia tradizionale per la gestione dei widget nel Customizer o nella dashboard.

Rimuovere gli stili di Gutenberg dal front-end

add_action('wp_enqueue_scripts', function() {
    wp_dequeue_style('wp-block-library');
    wp_dequeue_style('wp-block-library-theme');
    wp_dequeue_style('global-styles');
}, 20);

wp-block-library: Rimuove il file CSS principale degli stili dei blocchi Gutenberg dal front-end, riducendo il carico di risorse.
wp-block-library-theme: Rimuove il file CSS specifico per il tema legato agli stili dei blocchi.
global-styles: Elimina i CSS generati da Gutenberg per la gestione degli stili globali dei blocchi.

L’obiettivo di queste righe è snellire il caricamento del sito rimuovendo risorse non necessarie se Gutenberg è completamente disabilitato.

Aggiungere il supporto per immagini in evidenza

add_theme_support('post-thumbnails');

Abilita la possibilità di aggiungere immagini in evidenza ai post e alle pagine. Questa funzione è fondamentale per i temi che usano immagini come anteprime dei contenuti.

Cambiare la lunghezza degli estratti (excerpt)

function custom_excerpt_length($length) {
    return 20; // Numero di parole
}
add_filter('excerpt_length', 'custom_excerpt_length');

Modifica il numero di parole visualizzate negli estratti degli articoli, consentendo di personalizzare la lunghezza del testo che viene mostrato nella home o negli archivi.

Rimuovere la versione di WordPress dal front-end

remove_action('wp_head', 'wp_generator');

Nasconde la versione di WordPress dal codice sorgente del sito. Questo migliora la sicurezza, rendendo più difficile per gli hacker sfruttare vulnerabilità specifiche della versione in uso.

Personalizzare il footer nell’area amministrativa

function custom_admin_footer() {
    echo 'Sito personalizzato da [Il Tuo Nome]';
}
add_filter('admin_footer_text', 'custom_admin_footer');

Cambia il testo che appare nel footer della dashboard di WordPress, permettendo di aggiungere un messaggio personalizzato, ad esempio per scopi di branding.

Aggiungere uno script o un foglio di stile personalizzato

function enqueue_custom_scripts() {
    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(), null, true);
}
add_action('wp_enqueue_scripts', 'enqueue_custom_scripts');

Consente di caricare file CSS o JavaScript personalizzati nel tema. Questo è utile per aggiungere stili o funzionalità personalizzate senza modificare direttamente i file core del tema.

Disabilitare emoji

function disable_emojis() {
    remove_action('wp_head', 'print_emoji_detection_script', 7);
    remove_action('wp_print_styles', 'print_emoji_styles');
}
add_action('init', 'disable_emojis');

Disabilita il caricamento di script e stili relativi agli emoji, riducendo il numero di richieste HTTP e migliorando le prestazioni del sito.

Aggiungere un’area widget personalizzata

function custom_widget_area() {
    register_sidebar(array(
        'name' => 'Sidebar Personalizzata',
        'id' => 'custom-sidebar',
        'before_widget' => '<div class="widget-container">',
        'after_widget' => '</div>',
        'before_title' => '<h3 class="widget-title">',
        'after_title' => '</h3>',
    ));
}
add_action('widgets_init', 'custom_widget_area');

Crea un’area widget personalizzata dove si può aggiungere contenuti come testi, immagini o altri elementi dinamici nella sidebar o in altre sezioni del sito.

Limitare il numero di revisioni dei post

define('WP_POST_REVISIONS', 3);

Limita il numero di revisioni salvate da WordPress per ogni post o pagina, riducendo lo spazio occupato nel database e migliorando le prestazioni del sito.

Reindirizzare gli utenti dopo il login

function custom_login_redirect($redirect_to, $request, $user) {
    return home_url(); // Modifica con l'URL desiderato
}
add_filter('login_redirect', 'custom_login_redirect', 10, 3);

Modifica il comportamento predefinito di WordPress reindirizzando gli utenti a una pagina specifica dopo aver effettuato il login. Questo è utile per portare gli utenti direttamente alla homepage o a un’area dedicata (come una dashboard personalizzata).

Cambiare il logo nella pagina di login

function custom_login_logo() {
    echo '<style type="text/css">
        #login h1 a { background-image: url(' . get_template_directory_uri() . '/images/custom-logo.png); 
        background-size: contain; width: 100%; height: 80px; }
    </style>';
}
add_action('login_head', 'custom_login_logo');

Sostituisce il logo di WordPress con un’immagine personalizzata. Basta sostituire /images/custom-logo.png con il percorso dell’immagine personalizzata.

Reindirizzare dopo il logout

function custom_logout_redirect() {
    wp_redirect(home_url());
    exit();
}
add_action('wp_logout', 'custom_logout_redirect');

Dopo che un utente effettua il logout, viene reindirizzato alla homepage o a un URL specifico.

Nascondere la barra di amministrazione per gli utenti non amministratori

add_action('after_setup_theme', function() {
    if (!current_user_can('administrator')) {
        show_admin_bar(false);
    }
});

Nasconde la barra di amministrazione per tutti gli utenti tranne gli amministratori.

Rimuovere categorie specifiche dalla homepage

function exclude_category_from_home($query) {
    if ($query->is_home() && $query->is_main_query()) {
        $query->set('cat', '-5'); // Sostituire 5 con l'ID della categoria da escludere
    }
}
add_action('pre_get_posts', 'exclude_category_from_home');

Rimuove i post di una categoria specifica dalla homepage.

Cambiare la favicon del sito

function add_favicon() {
    echo '<link rel="icon" href="' . get_template_directory_uri() . '/images/favicon.ico" type="image/x-icon">';
}
add_action('wp_head', 'add_favicon');

Imposta una favicon personalizzata per il tuo sito. Sostituire il percorso  della favicon con il percorso contenente l’icona/immagine.

Disabilitare la funzione di ricerca

function disable_search($query, $error = true) {
    if (is_search()) {
        wp_redirect(home_url());
        exit();
    }
}
add_action('template_redirect', 'disable_search');

Disabilita la funzione di ricerca reindirizzando qualsiasi query di ricerca alla homepage.

Aggiungere una classe personalizzata al menu

function add_custom_class_to_menu($classes, $item, $args) {
    if ($args->theme_location == 'primary') {
        $classes[] = 'custom-menu-class';
    }
    return $classes;
}
add_filter('nav_menu_css_class', 'add_custom_class_to_menu', 10, 3);

Applica una classe CSS personalizzata agli elementi del menu di navigazione.

Impostare un layout personalizzato per la gallery

add_filter('post_gallery', 'custom_gallery_output', 10, 2);
function custom_gallery_output($output, $attr) {
    // Personalizza l'HTML della gallery qui
    return '<div class="custom-gallery">' . $output . '</div>';
}

Modifica l’aspetto e il comportamento delle gallerie di WordPress.

Codice per aggiungere MIME type personalizzati

function custom_mime_types($mimes) {
    // Aggiungi nuovi MIME type
    $mimes['svg'] = 'image/svg+xml'; // Permette di caricare file SVG
    $mimes['webp'] = 'image/webp';   // Permette di caricare file WebP
    $mimes['json'] = 'application/json'; // Permette di caricare file JSON

    // Rimuovi MIME type (opzionale)
    unset($mimes['exe']); // Impedisce il caricamento di file EXE

    return $mimes;
}
add_filter('upload_mimes', 'custom_mime_types');

$mimes: Contiene l’elenco dei MIME type supportati da WordPress. Ogni chiave rappresenta l’estensione del file, e il valore è il tipo MIME associato.
Aggiunta: Usando $mimes[‘estensione’] = ‘tipo/mime’;, si può aggiungere supporto per nuovi tipi di file.
Rimozione (opzionale): Con unset($mimes[‘estensione’]);, si può disabilitare il caricamento di un tipo di file specifico.
add_filter(‘upload_mimes’, …): Applica la funzione personalizzata per modificare i MIME type accettati da WordPress.

Disabilitare XML-RPC con una funzione PHP

add_filter('xmlrpc_enabled', '__return_false');

Disabilita XML-RPC in WordPress, impedendo che venga utilizzato.

Disabilitare metodi specifici di XML-RPC

add_filter('xmlrpc_methods', function($methods) {
    unset($methods['pingback.ping']);  // Disabilita i pingback
    unset($methods['system.multicall']); // Disabilita richieste multiple
    return $methods;
});

Mantiene XML-RPC attivo, ma disabilita metodi usati spesso in attacchi DDoS o spam.

Personalizzare mittente e indirizzo email delle email di WordPress

// Imposta un indirizzo email personalizzato per il mittente
function personalizza_email_mittente( $email_predefinito ) {
    return '[email protected]'; // Sostituisci con il tuo indirizzo email
}

// Imposta un nome personalizzato per il mittente
function personalizza_nome_mittente( $nome_predefinito ) {
    return 'Nome Mittente'; // Sostituisci con il nome desiderato
}

// Applica i filtri per personalizzare email e nome del mittente
add_filter( 'wp_mail_from', 'personalizza_email_mittente' );
add_filter( 'wp_mail_from_name', 'personalizza_nome_mittente' );

La funzione personalizza_email_mittente sostituisce l’indirizzo email predefinito usato da WordPress con uno specificato, ad esempio: [email protected].
La funzione personalizza_nome_mittente cambia il nome del mittente predefinito con uno personalizzato, come Nome Mittente.
wp_mail_from: Modifica l’indirizzo email del mittente.
wp_mail_from_name: Modifica il nome del mittente.

Codice per personalizzare il testo del link “Read More”

function custom_read_more_text( $more ) {
    return '... <a href="' . get_permalink() . '">Continua a leggere</a>';
}
add_filter( 'excerpt_more', 'custom_read_more_text' );

excerpt_more: È il filtro che WordPress applica al testo dell’estratto per aggiungere il link “Read More” al termine del contenuto abbreviato.
get_permalink(): Restituisce l’URL completo del post, che sarà utilizzato per il link al post completo.
La funzione custom_read_more_text: Modifica il testo che appare al posto del link “Read More”, sostituendolo con un link personalizzato che dice “Continua a leggere”.

Aggiungere analytics

function aggiungi_google_analytics() {
    ?>
    <!-- Google Analytics -->
    <script async src="https://www.googletagmanager.com/gtag/js?id=UA-XXXXXXXXX-X"></script>
    <script>
      window.dataLayer = window.dataLayer || [];
      function gtag(){dataLayer.push(arguments);}
      gtag('js', new Date());
      
      gtag('config', 'UA-XXXXXXXXX-X'); // Sistituire con ID di monitoraggio
    </script>
    <!-- Fine Google Analytics -->
    <?php
}
add_action('wp_head', 'aggiungi_google_analytics');

Sistituire UA-XXXXXXXXX-X con l’ID di monitoraggio di Google Analytics.

Aggiungere Font Personalizzati Manualmente

function aggiungi_google_fonts() {
    wp_enqueue_style( 'nome-font', 'https://fonts.googleapis.com/css2?family=NomeFont:wght@400;700&display=swap', false ); 
}
add_action( 'wp_enqueue_scripts', 'aggiungi_google_fonts' );

variando l’url con il font preferito ricavabile da questo link: https://fonts.google.com/

Codice per Mettere il Sito in Manutenzione

function attiva_modalita_manutenzione() {
    // Controlla se l'utente non è loggato e non è un amministratore
    if (!current_user_can('administrator') && !is_user_logged_in()) {
        // Imposta l'intestazione HTTP per indicare che il sito è in manutenzione
        wp_die(
            '<h1>Sito in manutenzione</h1><p>Il sito è attualmente in manutenzione. Torna a trovarci più tardi.</p>',
            'Manutenzione in corso',
            array('response' => '503', 'back_link' => true)
        );
    }
}
add_action('get_header', 'attiva_modalita_manutenzione');
  • Controlla se l’utente non è loggato e non è un amministratore:
    • Utilizza la funzione current_user_can(‘administrator’) per verificare che l’utente sia un amministratore. Gli amministratori potranno comunque accedere al sito mentre gli altri utenti vedranno il messaggio di manutenzione.
    • is_user_logged_in() è usata per assicurarsi che gli utenti non loggati vengano reindirizzati alla pagina di manutenzione.
  • Visualizza una pagina di manutenzione:
    • La funzione wp_die() mostra un messaggio personalizzato con il testo che desideri, ad esempio: “Sito in manutenzione” con il messaggio che puoi configurare.
    • L’header HTTP 503 indica che il sito è temporaneamente non disponibile per manutenzione.
    • L’array back_link => true consente agli utenti di tornare alla pagina precedente tramite un link di ritorno.
  • Il sito rimarrà in manutenzione per tutti gli utenti non amministratori:
    • Gli utenti normali vedranno la pagina di manutenzione, mentre gli amministratori e gli utenti loggati potranno continuare a lavorare normalmente.

Codice per Aggiungere i Meta OG Tag

function aggiungi_og_tags() {
    if (is_single() || is_page()) {
        global $post;

        // Titolo del post
        $og_title = get_the_title($post->ID);

        // Descrizione del post (estratto o contenuto)
        $og_description = strip_tags(get_the_excerpt($post->ID));
        if (empty($og_description)) {
            $og_description = strip_tags($post->post_content);
        }

        // URL della pagina
        $og_url = get_permalink($post->ID);

        // Immagine in evidenza (se presente)
        if (has_post_thumbnail($post->ID)) {
            $og_image = wp_get_attachment_url(get_post_thumbnail_id($post->ID));
        } else {
            // Immagine di fallback se non c'è immagine in evidenza
            $og_image = 'URL_dell_immagine_di_default.jpg';  // Sostituire con immagine predefinita
        }

        // Aggiungi i meta tag Open Graph
        echo '<meta property="og:title" content="' . esc_attr($og_title) . '" />' . "\n";
        echo '<meta property="og:description" content="' . esc_attr($og_description) . '" />' . "\n";
        echo '<meta property="og:url" content="' . esc_url($og_url) . '" />' . "\n";
        echo '<meta property="og:image" content="' . esc_url($og_image) . '" />' . "\n";
        echo '<meta property="og:type" content="website" />' . "\n";
        echo '<meta property="og:locale" content="it_IT" />' . "\n";  // Aggiungi la lingua italiana (opzionale)
    }
}
add_action('wp_head', 'aggiungi_og_tags');

Dove:

og:title: Imposta il titolo del contenuto (titolo del post o della pagina).
og:description: Imposta la descrizione del contenuto (estratto o testo del post). Se l’estratto non è disponibile, viene usato il contenuto del post.
og:url: Imposta l’URL del contenuto (post o pagina).
og:image: Imposta l’immagine in evidenza del post (se presente). Se non c’è un’immagine in evidenza, viene mostrata un’immagine di default.
og:type: Imposta il tipo di contenuto, che può essere website per una pagina generica.
og:locale: Imposta la lingua (opzionale, qui è impostato su italiano it_IT).

Controllo condizionale per singoli post e pagine:

I tag OG vengono aggiunti solo su post o pagine singole grazie alla condizione if (is_single() || is_page()).

Se non c’è un’immagine in evidenza, il codice imposta un’immagine predefinita con il link URL_dell_immagine_di_default.jpg. Sistituire questa parte con l’URL dell’immagine che desideri venga visualizzata quando non ci sono immagini specifiche.

Aggiungere un Footer Personalizzato

function custom_footer() {
echo '<p>&copy; ' . date('Y') . ' - Tutti i diritti riservati</p>';
}
add_action('wp_footer', 'custom_footer');

Permette di inserire un footer personalizzato per il proprio sito.

Disabilitare commenti su tutto il sito

// Disabilita la possibilità di commentare nel frontend
function disable_comments_on_frontend() {
    // Rimuove il modulo dei commenti da tutte le pagine e post
    if (is_singular()) {
        remove_post_type_support('post', 'comments');
        remove_post_type_support('page', 'comments');
    }
}
add_action('template_redirect', 'disable_comments_on_frontend');

// Disabilita il supporto per i commenti sui nuovi post
function disable_comments_post_type_support() {
    remove_post_type_support('post', 'comments');
    remove_post_type_support('page', 'comments');
}
add_action('init', 'disable_comments_post_type_support');

Il modulo di commenti non verrà più visualizzato nel frontend del sito, né sui nuovi contenuti né su quelli esistenti.
I commenti già esistenti rimarranno intatti nel backend di WordPress e non verranno eliminati.

Mostra la data dell’ultima modifica sui post

function show_last_updated( $content ) {
$u_time = get_the_time('U');
$u_modified_time = get_the_modified_time('U');
if ($u_modified_time >= $u_time + 86400) {
$updated_date = get_the_modified_time('F jS, Y');
$updated_time = get_the_modified_time('h:i a');
$custom_content .= '<p class="last-updated-date">Aggiornato in data '. $updated_date . ' alle ore '. $updated_time .'</p>';
}
$custom_content .= $content;
return $custom_content;
}
add_filter( 'the_content', 'show_last_updated' );

Mostra l’ultima data e ora della modifica di un post.

Errore upload immagini oltre i 2560 pixel o errore 503

function wpb_image_editor_default_to_gd( $editors ) {
    $gd_editor = 'WP_Image_Editor_GD';
    $editors = array_diff( $editors, array( $gd_editor ) );
    array_unshift( $editors, $gd_editor );
    return $editors;
}
add_filter( 'wp_image_editors', 'wpb_image_editor_default_to_gd' );

Può capitare in alcuni casi il problema di upload delle immagini. Il seguente codice forza WordPress a utilizzare GD Library come editor predefinito per la manipolazione delle immagini, invece di altre librerie come Imagick (ImageMagick), se disponibili.

Impostare una dimensione massima per il caricamento delle immagini

function limit_image_upload_size( $file ) {
    $max_width = 1920; // Larghezza massima in pixel
    $max_height = 1080; // Altezza massima in pixel
    
    $image = getimagesize( $file['tmp_name'] );
    $width = $image[0];
    $height = $image[1];
    
    if ( $width > $max_width || $height > $max_height ) {
        $file['error'] = 'L\'immagine è troppo grande. La dimensione massima è ' . $max_width . 'x' . $max_height . ' pixel.';
    }
    
    return $file;
}
add_filter( 'wp_handle_upload_prefilter', 'limit_image_upload_size' );

Con questo codice è possibile limitare la dimensione massima delle immagini caricate sul sito.

Rimuovere le dimensioni di default generate da WordPress

function disable_default_image_sizes( $sizes ) {
    unset( $sizes['thumbnail'] ); // Rimuove la miniatura
    unset( $sizes['medium'] ); // Rimuove la dimensione media
    unset( $sizes['large'] ); // Rimuove la dimensione grande
    return $sizes;
}
add_filter( 'intermediate_image_sizes_advanced', 'disable_default_image_sizes' );

WordPress crea automaticamente dimensioni multiple di ogni immagine caricata. Con questa funzione si può disattivare questa funzionalità

Aggiungere nuove dimensioni personalizzate per le immagini

function custom_image_sizes() {
    add_image_size( 'custom-size', 800, 600, true ); // 800x600 con ritaglio
    add_image_size( 'wide-size', 1200, 500, false ); // 1200x500 senza ritaglio
}
add_action( 'after_setup_theme', 'custom_image_sizes' );

// Mostrare le nuove dimensioni nel selettore del Media Library
function custom_sizes_in_media_library( $sizes ) {
    return array_merge( $sizes, array(
        'custom-size' => __( 'Custom Size' ),
        'wide-size'   => __( 'Wide Size' ),
    ));
}
add_filter( 'image_size_names_choose', 'custom_sizes_in_media_library' );

Con questo codice si puòi creare dimensioni aggiuntive per le immagini caricate.

Modificare la qualità delle immagini JPEG

function custom_jpeg_quality( $quality ) {
    return 80; // Imposta la qualità all'80% (default è 82)
}
add_filter( 'jpeg_quality', 'custom_jpeg_quality' );

Con questo codice è possibile migliorare la qualità delle immagini caricate o per ridurre il peso

Impedire il caricamento di determinati tipi di immagini

function restrict_image_upload_types( $file ) {
    $allowed_types = array( 'image/jpeg', 'image/png', 'image/gif' );
    
    if ( ! in_array( $file['type'], $allowed_types ) ) {
        $file['error'] = 'Formato immagine non consentito. Usa JPEG, PNG o GIF.';
    }
    
    return $file;
}
add_filter( 'wp_handle_upload_prefilter', 'restrict_image_upload_types' );

Questo codice blocca il caricamento di immagini in formati non desiderati

Aggiungere un watermark (filigrana) alle immagini

function add_watermark_to_images( $file ) {
    $image = wp_get_image_editor( $file['file'] );
    if ( ! is_wp_error( $image ) ) {
        $watermark = '/path/to/watermark.png'; // Percorso del file watermark
        $image->load( $watermark );
        $image->save( $file['file'] );
    }
    return $file;
}
add_filter( 'wp_generate_attachment_metadata', 'add_watermark_to_images' );

Grazie a questo codice è possibile applicare un watermark a tutte le immagini caricate. Il percorso del file watermark deve essere assoluto o relativo alla directory del tema.

Caricare immagini SVG

function allow_svg_upload( $mimes ) {
    $mimes['svg'] = 'image/svg+xml';
    return $mimes;
}
add_filter( 'upload_mimes', 'allow_svg_upload' );

// Aggiungere ulteriori controlli di sicurezza per gli SVG
function sanitize_svg_content( $data, $file, $filename, $mimes ) {
    if ( isset( $file['type'] ) && 'image/svg+xml' === $file['type'] ) {
        $svg = simplexml_load_file( $file['tmp_name'] );
        if ( $svg === false ) {
            $file['error'] = 'Il file SVG non è valido.';
        }
    }
    return $file;
}
add_filter( 'wp_check_filetype_and_ext', 'sanitize_svg_content', 10, 4 );

Modifica per permettere il caricamento di immagini SVG (non consentito di default).

Aggiungere classi CSS personalizzate alle immagini

function add_custom_image_class( $class ) {
    return $class . ' custom-image-class';
}
add_filter( 'get_image_tag_class', 'add_custom_image_class' );

Per aggiungere una classe personalizzata a tutte le immagini inserite nei post

Cambiare il testo “Alt” di default delle immagini

function set_default_image_alt( $attr, $attachment ) {
    $attr['alt'] = 'Testo alternativo personalizzato';
    return $attr;
}
add_filter( 'wp_get_attachment_image_attributes', 'set_default_image_alt', 10, 2 );

Per impostare un valore di default per il testo alternativo (Alt) durante il caricamento.

Limitare il numero di tentativi di login

function limit_login_attempts( $user, $username, $password ) {
    session_start();
    $max_attempts = 3; // massimo 3 tentativi
    $lockout_time = 15 * 60; // 15 minuti
    
    if ( ! isset( $_SESSION['login_attempts'] ) ) {
        $_SESSION['login_attempts'] = 0;
    }
    
    if ( $_SESSION['login_attempts'] >= $max_attempts ) {
        $time_remaining = time() - $_SESSION['last_attempt'];
        if ( $time_remaining < $lockout_time ) {
            wp_die( 'Troppe tentativi di accesso. Riprova tra ' . ( $lockout_time - $time_remaining ) . ' secondi.' );
        } else {
            $_SESSION['login_attempts'] = 0;
        }
    }

    $_SESSION['last_attempt'] = time();
    $_SESSION['login_attempts'] += 1;

    return $user;
}
add_filter( 'authenticate', 'limit_login_attempts', 30, 3 );

Protegge il sito da attacchi di brute force limitando i tentativi di accesso, in questo caso 3 in 15 minuti

Rimuovere l’utente “admin”

function block_admin_username( $user, $username, $password ) {
    if ( strtolower( $username ) === 'admin' ) {
        wp_die( 'L\'utente "admin" non è consentito. Scegli un altro nome utente.' );
    }
    return $user;
}
add_filter( 'authenticate', 'block_admin_username', 30, 3 );

Impedisce che l’utente predefinito “admin” venga utilizzato come nome utente

Limitare l’accesso alla dashboard per ruoli specifici

function restrict_dashboard_access() {
    if ( ! current_user_can( 'manage_options' ) && ! wp_doing_ajax() ) {
        wp_redirect( home_url() );
        exit;
    }
}
add_action( 'admin_init', 'restrict_dashboard_access' );

Impedisce l’accesso alla dashboard agli utenti che non sono amministratori

Forzare l’uso di password forti

function enforce_strong_passwords( $errors, $update, $user ) {
    if ( isset( $_POST['pass1'] ) ) {
        $password = $_POST['pass1'];
        if ( strlen( $password ) < 8 || ! preg_match( '/[A-Z]/', $password ) || ! preg_match( '/[0-9]/', $password ) ) {
            $errors->add( 'weak_password', '<strong>Errore:</strong> La password deve essere lunga almeno 8 caratteri, contenere una lettera maiuscola e un numero.' );
        }
    }
    return $errors;
}
add_filter( 'user_profile_update_errors', 'enforce_strong_passwords', 10, 3 );

Aggiunge un controllo per forzare password sicure.

Rimuovere gli header non necessari

remove_action( 'wp_head', 'wp_generator' ); // Versione di WordPress
remove_action( 'wp_head', 'wlwmanifest_link' ); // Windows Live Writer
remove_action( 'wp_head', 'rsd_link' ); // RSD (XML-RPC)
remove_action( 'wp_head', 'rest_output_link_wp_head' ); // REST API
remove_action( 'wp_head', 'wp_shortlink_wp_head' ); // Shortlink

Elimina informazioni sensibili dagli header HTTP

Bloccare l’accesso diretto ai file PHP in cartelle specifiche

function block_php_upload_access() {
    if ( strpos( $_SERVER['REQUEST_URI'], '/wp-content/uploads/' ) !== false && substr( $_SERVER['REQUEST_URI'], -4 ) === '.php' ) {
        wp_die( 'Non puoi accedere a questo file.' );
    }
}
add_action( 'init', 'block_php_upload_access' );

Impedisce l’accesso ai file PHP nella cartella wp-content/uploads

Proteggere il file wp-config.php

function block_wpconfig_access() {
    if ( preg_match( '/wp-config\.php/i', $_SERVER['REQUEST_URI'] ) ) {
        wp_die( 'Accesso negato.' );
    }
}
add_action( 'init', 'block_wpconfig_access' );

Disabilitare l’accesso agli utenti senza sessione

function disable_sessionless_users() {
    if ( ! is_user_logged_in() ) {
        wp_redirect( wp_login_url() );
        exit;
    }
}
add_action( 'template_redirect', 'disable_sessionless_users' );

Protegge il sito impedendo accessi non autenticati