Files
sodino/public/hooks/pricing-hooks.php

132 lines
4.8 KiB
PHP

<?php
// Prevent direct access
if (!defined('ABSPATH')) {
exit;
}
use Sodino\Services\PricingService;
use Sodino\Services\TrackingService;
use Sodino\Repositories\RuleRepository;
use Sodino\Repositories\EventRepository;
// Initialize pricing service
global $sodino_pricing_service;
$ruleRepository = new RuleRepository();
$eventRepository = new EventRepository();
$trackingService = new TrackingService($eventRepository);
$sodino_pricing_service = new PricingService($ruleRepository, $trackingService);
// Hook into WooCommerce price filter
add_filter('woocommerce_product_get_price', 'sodino_apply_dynamic_pricing', 10, 2);
add_filter('woocommerce_product_get_sale_price', 'sodino_apply_dynamic_pricing', 10, 2);
add_filter('woocommerce_product_variation_get_price', 'sodino_apply_dynamic_pricing', 10, 2);
add_filter('woocommerce_product_variation_get_sale_price', 'sodino_apply_dynamic_pricing', 10, 2);
add_filter('woocommerce_package_rates', 'sodino_apply_free_shipping_rules', 20, 1);
add_filter('woocommerce_add_cart_item_data', 'sodino_add_dynamic_pricing_cart_item_data', 20, 4);
add_filter('woocommerce_get_cart_item_from_session', 'sodino_restore_dynamic_pricing_cart_item_data', 20, 2);
add_filter('woocommerce_get_item_data', 'sodino_display_dynamic_pricing_cart_item_data', 20, 2);
add_action('woocommerce_checkout_create_order_line_item', 'sodino_add_dynamic_pricing_order_item_meta', 20, 4);
add_action('woocommerce_add_to_cart', 'sodino_track_dynamic_pricing_conversion', 30, 6);
function sodino_apply_dynamic_pricing($price, $product) {
global $sodino_pricing_service;
return $sodino_pricing_service->applyDynamicPricing($price, $product);
}
function sodino_apply_free_shipping_rules($rates) {
global $sodino_pricing_service;
return $sodino_pricing_service->applyFreeShippingRates($rates);
}
function sodino_add_dynamic_pricing_cart_item_data($cart_item_data, $product_id, $variation_id, $quantity) {
global $sodino_pricing_service;
if (!$sodino_pricing_service) {
return $cart_item_data;
}
$product = wc_get_product($variation_id ?: $product_id);
if (!$product) {
return $cart_item_data;
}
$basePrice = $product->get_price('edit');
if ($basePrice === '' || !is_numeric($basePrice)) {
return $cart_item_data;
}
$discountedPrice = $sodino_pricing_service->applyDynamicPricing($basePrice, $product);
$rules = $sodino_pricing_service->getAppliedRulesForProduct($product);
if (empty($rules) || $discountedPrice >= (float) $basePrice) {
return $cart_item_data;
}
$cart_item_data['sodino_dynamic_pricing'] = [
'rule_ids' => array_values(array_unique(array_map('intval', array_column($rules, 'rule_id')))),
'original_price' => (float) $basePrice,
'discounted_price' => (float) $discountedPrice,
'discount_value' => max(0, (float) $basePrice - (float) $discountedPrice),
];
return $cart_item_data;
}
function sodino_restore_dynamic_pricing_cart_item_data($cart_item, $values) {
if (!empty($values['sodino_dynamic_pricing'])) {
$cart_item['sodino_dynamic_pricing'] = $values['sodino_dynamic_pricing'];
}
return $cart_item;
}
function sodino_display_dynamic_pricing_cart_item_data($item_data, $cart_item) {
if (empty($cart_item['sodino_dynamic_pricing']['discount_value'])) {
return $item_data;
}
$item_data[] = [
'key' => __('تخفیف سودینو', 'sodino'),
'value' => wp_kses_post(wc_price((float) $cart_item['sodino_dynamic_pricing']['discount_value'])),
];
return $item_data;
}
function sodino_add_dynamic_pricing_order_item_meta($item, $cart_item_key, $values, $order) {
if (empty($values['sodino_dynamic_pricing'])) {
return;
}
$pricing = $values['sodino_dynamic_pricing'];
$ruleIds = !empty($pricing['rule_ids']) ? array_map('intval', (array) $pricing['rule_ids']) : [];
if (empty($ruleIds)) {
return;
}
$item->add_meta_data('_sodino_rule_ids', implode(',', $ruleIds), true);
$item->add_meta_data('_sodino_rule_discount', (float) ($pricing['discount_value'] ?? 0), true);
$item->add_meta_data(__('تخفیف قوانین سودینو', 'sodino'), wc_price((float) ($pricing['discount_value'] ?? 0)), true);
}
function sodino_track_dynamic_pricing_conversion($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data) {
global $sodino_pricing_service;
if (!$sodino_pricing_service) {
return;
}
$product = wc_get_product($variation_id ?: $product_id);
if (!$product) {
return;
}
$basePrice = $product->get_price('edit');
if ($basePrice === '' || !is_numeric($basePrice)) {
return;
}
$sodino_pricing_service->applyDynamicPricing($basePrice, $product);
$sodino_pricing_service->trackAppliedRulesForProduct($product);
}