```php // Prevent direct access if (!defined('ABSPATH')) { exit; } // Central handler for WooCommerce order status changes add_action('woocommerce_order_status_changed', 'rahnama_on_order_status_change', 10, 4); function rahnama_on_order_status_change($order_id, $old_status, $new_status, $order) { error_log("Rahnama CRM LOG: Hook 'woocommerce_order_status_changed' triggered for order #{$order_id}. Status changed from '{$old_status}' to '{$new_status}'. Time: " . current_time('mysql')); if (!$order) { $order = wc_get_order($order_id); if (!$order) { error_log("Rahnama CRM ERROR: Could not get order object for order #{$order_id}. Aborting."); return; } } // لاگ اضافی برای بررسی اجرای هوک error_log("Rahnama CRM DEBUG: Processing order #{$order_id} for status {$new_status}. Order object exists: " . (is_a($order, 'WC_Order') ? 'Yes' : 'No')); // ریست متادیتا برای اجازه ارسال پیامک در هر تغییر وضعیت $meta_keys = ['rahnama_processing_sent', 'rahnama_pending_admin1_sent', 'rahnama_pending_admin2_sent', 'rahnama_completed_sent', 'rahnama_cancelled_sent', 'rahnama_reminder_sent']; foreach ($meta_keys as $meta_key) { delete_post_meta($order_id, $meta_key); error_log("Rahnama CRM LOG: Reset meta '$meta_key' for order #{$order_id} due to status change to '{$new_status}' at " . current_time('mysql')); } $customer_phone = rahnama_normalize_phone_number($order->get_billing_phone() ?: '', true, false); error_log("Rahnama CRM LOG: Order #{$order_id} - Customer phone raw: '{$order->get_billing_phone()}', Normalized: '{$customer_phone}'"); if (!$customer_phone) { error_log("Rahnama CRM ERROR: No valid customer phone for order #{$order_id}. Skipping customer SMS."); } // آماده‌سازی متغیرها برای پیامک $variables = rahnama_prepare_sms_variables($order, $order->get_customer_id()); error_log("Rahnama CRM DEBUG: Variables for order #{$order_id}: " . json_encode($variables, JSON_UNESCAPED_UNICODE)); // لاگ تنظیمات مرتبط $settings = [ 'rahnama_pending_admin1_pattern' => get_option('rahnama_pending_admin1_pattern', ''), 'rahnama_pending_admin1_message' => get_option('rahnama_pending_admin1_message', ''), 'rahnama_pending_admin2_pattern' => get_option('rahnama_pending_admin2_pattern', ''), 'rahnama_pending_admin2_message' => get_option('rahnama_pending_admin2_message', ''), 'rahnama_processing_pattern' => get_option('rahnama_processing_pattern', ''), 'rahnama_processing_message' => get_option('rahnama_processing_message', ''), 'rahnama_completed_pattern' => get_option('rahnama_completed_pattern', ''), 'rahnama_completed_message' => get_option('rahnama_completed_message', ''), 'rahnama_cancelled_pattern' => get_option('rahnama_cancelled_pattern', ''), 'rahnama_cancelled_message' => get_option('rahnama_cancelled_message', ''), 'rahnama_pending_reminder_pattern' => get_option('rahnama_pending_reminder_pattern', ''), 'rahnama_pending_reminder_message' => get_option('rahnama_pending_reminder_message', ''), 'rahnama_admin1_number' => get_option('rahnama_admin1_number', ''), 'rahnama_admin2_number' => get_option('rahnama_admin2_number', ''), ]; error_log("Rahnama CRM LOG: Order #{$order_id} - Settings: " . json_encode($settings, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT)); // تابع کمکی برای ارسال پیامک $send_sms_if_needed = function($pattern_key, $message_key, $phone_number, $meta_key, $delay_hours = 0) use ($order, $order_id, $new_status, $variables) { $pattern_code = get_option($pattern_key, ''); $message = get_option($message_key, ''); $normalized_phone = rahnama_normalize_phone_number($phone_number, true, false); // لاگ دقیق برای بررسی تنظیمات error_log("Rahnama CRM DEBUG: Attempting SMS for order #{$order_id} ({$meta_key}) - Pattern key: {$pattern_key}, Message key: {$message_key}, Phone raw: {$phone_number}, Normalized: " . ($normalized_phone ?: 'false') . ", Pattern: " . ($pattern_code ?: 'None') . ", Message: " . (strlen($message) > 100 ? substr($message, 0, 100) . '...' : $message)); // بررسی پیش‌نیازها if (!$normalized_phone) { error_log("Rahnama CRM ERROR: SMS for order #{$order_id} ({$meta_key}) skipped - Invalid or empty phone number ('{$phone_number}')."); return ['status' => 'error', 'message' => 'شماره تلفن نامعتبر یا خالی است']; } if (empty($pattern_code)) { error_log("Rahnama CRM ERROR: SMS for order #{$order_id} ({$meta_key}) skipped - Pattern code '{$pattern_key}' is empty."); return ['status' => 'error', 'message' => 'کد پترن خالی است']; } if (empty($message)) { error_log("Rahnama CRM ERROR: SMS for order #{$order_id} ({$meta_key}) skipped - Message for variables '{$message_key}' is empty."); return ['status' => 'error', 'message' => 'پیام متغیرها خالی است']; } if ($meta_key !== 'rahnama_abandoned_cart_sent' && !preg_match('/\{order_id\}/', $message)) { error_log("Rahnama CRM ERROR: SMS for order #{$order_id} ({$meta_key}) skipped - Missing required {order_id} variable in message"); return ['status' => 'error', 'message' => 'متغیر {order_id} الزامی است']; } $pattern_values = rahnama_prepare_pattern_values($message, $variables, $order, $order->get_customer_id()); error_log("Rahnama CRM DEBUG: Pattern values for order #{$order_id} ({$meta_key}): " . json_encode($pattern_values, JSON_UNESCAPED_UNICODE)); // برای پیامک‌های با تأخیر (مانند لغو شده یا یادآوری پرداخت)، بررسی متادیتا انجام می‌شود if ($delay_hours > 0) { $meta_exists = get_post_meta($order_id, $meta_key, true); if ($meta_exists) { error_log("Rahnama CRM SKIPPED: SMS for order #{$order_id} ({$meta_key}) - Already sent or scheduled."); return ['status' => 'skipped', 'message' => 'پیامک قبلاً ارسال یا زمان‌بندی شده است']; } wp_schedule_single_event(time() + ($delay_hours * 3600), 'rahnama_send_delayed_sms', [$order_id, $message_key, $normalized_phone, $variables, $pattern_key]); update_post_meta($order_id, $meta_key, true); error_log("Rahnama CRM LOG: SMS for order #{$order_id} ({$meta_key}) SCHEDULED for {$delay_hours} hours later to {$normalized_phone}."); return ['status' => 'scheduled', 'message' => 'پیامک زمان‌بندی شد']; } // برای پیامک‌های بدون تأخیر (مانند در حال انجام، تکمیل شده، و ادمین‌ها)، بدون بررسی متادیتا ارسال می‌شود $result = rahnama_send_sms($message, $normalized_phone, $variables, $order, $order->get_customer_id(), $pattern_code, true); error_log("Rahnama CRM LOG: SMS result for order #{$order_id} ({$meta_key}) to {$normalized_phone}: Status: {$result['status']}, Message: " . ($result['message'] ?? 'N/A') . ", Message ID: " . ($result['message_id'] ?? 'N/A')); if ($result['status'] === 'success') { update_post_meta($order_id, $meta_key, true); error_log("Rahnama CRM SUCCESS: SMS for order #{$order_id} ({$meta_key}) sent to {$normalized_phone}. Message ID: " . ($result['message_id'] ?? 'N/A')); } else { error_log("Rahnama CRM ERROR: SMS for order #{$order_id} ({$meta_key}) failed to {$normalized_phone}. Reason: " . ($result['message'] ?? 'Unknown error')); } return $result; }; switch ($new_status) { case 'pending': // ارسال همزمان برای ادمین ۱ و ادمین ۲ $admin1_result = $send_sms_if_needed('rahnama_pending_admin1_pattern', 'rahnama_pending_admin1_message', get_option('rahnama_admin1_number'), 'rahnama_pending_admin1_sent'); $admin2_result = $send_sms_if_needed('rahnama_pending_admin2_pattern', 'rahnama_pending_admin2_message', get_option('rahnama_admin2_number'), 'rahnama_pending_admin2_sent'); error_log("Rahnama CRM DEBUG: Admin SMS results for order #{$order_id} - Admin 1: " . json_encode($admin1_result, JSON_UNESCAPED_UNICODE) . ", Admin 2: " . json_encode($admin2_result, JSON_UNESCAPED_UNICODE)); break; case 'processing': $send_sms_if_needed('rahnama_processing_pattern', 'rahnama_processing_message', $customer_phone, 'rahnama_processing_sent'); break; case 'completed': $send_sms_if_needed('rahnama_completed_pattern', 'rahnama_completed_message', $customer_phone, 'rahnama_completed_sent'); break; case 'cancelled': $delay = (float) get_option('rahnama_cancelled_delay', 0); $send_sms_if_needed('rahnama_cancelled_pattern', 'rahnama_cancelled_message', $customer_phone, 'rahnama_cancelled_sent', $delay); break; default: error_log("Rahnama CRM LOG: No SMS action defined for status '{$new_status}' for order #{$order_id}"); break; } } // Handler for payment completion if (!function_exists('rahnama_on_payment_complete')) { add_action('woocommerce_payment_complete', 'rahnama_on_payment_complete', 10, 1); function rahnama_on_payment_complete($order_id) { error_log("Rahnama CRM LOG: Hook 'woocommerce_payment_complete' triggered for order #{$order_id}. Time: " . current_time('mysql')); $order = wc_get_order($order_id); if (!$order) { error_log("Rahnama CRM ERROR: Could not get order object for order #{$order_id} in payment complete hook. Aborting."); return; } // بررسی وضعیت سفارش $status = $order->get_status(); error_log("Rahnama CRM DEBUG: Order #{$order_id} status after payment: {$status}"); // آماده‌سازی متغیرها $variables = rahnama_prepare_sms_variables($order, $order->get_customer_id()); error_log("Rahnama CRM DEBUG: Variables for order #{$order_id} in payment complete: " . json_encode($variables, JSON_UNESCAPED_UNICODE)); // تابع کمکی برای ارسال پیامک $send_sms_if_needed = function($pattern_key, $message_key, $phone_number, $meta_key) use ($order, $order_id, $variables) { $pattern_code = get_option($pattern_key, ''); $message = get_option($message_key, ''); $normalized_phone = rahnama_normalize_phone_number($phone_number, true, false); // لاگ دقیق برای بررسی تنظیمات error_log("Rahnama CRM DEBUG: Attempting SMS for order #{$order_id} ({$meta_key}) - Pattern key: {$pattern_key}, Message key: {$message_key}, Phone raw: {$phone_number}, Normalized: " . ($normalized_phone ?: 'false') . ", Pattern: " . ($pattern_code ?: 'None') . ", Message: " . (strlen($message) > 100 ? substr($message, 0, 100) . '...' : $message)); // بررسی پیش‌نیازها if (!$normalized_phone) { error_log("Rahnama CRM ERROR: SMS for order #{$order_id} ({$meta_key}) skipped - Invalid or empty phone number ('{$phone_number}')."); return ['status' => 'error', 'message' => 'شماره تلفن نامعتبر یا خالی است']; } if (empty($pattern_code)) { error_log("Rahnama CRM ERROR: SMS for order #{$order_id} ({$meta_key}) skipped - Pattern code '{$pattern_key}' is empty."); return ['status' => 'error', 'message' => 'کد پترن خالی است']; } if (empty($message)) { error_log("Rahnama CRM ERROR: SMS for order #{$order_id} ({$meta_key}) skipped - Message for variables '{$message_key}' is empty."); return ['status' => 'error', 'message' => 'پیام متغیرها خالی است']; } if ($meta_key !== 'rahnama_abandoned_cart_sent' && !preg_match('/\{order_id\}/', $message)) { error_log("Rahnama CRM ERROR: SMS for order #{$order_id} ({$meta_key}) skipped - Missing required {order_id} variable in message"); return ['status' => 'error', 'message' => 'متغیر {order_id} الزامی است']; } $pattern_values = rahnama_prepare_pattern_values($message, $variables, $order, $order->get_customer_id()); error_log("Rahnama CRM DEBUG: Pattern values for order #{$order_id} ({$meta_key}): " . json_encode($pattern_values, JSON_UNESCAPED_UNICODE)); $result = rahnama_send_sms($message, $normalized_phone, $variables, $order, $order->get_customer_id(), $pattern_code, true); error_log("Rahnama CRM LOG: SMS result for order #{$order_id} ({$meta_key}) to {$normalized_phone}: Status: {$result['status']}, Message: " . ($result['message'] ?? 'N/A') . ", Message ID: " . ($result['message_id'] ?? 'N/A')); if ($result['status'] === 'success') { update_post_meta($order_id, $meta_key, true); error_log("Rahnama CRM SUCCESS: SMS for order #{$order_id} ({$meta_key}) sent to {$normalized_phone}. Message ID: " . ($result['message_id'] ?? 'N/A')); } else { error_log("Rahnama CRM ERROR: SMS for order #{$order_id} ({$meta_key}) failed to {$normalized_phone}. Reason: " . ($result['message'] ?? 'Unknown error')); } return $result; }; // اگر وضعیت به processing تغییر کرده یا نیاز به پردازش دارد if ($status === 'processing' || $order->needs_processing()) { // ریست متادیتا برای پیامک‌های بدون تأخیر $meta_keys = ['rahnama_processing_sent', 'rahnama_pending_admin1_sent', 'rahnama_pending_admin2_sent']; foreach ($meta_keys as $meta_key) { delete_post_meta($order_id, $meta_key); error_log("Rahnama CRM LOG: Reset meta '$meta_key' for order #{$order_id} in payment complete hook at " . current_time('mysql')); } // ارسال پیامک برای مشتری (در حال انجام) $customer_phone = rahnama_normalize_phone_number($order->get_billing_phone() ?: '', true, false); if ($customer_phone) { $send_sms_if_needed('rahnama_processing_pattern', 'rahnama_processing_message', $customer_phone, 'rahnama_processing_sent'); } else { error_log("Rahnama CRM ERROR: No valid customer phone for order #{$order_id} in payment complete hook. Skipping customer SMS."); } // ارسال پیامک برای ادمین ۱ و ادمین ۲ $admin1_number = get_option('rahnama_admin1_number', ''); $admin2_number = get_option('rahnama_admin2_number', ''); $admin1_result = $send_sms_if_needed('rahnama_pending_admin1_pattern', 'rahnama_pending_admin1_message', $admin1_number, 'rahnama_pending_admin1_sent'); $admin2_result = $send_sms_if_needed('rahnama_pending_admin2_pattern', 'rahnama_pending_admin2_message', $admin2_number, 'rahnama_pending_admin2_sent'); error_log("Rahnama CRM DEBUG: Admin SMS results for order #{$order_id} in payment complete - Admin 1: " . json_encode($admin1_result, JSON_UNESCAPED_UNICODE) . ", Admin 2: " . json_encode($admin2_result, JSON_UNESCAPED_UNICODE)); } else { error_log("Rahnama CRM LOG: Order #{$order_id} not in processing status after payment complete (status: {$status}). Skipping SMS."); } } } ```
ویژگی های اصلی :
  • نرم کننده با رطوبت رسانی عمیق و تقویت کننده برای انواع موی سر
  • از خشکی و شکنندگی موها جلوگیری می‌کند.
  • به حفظ لطافت و نرمی موها کمک شایعی می‌کند.
  • بازیابی و تقویت مجدد موهای آسیب دیده.
  • ترمیم، تقویت، هیدراته کردن مو.
  • تغذیه عمیق و آبرسانی مو.

