Vai al contenuto

Filtri del prezzo

Filtro simpbire_calculated_booking_price

A partire dalla versione 2.0.2, Simple Bike Rental PRO mette a disposizione il filtro simpbire_calculated_booking_price, che permette agli sviluppatori di modificare il prezzo finale di una prenotazione senza dover modificare i file del plugin.

Il filtro viene eseguito dopo che il plugin ha completato tutti i propri calcoli interni (tariffe orarie/giornaliere, quantità, accessori, sconti multi-day, ecc.) e prima che il totale venga salvato nella prenotazione e utilizzato per il pagamento Stripe.

Se nessun codice utilizza questo filtro, il plugin continua a funzionare esattamente come nelle versioni precedenti.

Sintassi

add_filter(
    'simpbire_calculated_booking_price',
    function ( $total, $context ) {

        // Usa $context per verificare date, tipo di noleggio,
        // tariffe della bicicletta, quantità e accessori.

        // Applica qui la tua logica di prezzo personalizzata.

        return $total;
    },
    10,
    2
);

Il parametro $total contiene il totale originale calcolato internamente dal plugin. Il parametro $context permette di accedere alle informazioni della prenotazione e alle tariffe configurate della bicicletta, come daily_rate e hourly_rate.

Messaggi informativi nel riepilogo del prezzo

Quando il filtro modifica il totale finale, il prezzo mostrato nel riepilogo potrebbe non coincidere con la somma delle singole voci.

Per esempio:

60,00 € — Prezzo bicicletta
Totale: 45,00 €

Per spiegare all'utente perché il totale è stato modificato, è possibile utilizzare il filtro simpbire_calculated_booking_price_notice

Il messaggio viene mostrato nel riepilogo del prezzo, subito prima del totale finale.

add_filter(
    'simpbire_calculated_booking_price_notice',
    function ( $notice, $filtered_total, $original_total, $context ) {
        return 'Tariffa promozionale applicata.';
    },
    10,
    4
);

Il callback riceve quattro parametri:

Parametro Descrizione
$notice Messaggio attuale. Per impostazione predefinita è una stringa vuota.
$filtered_total Totale finale dopo l'applicazione del filtro prezzo.
$original_total Totale calcolato internamente dal plugin prima del filtro.
$context Lo stesso array di informazioni utilizzato dal filtro prezzo.

Il messaggio:

  • viene mostrato solamente nel riepilogo dinamico del prezzo sul frontend;
  • non viene salvato nella prenotazione;
  • non viene inviato a Stripe;
  • non viene aggiunto alle email o ai dettagli amministrativi;
  • non viene mostrato quando il filtro restituisce una stringa vuota.

È consigliabile mostrare il messaggio soltanto quando il prezzo è stato effettivamente modificato:

add_filter(
    'simpbire_calculated_booking_price_notice',
    function ( $notice, $filtered_total, $original_total, $context ) {

        if ( abs( $filtered_total - $original_total ) < 0.01 ) {
            return '';
        }

        return 'È stata applicata una tariffa personalizzata.';

    },
    10,
    4
);

Il parametro $context

Il parametro $context contiene i principali dati della prenotazione. Tra quelli più utili troviamo:

Chiave Descrizione
reservation_id ID della prenotazione. Durante l'anteprima del prezzo la prenotazione non è ancora stata salvata e il valore è 0.
calculation_source Indica da quale operazione del plugin è stato richiesto il calcolo del prezzo. Utile soprattutto per integrazioni avanzate e debugging. (ajax_preview, frontend_save, admin_save, admin_accessories_update).
is_preview Indica se il calcolo è un'anteprima dinamica del prezzo (true) o un ricalcolo relativo a una prenotazione (false). Utile soprattutto per integrazioni avanzate e debugging.
rental_type Tipo di noleggio.
daily_rate Tariffa giornaliera standard configurata per la bicicletta selezionata.
hourly_rate Tariffa oraria standard configurata per la bicicletta selezionata.
bike_id ID della bicicletta.
start_date Data di inizio (Y-m-d).
end_date Data di fine (Y-m-d).
start_time Ora di inizio.
end_time Ora di fine.
quantity Numero di biciclette prenotate.
original_total Totale originale calcolato dal plugin prima del filtro.
bike_total_single Totale finale della singola bicicletta.
bike_total_with_quantity Totale calcolato per le biciclette, considerando la quantità prenotata. Gli accessori sono esclusi.
accessories_total Totale finale degli accessori.
currency Valuta configurata nel plugin.

