';
foreach ($upsells as $upsell) {
$product = wc_get_product($upsell->target_product_id);
- if (!$product) {
+ if (!$product || !$product->is_purchasable() || !$product->is_in_stock() || !$product->is_type(['simple', 'variation'])) {
continue;
}
@@ -61,31 +76,161 @@ function sodino_render_upsell_suggestions() {
$originalPrice = floatval($product->get_price());
$priceHtml = wc_price($discountedPrice);
if ($discountedPrice < $originalPrice) {
- $priceHtml .= '
' . wc_price($originalPrice) . '';
+ $priceHtml .= '
' . wc_price($originalPrice) . '';
}
- $addToCartUrl = esc_url(add_query_arg('add-to-cart', $product->get_id(), wc_get_cart_url()));
- $image = $product->get_image('woocommerce_thumbnail', ['class' => 'h-20 w-20 rounded-xl object-cover']);
+ $addToCartUrl = sodino_get_upsell_add_to_cart_url($product, $upsell);
+ $image = $product->get_image('woocommerce_thumbnail', ['class' => 'sodino-upsell-image']);
+ $savings = max(0, $originalPrice - $discountedPrice);
+ $sodino_upsell_service->incrementImpression($upsell->id);
- echo '
';
- echo '
';
- echo '
' . $image . '
';
- echo '
';
- echo '
' . esc_html($upsell->title) . '
';
- echo '
' . esc_html($product->get_name()) . '
';
- echo '
';
- echo '' . esc_html($sodino_upsell_service->getDiscountLabel($upsell)) . '';
- echo '' . esc_html($sodino_upsell_service->getTriggerLabel($upsell)) . '';
- echo '
';
- echo '
';
- echo '
';
- echo '
';
- echo '
' . $priceHtml . '
';
- echo '
' . esc_html__('افزودن به سبد', 'sodino') . '';
+ echo '
';
+ echo '' . $image . '
';
+ echo '';
+ echo '
';
+ echo '' . esc_html($sodino_upsell_service->getDiscountLabel($upsell)) . '';
+ echo '' . esc_html($sodino_upsell_service->getTriggerLabel($upsell)) . '';
echo '
';
+ echo '
' . esc_html($upsell->title) . '
';
+ echo '
' . esc_html($product->get_name()) . '
';
+ echo '
';
+ echo '';
}
echo '
';
- echo '
';
+ echo '';
+}
+
+function sodino_get_upsell_add_to_cart_url($product, $upsell) {
+ return add_query_arg(
+ [
+ 'add-to-cart' => $product->get_id(),
+ 'quantity' => 1,
+ 'sodino_upsell_id' => $upsell->id,
+ 'sodino_upsell_nonce' => wp_create_nonce('sodino_apply_upsell_' . $upsell->id),
+ ],
+ wc_get_cart_url()
+ );
+}
+
+function sodino_add_upsell_cart_item_data($cart_item_data, $product_id, $variation_id, $quantity) {
+ if (empty($_REQUEST['sodino_upsell_id'])) {
+ return $cart_item_data;
+ }
+
+ $upsellId = absint(wp_unslash($_REQUEST['sodino_upsell_id']));
+ $nonce = sanitize_text_field(wp_unslash($_REQUEST['sodino_upsell_nonce'] ?? ''));
+ if (!$upsellId || !wp_verify_nonce($nonce, 'sodino_apply_upsell_' . $upsellId)) {
+ return $cart_item_data;
+ }
+
+ global $sodino_upsell_service;
+ if (!isset($sodino_upsell_service) || !WC()->cart) {
+ return $cart_item_data;
+ }
+
+ $upsell = $sodino_upsell_service->getById($upsellId);
+ if (
+ !$sodino_upsell_service->canApplyToProduct($upsell, $product_id, $variation_id)
+ || !$sodino_upsell_service->isValidForCart($upsell, WC()->cart)
+ ) {
+ return $cart_item_data;
+ }
+
+ $product = wc_get_product($variation_id ?: $product_id);
+ if (!$product) {
+ return $cart_item_data;
+ }
+
+ $originalPrice = floatval($product->get_price());
+ $discountedPrice = $sodino_upsell_service->calculateDiscountedPrice($originalPrice, $upsell);
+
+ $cart_item_data['sodino_upsell'] = [
+ 'id' => (int) $upsell->id,
+ 'title' => sanitize_text_field($upsell->title),
+ 'discount_type' => sanitize_key($upsell->discount_type),
+ 'discount_value' => floatval($upsell->discount_value),
+ 'original_price' => $originalPrice,
+ 'discounted_price' => $discountedPrice,
+ ];
+ $cart_item_data['sodino_upsell_key'] = md5(wp_json_encode($cart_item_data['sodino_upsell']) . microtime(true));
+
+ return $cart_item_data;
+}
+
+function sodino_restore_upsell_cart_item_data($cart_item, $values) {
+ if (!empty($values['sodino_upsell'])) {
+ $cart_item['sodino_upsell'] = $values['sodino_upsell'];
+ $cart_item['sodino_upsell_key'] = $values['sodino_upsell_key'] ?? '';
+ }
+ return $cart_item;
+}
+
+function sodino_apply_upsell_cart_prices($cart) {
+ if (is_admin() && !defined('DOING_AJAX')) {
+ return;
+ }
+
+ if (!$cart) {
+ return;
+ }
+
+ foreach ($cart->get_cart() as $cartItem) {
+ if (empty($cartItem['sodino_upsell']['discounted_price']) || empty($cartItem['data'])) {
+ continue;
+ }
+
+ $cartItem['data']->set_price(max(0, floatval($cartItem['sodino_upsell']['discounted_price'])));
+ }
+}
+
+function sodino_display_upsell_cart_item_data($item_data, $cart_item) {
+ if (empty($cart_item['sodino_upsell'])) {
+ return $item_data;
+ }
+
+ $upsell = $cart_item['sodino_upsell'];
+ $item_data[] = [
+ 'key' => __('پیشنهاد سودینو', 'sodino'),
+ 'value' => esc_html($upsell['title']),
+ ];
+
+ if (!empty($upsell['original_price']) && floatval($upsell['discounted_price']) < floatval($upsell['original_price'])) {
+ $item_data[] = [
+ 'key' => __('تخفیف آپسل', 'sodino'),
+ 'value' => wp_kses_post(wc_price(floatval($upsell['original_price']) - floatval($upsell['discounted_price']))),
+ ];
+ }
+
+ return $item_data;
+}
+
+function sodino_add_upsell_order_item_meta($item, $cart_item_key, $values, $order) {
+ if (empty($values['sodino_upsell'])) {
+ return;
+ }
+
+ $upsell = $values['sodino_upsell'];
+ $item->add_meta_data('_sodino_upsell_id', (int) $upsell['id'], true);
+ $item->add_meta_data(__('پیشنهاد سودینو', 'sodino'), sanitize_text_field($upsell['title']), true);
+ $item->add_meta_data(__('قیمت اصلی آپسل', 'sodino'), wc_price(floatval($upsell['original_price'])), true);
+ $item->add_meta_data(__('قیمت تخفیفی آپسل', 'sodino'), wc_price(floatval($upsell['discounted_price'])), true);
+}
+
+function sodino_track_upsell_conversion($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data) {
+ if (empty($cart_item_data['sodino_upsell']['id'])) {
+ return;
+ }
+
+ global $sodino_upsell_service;
+ if (isset($sodino_upsell_service)) {
+ $sodino_upsell_service->incrementConversion((int) $cart_item_data['sodino_upsell']['id']);
+ }
}