feat(Core): add optimize and complete code
This commit is contained in:
@@ -20,6 +20,7 @@ add_action('woocommerce_before_cart', 'sodino_render_cart_banner');
|
||||
add_action('wp_enqueue_scripts', 'sodino_enqueue_banner_assets');
|
||||
add_action('wp_ajax_nopriv_sodino_banner_click', 'sodino_handle_banner_click');
|
||||
add_action('wp_ajax_sodino_banner_click', 'sodino_handle_banner_click');
|
||||
add_action('woocommerce_checkout_create_order', 'sodino_add_banner_order_meta', 20, 2);
|
||||
|
||||
function sodino_enqueue_banner_assets() {
|
||||
if (is_admin()) {
|
||||
@@ -164,12 +165,15 @@ function sodino_render_cart_banner() {
|
||||
}
|
||||
|
||||
function sodino_handle_banner_click() {
|
||||
$nonce = $_POST['nonce'] ?? ($_POST['security'] ?? '');
|
||||
$nonce = isset($_POST['nonce'])
|
||||
? sanitize_text_field(wp_unslash($_POST['nonce']))
|
||||
: (isset($_POST['security']) ? sanitize_text_field(wp_unslash($_POST['security'])) : '');
|
||||
|
||||
if (!isset($_POST['banner_id']) || !wp_verify_nonce($nonce, 'sodino_banner_click')) {
|
||||
wp_send_json_error();
|
||||
}
|
||||
|
||||
$bannerId = intval($_POST['banner_id']);
|
||||
$bannerId = absint(wp_unslash($_POST['banner_id']));
|
||||
if (!$bannerId) {
|
||||
wp_send_json_error();
|
||||
}
|
||||
@@ -180,5 +184,46 @@ function sodino_handle_banner_click() {
|
||||
}
|
||||
|
||||
$sodino_banner_service->increaseClick($bannerId);
|
||||
sodino_remember_banner_click($bannerId);
|
||||
wp_send_json_success();
|
||||
}
|
||||
|
||||
function sodino_remember_banner_click($bannerId) {
|
||||
if (!function_exists('WC') || !WC()->session) {
|
||||
return;
|
||||
}
|
||||
|
||||
$clicks = WC()->session->get('sodino_banner_clicks', []);
|
||||
if (!is_array($clicks)) {
|
||||
$clicks = [];
|
||||
}
|
||||
|
||||
$clicks[(int) $bannerId] = current_time('timestamp');
|
||||
WC()->session->set('sodino_banner_clicks', $clicks);
|
||||
}
|
||||
|
||||
function sodino_add_banner_order_meta($order, $data) {
|
||||
if (!function_exists('WC') || !WC()->session || !$order) {
|
||||
return;
|
||||
}
|
||||
|
||||
$clicks = WC()->session->get('sodino_banner_clicks', []);
|
||||
if (empty($clicks) || !is_array($clicks)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$validClicks = [];
|
||||
$cutoff = current_time('timestamp') - DAY_IN_SECONDS;
|
||||
foreach ($clicks as $bannerId => $timestamp) {
|
||||
if ((int) $bannerId > 0 && (int) $timestamp >= $cutoff) {
|
||||
$validClicks[] = (int) $bannerId;
|
||||
}
|
||||
}
|
||||
|
||||
if (empty($validClicks)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$order->update_meta_data('_sodino_banner_click_ids', implode(',', array_values(array_unique($validClicks))));
|
||||
WC()->session->__unset('sodino_banner_clicks');
|
||||
}
|
||||
|
||||
@@ -22,6 +22,11 @@ add_filter('woocommerce_product_get_sale_price', 'sodino_apply_dynamic_pricing',
|
||||
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;
|
||||
@@ -32,3 +37,95 @@ 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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user