Nota: In genere non è necessario utilizzare calculation_source o is_preview nelle regole di prezzo. Il filtro dovrebbe restituire risultati coerenti durante l'anteprima e il salvataggio della prenotazione.

Valori di rental_type

Attualmente il plugin utilizza questi identificatori:

Valore Significato
orario Noleggio orario
giornaliero Noleggio giornaliero
multiday Noleggio multi-day

Questi valori possono essere utilizzati per applicare regole differenti in base al tipo di prenotazione.

Esempi

1. Impostare sempre un prezzo fisso

add_filter( 
    'simpbire_calculated_booking_price', 
    function ( $total, $context ) { 
        return 10.00; 
    }, 
    10, 
    2 
);

// Messaggio per il prezzo fisso
add_filter(
    'simpbire_calculated_booking_price_notice',
    function ( $notice, $filtered_total, $original_total, $context ) {
        if ( abs( $filtered_total - $original_total ) < 0.01 ) {
            return '';
        }
        return 'Prezzo fisso personalizzato applicato.';
    },
    10, 
    4
);

2. Applicare una modifica solo ai noleggi giornalieri

add_filter(
    'simpbire_calculated_booking_price',
    function ( $total, $context ) {
        if ( 'giornaliero' !== ( $context['rental_type'] ?? '' ) ) {
            return $total;
        }
        return $total * 0.90;
    },
    10,
    2
);

// Messaggio per lo sconto sui noleggi giornalieri
add_filter(
    'simpbire_calculated_booking_price_notice',
    function ( $notice, $filtered_total, $original_total, $context ) {
        if (
            'giornaliero' === ( $context['rental_type'] ?? '' )
            && $filtered_total < $original_total
        ) {
            return 'Sconto del 10% applicato al noleggio giornaliero.';
        }
        return $notice;
    },
    10,
    4
);

In questo esempio viene applicato uno sconto del 10% solamente ai noleggi giornalieri.

3. Prezzo speciale per una data specifica

add_filter(
    'simpbire_calculated_booking_price',
    function ( $total, $context ) {
        if (
            'giornaliero' === ( $context['rental_type'] ?? '' )
            && '2026-08-15' === ( $context['start_date'] ?? '' )
        ) {
            // Prezzo fisso speciale.
            return 45.00;
        }
        return $total;
    },
    10,
    2
);

// Messaggio per il prezzo speciale di una data specifica
add_filter(
    'simpbire_calculated_booking_price_notice',
    function ( $notice, $filtered_total, $original_total, $context ) {
        if (
            'giornaliero' === ( $context['rental_type'] ?? '' )
            && '2026-08-15' === ( $context['start_date'] ?? '' )
        ) {
            return 'Tariffa speciale applicata per il 15 agosto.';
        }
        return $notice;
    },
    10,
    4
);

In questo esempio viene impostato un prezzo speciale al noleggio giornaliero per una data specifica

Per applicare uno sconto in percentuale, ad esempio del 20% anziché un prezzo fisso, sostituire return 45.00; con return $total * 0.80;

4. Applicare uno sconto a più date