قیمت اصلی: 1,400,000 تومان بود.قیمت فعلی: 1,100,000 تومان.

توضیحات محصول :

پس از شامپو کردن، مقدار زیادی نرم کننده را از ریشه تا انتها ساقه به آرامی روی موها بمالید.

تا زمانی که می خواهید بگذارید بماند سپس به طور کامل و تمیز آبکشی کنید.

باشگاه مشتریان موی کمند​

شما با هر خرید و فعالیت در فروشگاه اینترنتی موی کمند امتیاز کسب می کنید. در حساب کاربری خود به بخش باشگاه موی کمند مراجعه کنید و با امتیاز های خود هدیه و کد تخفیف دریافت کنید . 

 همچنین می توانید با لینک اختصاصی خود ما را به دوستان خود معرفی کنید ، در سایت و یا شبکه های اجتماعی محصولاتی را که خریده اید ، معرفی و تبلیغ نمایید و بابت خرید هایی که از طریق لینک اختصاصی شما انجام می شود امتیاز کسب کنید. 

راهنمای ارسال سفارش

ارسال سفارشات در فروشگاه اینترنتی موی کمند به دو بخش مختلف تقسیم می شود 

  • 1- ارسال سفارشات در مناطق 22 گانه شهر تهران 
  • 2- ارسال سفارشات به تمامی شهرستان های کشور 

