Hooks pro výpočet slev
Filtry pro úpravu výpočtu slev a zaokrouhlování cen.
Základ výpočtu slevy (Calculation Base Mode)
Section titled “Základ výpočtu slevy (Calculation Base Mode)”Každé pravidlo může mít nastavení calculation_base_mode, které určuje, z jaké ceny se sleva počítá:
| Hodnota | Konstanta | Popis |
|---|---|---|
current_price | CalculationBaseModes::CURRENT_PRICE | Sleva z aktuální ceny (po předchozích slevách) - výchozí |
original_price | CalculationBaseModes::ORIGINAL_PRICE | Sleva vždy z běžné ceny (regular_price) |
Příklad chování
Section titled “Příklad chování”Produkt: regular_price = 100 KčPravidlo 1 (Product): -20% → cena = 80 KčPravidlo 2 (BOGO): -50%
S calculation_base_mode = 'current_price': → 50% z 80 = 40 Kč (slevy se sčítají)
S calculation_base_mode = 'original_price': → 50% z 100 = 50 Kč (sleva z původní ceny)Přístup k nastavení v kódu
Section titled “Přístup k nastavení v kódu”use WpifyWooDiscountRule\Services\Rules;use WpifyWooDiscountRule\Enums\CalculationBaseModes;
// V rámci pravidla$calc_base_mode = $rule[ Rules::CALCULATION_BASE_MODE ] ?? CalculationBaseModes::CURRENT_PRICE;
if ( CalculationBaseModes::ORIGINAL_PRICE === $calc_base_mode ) { // Použít regular_price $base = $product->get_regular_price();} else { // Použít aktuální cenu (může zahrnovat jiné slevy) $base = $product->get_price();}Úprava dat před výpočtem slevy
Section titled “Úprava dat před výpočtem slevy”Filtr umožňuje upravit data před samotným výpočtem slevy.
apply_filters( 'wpify_woo_discounts_calculate_data', $data, $product, $rule, $range );Parametry filtru
Section titled “Parametry filtru”| Parametr | Typ | Popis |
|---|---|---|
$data | array | Data pro výpočet slevy (original_price, calculation_base, discount_type, discount_value) |
$product | WC_Product | Produkt, na který se sleva aplikuje |
$rule | array | Nastavení pravidla (včetně calculation_base_mode) |
$range | array | Aktuální range/tier slevy |
Příklady použití
Section titled “Příklady použití”Úprava slevy pro konkrétní kategorii
Section titled “Úprava slevy pro konkrétní kategorii”/** * Zvýšit slevu pro produkty v kategorii "akce" * * @param array $data Data pro výpočet * @param WC_Product $product Produkt * @param array $rule Pravidlo * @param array $range Range slevy * * @return array */function boost_discount_for_sale_category( $data, $product, $rule, $range ): array { if ( has_term( 'akce', 'product_cat', $product->get_id() ) ) { // Zvýšit procentuální slevu o 5% if ( $data['discount_type'] === 'percentage' && isset( $data['discount_value'] ) ) { $data['discount_value'] += 5; } } return $data;}add_filter( 'wpify_woo_discounts_calculate_data', 'boost_discount_for_sale_category', 10, 4 );Nastavení minimální slevy
Section titled “Nastavení minimální slevy”/** * Zajistit minimální slevu 10% * * @param array $data Data pro výpočet * @param WC_Product $product Produkt * @param array $rule Pravidlo * @param array $range Range slevy * * @return array */function ensure_minimum_discount( $data, $product, $rule, $range ): array { if ( $data['discount_type'] === 'percentage' ) { $data['discount_value'] = max( 10, $data['discount_value'] ?? 0 ); } return $data;}add_filter( 'wpify_woo_discounts_calculate_data', 'ensure_minimum_discount', 10, 4 );Úprava výsledku výpočtu slevy
Section titled “Úprava výsledku výpočtu slevy”Filtr umožňuje upravit výsledek po výpočtu slevy.
apply_filters( 'wpify_woo_discounts_calculate_product_discount', $result, $product, $rule, $range );Parametry filtru
Section titled “Parametry filtru”| Parametr | Typ | Popis |
|---|---|---|
$result | array | Výsledek výpočtu (discounted_price, discount_amount, discount_percentage) |
$product | WC_Product | Produkt |
$rule | array | Nastavení pravidla |
$range | array | Range slevy |
Příklady použití
Section titled “Příklady použití”Logování výpočtů slev
Section titled “Logování výpočtů slev”/** * Logovat všechny výpočty slev * * @param array $result Výsledek výpočtu * @param WC_Product $product Produkt * @param array $rule Pravidlo * @param array $range Range slevy * * @return array */function log_discount_calculation( $result, $product, $rule, $range ): array { if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) { error_log( sprintf( 'Discount calculated: Product #%d, Original: %s, Discounted: %s', $product->get_id(), $result['original_price'] ?? 'N/A', $result['discounted_price'] ?? 'N/A' ) ); } return $result;}add_filter( 'wpify_woo_discounts_calculate_product_discount', 'log_discount_calculation', 10, 4 );Úprava zaokrouhlování cen
Section titled “Úprava zaokrouhlování cen”Filtr umožňuje upravit logiku zaokrouhlování výsledné ceny po slevě.
apply_filters( 'wpify_woo_discounts_round_price', $rounded_price, $original_price, $rounding_mode, $rule );Parametry filtru
Section titled “Parametry filtru”| Parametr | Typ | Popis |
|---|---|---|
$rounded_price | float | Cena po zaokrouhlení (podle nastaveného režimu) |
$original_price | float | Cena před zaokrouhlením (po slevě) |
$rounding_mode | string | Režim: whole, ending_99, ending_90, ending_9 |
$rule | array | Kompletní data pravidla |
Příklady použití
Section titled “Příklady použití”Vlastní zaokrouhlování pro VIP zákazníky
Section titled “Vlastní zaokrouhlování pro VIP zákazníky”/** * Pro VIP zákazníky vždy zaokrouhlit dolů * * @param float $rounded_price Zaokrouhlená cena * @param float $original_price Cena před zaokrouhlením * @param string $rounding_mode Režim zaokrouhlování * @param array $rule Pravidlo * * @return float */function vip_rounding( $rounded_price, $original_price, $rounding_mode, $rule ): float { if ( current_user_can( 'vip_member' ) ) { return floor( $original_price ); } return $rounded_price;}add_filter( 'wpify_woo_discounts_round_price', 'vip_rounding', 10, 4 );Zaokrouhlení na násobky 10
Section titled “Zaokrouhlení na násobky 10”/** * Zaokrouhlit cenu na násobky 10 * * @param float $rounded_price Zaokrouhlená cena * @param float $original_price Cena před zaokrouhlením * @param string $rounding_mode Režim zaokrouhlování * @param array $rule Pravidlo * * @return float */function round_to_tens( $rounded_price, $original_price, $rounding_mode, $rule ): float { return round( $original_price / 10 ) * 10;}add_filter( 'wpify_woo_discounts_round_price', 'round_to_tens', 10, 4 );Kontrola aplikace slevy (Subscriptions)
Section titled “Kontrola aplikace slevy (Subscriptions)”Filtr pro kontrolu, zda má být sleva aplikována. Používá se zejména pro WooCommerce Subscriptions.
apply_filters( 'wpify_woo_discounts_should_apply_discount', $should_apply, $rule );Parametry filtru
Section titled “Parametry filtru”| Parametr | Typ | Popis |
|---|---|---|
$should_apply | bool | Výchozí hodnota (true) |
$rule | array | Rule data včetně renewal_behavior |
Příklady použití
Section titled “Příklady použití”Zakázat bulk slevy na renewals
Section titled “Zakázat bulk slevy na renewals”/** * Nikdy neaplikovat bulk slevy na renewal objednávky * * @param bool $should_apply Výchozí hodnota * @param array $rule Pravidlo * * @return bool */function no_bulk_on_renewals( $should_apply, $rule ): bool { if ( function_exists( 'wcs_cart_contains_renewal' ) && wcs_cart_contains_renewal() ) { if ( ( $rule['rule_type'] ?? '' ) === 'bulk' ) { return false; } } return $should_apply;}add_filter( 'wpify_woo_discounts_should_apply_discount', 'no_bulk_on_renewals', 10, 2 );Dostupné renewal behavior hodnoty:
first_order_only- Sleva jen na první objednávkurenewals_only- Sleva jen na renewal objednávkyboth- Sleva na obojí (výchozí)
Úprava cílových produktů
Section titled “Úprava cílových produktů”Filtr umožňuje upravit seznam cílových produktů po jejich přípravě.
apply_filters( 'wpify_woo_discounts_targets_prepared', $targets, $rule );Parametry filtru
Section titled “Parametry filtru”| Parametr | Typ | Popis |
|---|---|---|
$targets | array | Pole cílových produktů |
$rule | array | Nastavení pravidla |
Příklad použití
Section titled “Příklad použití”/** * Vyloučit produkty s nízkou marží z cílů slevy * * @param array $targets Cílové produkty * @param array $rule Pravidlo * * @return array */function exclude_low_margin_products( $targets, $rule ): array { return array_filter( $targets, function( $target ) { $product_id = $target['product_id'] ?? 0; $margin = get_post_meta( $product_id, '_profit_margin', true ); return $margin > 10; // Vyloučit produkty s marží pod 10% } );}add_filter( 'wpify_woo_discounts_targets_prepared', 'exclude_low_margin_products', 10, 2 );Úprava metadata subrulů
Section titled “Úprava metadata subrulů”Filtr umožňuje přidat vlastní metadata do subrulů (stupňů slevy).
apply_filters( 'wpify_woo_discounts_subrule_metadata', $metadata, $subrule, $rule );Parametry filtru
Section titled “Parametry filtru”| Parametr | Typ | Popis |
|---|---|---|
$metadata | array | Metadata subrulu |
$subrule | array | Data subrulu |
$rule | array | Nastavení pravidla |
Příklad použití
Section titled “Příklad použití”/** * Přidat vlastní metadata pro tracking * * @param array $metadata Metadata * @param array $subrule Subrule * @param array $rule Pravidlo * * @return array */function add_tracking_metadata( $metadata, $subrule, $rule ): array { $metadata['campaign_id'] = $rule['campaign_id'] ?? ''; $metadata['applied_at'] = current_time( 'mysql' ); return $metadata;}add_filter( 'wpify_woo_discounts_subrule_metadata', 'add_tracking_metadata', 10, 3 );Úprava limitu množství
Section titled “Úprava limitu množství”Filtr umožňuje upravit maximální množství pro slevu.
apply_filters( 'wpify_woo_discounts_quantity_limit', $limit, $product, $rule );Parametry filtru
Section titled “Parametry filtru”| Parametr | Typ | Popis |
|---|---|---|
$limit | int | Limit množství |
$product | WC_Product | Produkt |
$rule | array | Nastavení pravidla |
Příklad použití
Section titled “Příklad použití”/** * Omezit množství pro velkoobchodníky * * @param int $limit Limit * @param WC_Product $product Produkt * @param array $rule Pravidlo * * @return int */function limit_wholesale_quantity( $limit, $product, $rule ): int { if ( current_user_can( 'wholesale_customer' ) ) { return min( $limit, 100 ); // Max 100 ks pro velkoobchod } return $limit;}add_filter( 'wpify_woo_discounts_quantity_limit', 'limit_wholesale_quantity', 10, 3 );Typ aplikace fee
Section titled “Typ aplikace fee”Filtr umožňuje upravit typ aplikace poplatku/slevy v košíku.
apply_filters( 'wpify_woo_discounts_fee_application_type', $type, $rule );Parametry filtru
Section titled “Parametry filtru”| Parametr | Typ | Popis |
|---|---|---|
$type | string | Typ aplikace (fixed, percent) |
$rule | array | Nastavení pravidla |
Příklad použití
Section titled “Příklad použití”/** * Změnit typ aplikace pro konkrétní pravidla * * @param string $type Typ aplikace * @param array $rule Pravidlo * * @return string */function change_fee_application_type( $type, $rule ): string { // Pro pravidla s high_value tagem použít procenta if ( in_array( 'high_value', $rule['tags'] ?? [], true ) ) { return 'percent'; } return $type;}add_filter( 'wpify_woo_discounts_fee_application_type', 'change_fee_application_type', 10, 2 );Kde umístit kód
Section titled “Kde umístit kód”Vlastní funkci můžete vložit buď do tzv. child šablony (functions.php) nebo pomocí pluginu Code Snippets.