add_filter(
    'simpbire_calculated_booking_price',
    function ( $total, $context ) {
        if ( 'giornaliero' !== ( $context['rental_type'] ?? '' ) ) {
            return $total;
        }
        $discount_dates = array(
            '2026-08-15',
            '2026-09-10',
            '2026-10-05',
        );
        if ( in_array( $context['start_date'] ?? '', $discount_dates, true ) ) {
            return $total * 0.80;
        }
        return $total;
    },
    10,
    2
);

// Messaggio per lo sconto applicato a più date
add_filter(
    'simpbire_calculated_booking_price_notice',
    function ( $notice, $filtered_total, $original_total, $context ) {
        $discount_dates = array(
            '2026-08-15',
            '2026-09-10',
            '2026-10-05',
        );
        if (
            'giornaliero' === ( $context['rental_type'] ?? '' )
            && in_array( $context['start_date'] ?? '', $discount_dates, true )
            && $filtered_total < $original_total
        ) {
            return 'Sconto promozionale del 20% applicato.';
        }
        return $notice;
    },
    10,
    4
);

In questo esempio viene applicato uno sconto a più date per il tipo di noleggio giornaliero

5. Tariffe differenti nei giorni feriali e nel weekend

add_filter(
    'simpbire_calculated_booking_price',
    function ( $total, $context ) {
        if ( 'giornaliero' !== ( $context['rental_type'] ?? '' ) ) {
            return $total;
        }

        $daily_rate = (float) ( $context['daily_rate'] ?? 0 );

        if ( $daily_rate <= 0 ) {
            return $total;
        }

        $date = DateTimeImmutable::createFromFormat(
            'Y-m-d',
            $context['start_date'] ?? ''
        );

        if ( ! $date ) {
            return $total;
        }

        $quantity = max(
            1,
            (int) ( $context['quantity'] ?? 1 )
        );

        $accessories_total = max(
            0.0,
            (float) ( $context['accessories_total'] ?? 0 )
        );

        $bike_total = $daily_rate * $quantity;
        $is_weekend = (int) $date->format( 'N' ) >= 6;

        return $is_weekend
            ? round( ( $bike_total * 1.10 ) + $accessories_total, 2 )
            : round( $bike_total + $accessories_total, 2 );
    },
    10,
    2
);

add_filter(
    'simpbire_calculated_booking_price_notice',
    function ( $notice, $filtered_total, $original_total, $context ) {
        if ( 'giornaliero' !== ( $context['rental_type'] ?? '' ) ) {
            return $notice;
        }

        $date = DateTimeImmutable::createFromFormat(
            'Y-m-d',
            $context['start_date'] ?? ''
        );

        if ( ! $date || (int) $date->format( 'N' ) < 6 ) {
            return $notice;
        }

        return 'Maggiorazione weekend del 10% applicata.';
    },
    10,
    4
);

Questo esempio utilizza la tariffa giornaliera configurata per la bicicletta e applica una maggiorazione del 10% soltanto il sabato e la domenica. Nei giorni feriali viene mantenuta la tariffa giornaliera normale e non viene mostrato alcun messaggio.

Nel weekend viene mostrato il messaggio: "Maggiorazione weekend del 10% applicata."

6. Tariffe diverse per ogni giorno di una prenotazione multi-day

Questo è un esempio più avanzato.

Il codice ricostruisce il prezzo della prenotazione giorno per giorno, applicando una tariffa differente nei weekend.

/**
 * Multi-day pricing:
 * - tariffa giornaliera normale dal lunedì al venerdì;
 * - maggiorazione del 10% il sabato e la domenica.
 */