ارسال سفارشات در تهران 

در این روش ارسال که مختص مناطق 22 گانه شهر تهران می باشد . سفارش شما بلافاصله بعد از دریافت برای آماده سازی به انبار ارسال می شود و در اولین بازه زمانی فوق با استفاده از پیک های شرکت الوپیک ارسال می گردد. 

در ارسال فوری سفارشات کل هزینه پیک بر عهده خریدار محصول می باشد . و بر اساس فاصله شما تا انبار شرکت می باشد بر اساس نرخ اعلامی الوپیک محاسبه گردیده و توسط خریدار به پیک پرداخت می گردد . 

بدیهی است در این حالت بازه ارسال سفارش از ساعت 11 تا 17 عصر متغیر بوده و بر اساس مسیر بندی انجام خواهد شد . 

ارسال با پست پیشتاز 

اگر برای دریافت خود عجله ندارید می توانید از خدمات شرکت پست برای دریافت سفارش خود استفاده کنید . در این شیوه ارسال ، سفارش ما در اولین روز کاری بعد از سفارش  تحویل شرکت پست می گردد . بین 1 تا 3 روز کاری بعد به دست شما خواهد رسید . جهت اطیمنان از دریافت سفارش خود حتما کدپستی را به دقت وارد کنید . 

ارسال سفارشات به شهرستان ها 

