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
$totalcontiene il totale originale calcolato internamente dal plugin. Il parametro$contextpermette di accedere alle informazioni della prenotazione e alle tariffe configurate della bicicletta, comedaily_rateehourly_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:
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_sourceois_previewnelle 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;conreturn $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,
NANo 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_totale$original_totalper verificare se il prezzo è stato realmente modificato.