add_filter(
    'simpbire_calculated_booking_price',
    function ( $original_total, $context ) {

        if ( 'multiday' !== ( $context['rental_type'] ?? '' ) ) {
            return $original_total;
        }

        $daily_rate = isset( $context['daily_rate'] )
            ? (float) $context['daily_rate']
            : 0.0;

        if ( $daily_rate <= 0 ) {
            return $original_total;
        }

        $start_date = $context['start_date'] ?? '';
        $end_date   = $context['end_date'] ?? '';

        if ( ! $start_date || ! $end_date ) {
            return $original_total;
        }

        try {
            $current = new DateTimeImmutable( $start_date );
            $end     = new DateTimeImmutable( $end_date );
        } catch ( Exception $e ) {
            return $original_total;
        }

        if ( $end < $current ) {
            return $original_total;
        }

        $bike_total_single = 0.0;

        while ( $current <= $end ) {
            $day_of_week = (int) $current->format( 'N' );
            $day_rate    = $daily_rate;

            // 6 = sabato, 7 = domenica.
            if ( $day_of_week >= 6 ) {
                $day_rate *= 1.10;
            }

            $bike_total_single += $day_rate;
            $current = $current->modify( '+1 day' );
        }

        $quantity = max(
            1,
            (int) ( $context['quantity'] ?? 1 )
        );

        $accessories_total = max(
            0.0,
            (float) ( $context['accessories_total'] ?? 0.0 )
        );

        return round(
            ( $bike_total_single * $quantity ) + $accessories_total,
            2
        );

    },
    10,
    2
);

/**
 * Messaggio mostrato nel riepilogo del prezzo sul frontend.
 */
add_filter(
    'simpbire_calculated_booking_price_notice',
    function ( $notice, $filtered_total, $original_total, $context ) {

        if ( 'multiday' !== ( $context['rental_type'] ?? '' ) ) {
            return $notice;
        }

        $start_date = $context['start_date'] ?? '';
        $end_date   = $context['end_date'] ?? '';

        if ( ! $start_date || ! $end_date ) {
            return $notice;
        }

        try {
            $current = new DateTimeImmutable( $start_date );
            $end     = new DateTimeImmutable( $end_date );
        } catch ( Exception $e ) {
            return $notice;
        }

        if ( $end < $current ) {
            return $notice;
        }

        while ( $current <= $end ) {
            if ( (int) $current->format( 'N' ) >= 6 ) {
                return 'Maggiorazione del 10% applicata ai sabati e alle domeniche compresi nella prenotazione.';
            }

            $current = $current->modify( '+1 day' );
        }

        return $notice;

    },
    10,
    4
);

Questo approccio permette di implementare logiche tariffarie avanzate, come prezzi differenti per il weekend (sabati e domeniche) su prenotazioni di più giorni (multi-day).

Questo snippet ricostruisce completamente il prezzo della parte relativa alle biciclette, giorno per giorno. Di conseguenza sostituisce il normale calcolo multi-day del plugin e non applica automaticamente l’eventuale sconto multi-day configurato nelle impostazioni. Gli accessori vengono invece mantenuti utilizzando il totale già calcolato dal plugin.

Il consiglio è di non usare questo filtro se hai abilitato lo sconto multiday nelle impostazioni generali del plugin.

Buone pratiche

Filtro del prezzo

  • Restituire sempre un valore numerico e non negativo.
  • Restituire il totale originale quando la regola personalizzata non è applicabile.
  • Non modificare il database, inviare email o registrare utilizzi di coupon all'interno del filtro.
  • Il plugin scarta automaticamente valori non numerici, negativi, NAN o infiniti e utilizza il totale originale.
  • Ricordare che il filtro modifica il totale finale, ma non redistribuisce automaticamente la differenza tra prezzo bici, accessori e sconti mostrati nel riepilogo.

Filtro del messaggio

  • Utilizzare messaggi brevi e facilmente comprensibili.
  • Non inserire HTML: il filtro accetta testo semplice.
  • Mantenere le stesse condizioni usate nel corrispondente filtro prezzo.
  • Il filtro può essere eseguito più volte mentre l'utente modifica date, quantità o accessori.
  • Non eseguire operazioni permanenti all'interno del filtro.
  • Usare $filtered_total e $original_total per verificare se il prezzo è stato realmente modificato.