برای ارسال سفارشات به شهرستان ها از دو روش ارسال با پست پیشتاز و ارسال با شرکت تیپاکس استفاده می کنیم . 

ارسال بوسیله پست پیشتاز از ایمنی بالاتری برخوردار است و قابلیت ارسال به تمامی نقاط کشور و تمامی شهرستان ها و روستاها وجود دارد . 

در این حالت بازه زمانی دریافت سفارش شما بین 2 تا 7 روز کاری متغییر خواهد بود . 

شما می توانید به وسیله کد پیگیری مرسوله پستی خود از آخرین وضعیت آن تا زمان تحویل مطلع شوید .

اگر یک روز بعد از ثبت سفارش کد پیگیری پستی را دریافت نکردید . این موضوع می تواند بعلت  بسته بودن پیام های تبلیغاتی بر روی گوشی شما باشد. بعد از 48 ساعت از زمان ارسال سفارشات لیست آنها برای همکاران ما در واحد پشتیبانی ارسال می شود . می توانید با تماس در ساعات اداری شماره پیگیری مرسوله خود را دریافت کنید .

ارسال با تیپاکس

اگر از فعالیت شرکت تیپاکس در شهرستان خود اطمینان دارید با استفاده از این سرویس می توانید سفارش خود را در سریعترین زمان ممکن دریافت کنید .توجه داشته باشد که هزینه ارسال با تیپاکس بر اساس فاصله شما از تهران و وزن بسته متغییر بوده و نسبت به هزنیه پستی 3 تا 4 برابر بیشتر خواهد بود .

کل هزینه ارسال توسط تیپاکس در مقصد و از خریدار دریافت می گردد . 

 

در مجله موی کمند بخوانید
اولین منوی ناوبری خود را اینجا ایجاد کنید
سبد خرید

ورود

هنوز حساب کاربری ندارید؟

برای دیدن محصولاتی که می خواهید، شروع به تایپ کنید.
سوالی دارید؟ با ما صحبت کنید!
مکالمه را شروع کنید
سلام! برای چت در WhatsApp پرسنل پشتیبانی که میخواهید با او صحبت کنید را انتخاب کنید