/** * 시나리오에 따라 문자열을 보낸다. * 어떤 우커머스 이벤트가 있든지, 해당 이벤트에 대한 핸들링은 적절한 메시지를 보내는 것으로 귀결된다. * 주의. $order_id 와 $user_id 가 동시에 NULL 이 될 수 없다. * * @param int|NULL $order_id 주문에 대한 문자열이면 주문 ID. 주문과 관련되 문자가 아니면 NULL. * @param int|NULL $user_id 사용자와 관련된 문자열이면 사용자 ID. 사용자와 관련 없으면 NULL. * @param string $scenario 시나리오. 각 섹션의 ID. e.g., new-order, customer-new-account, ... * * @uses WSKL_SMS_Text_Substitution * @uses WSKL_Dabory_SMS_Provider_Loading * * @uses WSKL_Dabory_SMS_Trigger::get_setting_value() * @uses WSKL_Dabory_SMS_Trigger::get_settings() * @uses WSKL_Dabory_SMS_Trigger::is_already_sent() * @uses WSKL_Dabory_SMS_Trigger::log() * @uses WSKL_Dabory_SMS_Trigger::set_sending_result() * * @return bool */ private function trigger_common($order_id, $user_id, $scenario) { if ($order_id) { $order = wc_get_order($order_id); if (!$order) { $this->log('$order is invalid. Triggering halted.', __METHOD__); return FALSE; } } else { $order = NULL; } if ($user_id) { $user = get_user_by('id', $user_id); if (!$user) { $this->log("User ID {$user_id} is invalid.", __METHOD__); return FALSE; } } else { $user = NULL; } if (!$order && !$user_id) { $this->log('Either $order_id, or $user_id must be valid.', __METHOD__); return FALSE; } $emulation = wskl_is_option_enabled('develop_emulate_sms'); // check if a message is already sent (order only) if (!$emulation && $order && $this->is_already_sent($order, $scenario)) { $this->log("Order #{$order_id} has been notified. Triggering halted.", __METHOD__); return FALSE; } else { if (!$emulation && $user && $this->is_already_sent($user, $scenario)) { $this->log("User #{$user_id} ({$user->user_email}) has been notified. Triggering halted.", __METHOD__); return FALSE; } } // receiver meta key $gs = self::get_settings(); // retrieve the other fields $ns = self::get_settings($scenario); $message_template = self::get_setting_value($ns, $scenario, 'message_content'); $title_template = self::get_setting_value($ns, $scenario, 'message_title'); $notify_to_managers = self::get_setting_value($ns, $scenario, 'send_to_managers'); if ($order) { $receiver_phone_meta_key = wskl_get_from_assoc($gs, wskl_get_option_name('sms_receiver_meta_field')); if (empty($receiver_phone_meta_key)) { $this->log('$receiver_phone_meta_key is an empty string. Triggering halted.', __METHOD__); return FALSE; } $customer_phone = $order->{$receiver_phone_meta_key}; } else { $receiver_phone_meta_key = self::get_setting_value($ns, $scenario, 'phone_meta_field'); if (empty($receiver_phone_meta_key)) { $this->log('$receiver_phone_meta_key is an empty string. Triggering halted.', __METHOD__); return FALSE; } $customer_phone = $user->{$receiver_phone_meta_key}; } if (empty($customer_phone)) { $this->log('customer phone is empty! Triggering halted.', __METHOD__); return FALSE; } // receivers if ($notify_to_managers == 'yes') { $r = explode("\n", wskl_get_option('sms_shop_manager_phones')); $r[] = $customer_phone; $r = array_map(array(__CLASS__, 'trim_phone_number'), $r); $r = array_filter($r, array(__CLASS__, 'not_empty')); $r = array_unique($r); $receivers = implode(',', $r); $num_receivers = count($receivers); } else { $receivers = $customer_phone; $num_receivers = 1; } if (!$num_receivers) { $this->log('The number of recipient is 0! Triggering halted.', __METHOD__); return FALSE; } // message substitution $sub = new WSKL_SMS_Text_Substitution(); $sub->init_substitute($order, $user); $message_title = $sub->substitute($title_template); $message_content = $sub->substitute($message_template); $str_bytes = strlen($message_content); // message type if ($str_bytes > self::SMS_MAX_BYTES) { $message_type = 'lms'; } else { $message_type = 'sms'; } $args = array('remote_phone' => $receivers, 'remote_msg' => $message_content, 'remote_subject' => $message_title, 'remote_num' => $num_receivers, 'remote_etc1' => $order_id); if (!$emulation) { // ... and fire. /** @var WSKL_Dabory_SMS_Provider $provider_class */ $provider_class = Provider_Loading::get_provider_class(); $sender = $provider_class::factory(); $response = $sender->send_message($args, $message_type); assert($response[3] == $order_id, __FUNCTION__ . ': Order id of etc1 and $order_id are different. This is impossible.'); } else { $message = 'SMS emulation is enabled. Argument: ' . print_r($args, TRUE); error_log($message); } if (!$emulation && $order) { self::set_sending_result($order, $scenario, $message_type); } else { if (!$emulation && $user) { self::set_sending_result($user, $scenario, $message_type); } } return TRUE; }
/** * 일반 옵션 * * @return array */ private static function get_settings_general() { $auth_section = WSKL_Dabory_SMS_Provider_Loading::get_auth_section_settings(); return array_merge($auth_section, array(array('type' => 'title', 'title' => __('문자메시지 일반 옵션', 'wskl'), 'id' => 'general_options'), array('id' => wskl_get_option_name('sms_sender_phone'), 'title' => __('발신번호', 'wskl'), 'type' => 'text', 'desc' => __('발신자의 전화번호는 반드시 사전에 발신자 등록이 되어야 합니다.', 'wskl'), 'default' => ''), array('id' => wskl_get_option_name('sms_receiver_meta_field'), 'type' => 'text', 'title' => __('전화번호 메타 필드', 'wskl'), 'desc' => __('문자메시지 발송에 필요한 고객의 휴대전화를 저장하는 메타 필드의 이름입니다. 기본값: billing_phone', 'wskl'), 'default' => 'billing_phone'), array('id' => wskl_get_option_name('sms_shop_manager_phones'), 'title' => '상점관리자 수신번호', 'type' => 'textarea', 'desc' => __('상점관리자의 전화번호를 한 줄에 하나씩 입력합니다.', 'wskl'), 'custom_attributes' => array('rows' => 10, 'cols' => 18), 'default' => ''), array('type' => 'message_tester'), array('type' => 'sectionend', 'id' => 'general_options'))); }