Přeskočit na obsah

Hooks pro výpočet slev

Tento obsah zatím není dostupný ve vašem jazyce.

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á:

HodnotaKonstantaPopis
current_priceCalculationBaseModes::CURRENT_PRICESleva z aktuální ceny (po předchozích slevách) - výchozí
original_priceCalculationBaseModes::ORIGINAL_PRICESleva vždy z běžné ceny (regular_price)
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)
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();
}

Filtr umožňuje upravit data před samotným výpočtem slevy.

apply_filters( 'wpify_woo_discounts_calculate_data', $data, $product, $rule, $range );
ParametrTypPopis
$dataarrayData pro výpočet slevy (original_price, calculation_base, discount_type, discount_value)
$productWC_ProductProdukt, na který se sleva aplikuje
$rulearrayNastavení pravidla (včetně calculation_base_mode)
$rangearrayAktuální range/tier slevy
/**
* 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 );
/**
* 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 );

Filtr umožňuje upravit výsledek po výpočtu slevy.

apply_filters( 'wpify_woo_discounts_calculate_product_discount', $result, $product, $rule, $range );
ParametrTypPopis
$resultarrayVýsledek výpočtu (discounted_price, discount_amount, discount_percentage)
$productWC_ProductProdukt
$rulearrayNastavení pravidla
$rangearrayRange slevy
/**
* 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 );

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 );
ParametrTypPopis
$rounded_pricefloatCena po zaokrouhlení (podle nastaveného režimu)
$original_pricefloatCena před zaokrouhlením (po slevě)
$rounding_modestringRežim: whole, ending_99, ending_90, ending_9
$rulearrayKompletní data pravidla

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 );
/**
* 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 );

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 );
ParametrTypPopis
$should_applyboolVýchozí hodnota (true)
$rulearrayRule data včetně renewal_behavior
/**
* 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ávku
  • renewals_only - Sleva jen na renewal objednávky
  • both - Sleva na obojí (výchozí)

Filtr umožňuje upravit seznam cílových produktů po jejich přípravě.

apply_filters( 'wpify_woo_discounts_targets_prepared', $targets, $rule );
ParametrTypPopis
$targetsarrayPole cílových produktů
$rulearrayNastavení pravidla
/**
* 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 );

Filtr umožňuje přidat vlastní metadata do subrulů (stupňů slevy).

apply_filters( 'wpify_woo_discounts_subrule_metadata', $metadata, $subrule, $rule );
ParametrTypPopis
$metadataarrayMetadata subrulu
$subrulearrayData subrulu
$rulearrayNastavení pravidla
/**
* 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 );

Filtr umožňuje upravit maximální množství pro slevu.

apply_filters( 'wpify_woo_discounts_quantity_limit', $limit, $product, $rule );
ParametrTypPopis
$limitintLimit množství
$productWC_ProductProdukt
$rulearrayNastavení pravidla
/**
* 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 );

Filtr umožňuje upravit typ aplikace poplatku/slevy v košíku.

apply_filters( 'wpify_woo_discounts_fee_application_type', $type, $rule );
ParametrTypPopis
$typestringTyp aplikace (fixed, percent)
$rulearrayNastavení pravidla
/**
* 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 );

Vlastní funkci můžete vložit buď do tzv. child šablony (functions.php) nebo pomocí pluginu Code Snippets.