enable_rest_api(); $this->enable_wp_cli(); /** * Add unseen broadcast notices to the panel. */ if ( ! is_network_admin() && ! is_main_site()) { add_action('init', [$this, 'add_unseen_broadcast_notices']); } } /** * Add unseen broadcast messages. * * @since 2.0.0 * @return void */ public function add_unseen_broadcast_notices(): void { $current_customer = wu_get_current_customer(); if ( ! $current_customer) { return; } $all_broadcasts = Broadcast::query( [ 'number' => 10, 'order' => 'DESC', 'order_by' => 'id', 'type__in' => ['broadcast_notice'], ] ); if (isset($all_broadcasts)) { foreach ($all_broadcasts as $key => $broadcast) { if (isset($broadcast) && 'broadcast_notice' === $broadcast->get_type()) { $targets = $this->get_all_notice_customer_targets($broadcast->get_id()); if ( ! is_array($targets)) { $targets = [$targets]; } $dismissed = get_user_meta(get_current_user_id(), 'wu_dismissed_admin_notices'); if (in_array($current_customer->get_id(), $targets, true) && ! in_array($broadcast->get_id(), $dismissed, true)) { $notice = '' . $broadcast->get_title() . ' ' . $broadcast->get_content() . ''; WP_Ultimo()->notices->add($notice, $broadcast->get_notice_type(), 'admin', strval($broadcast->get_id())); WP_Ultimo()->notices->add($notice, $broadcast->get_notice_type(), 'user', strval($broadcast->get_id())); } } } } } /** * Handles the broadcast message send via modal. * * @since 2.0.0 * * @return void */ public function handle_broadcast(): void { $args = $_POST; $target_customers = wu_request('target_customers', ''); $target_products = wu_request('target_products', ''); if ( ! $target_customers && ! $target_products) { wp_send_json_error(new \WP_Error('error', __('No product or customer target was selected.', 'wp-multisite-waas'))); } $broadcast_type = wu_request('type', 'broadcast_notice'); $args['type'] = $broadcast_type; if ('broadcast_notice' === $broadcast_type) { $targets = [ 'customers' => $target_customers, 'products' => $target_products, ]; $args['targets'] = $targets; // then we save with the message status (success, fail) $saved = $this->save_broadcast($args); if (is_wp_error($saved)) { wp_send_json_error($saved); } $redirect = current_user_can('wu_edit_broadcasts') ? 'wp-ultimo-edit-broadcast' : 'wp-ultimo-broadcasts'; wp_send_json_success( [ 'redirect_url' => add_query_arg('id', $saved->get_id(), wu_network_admin_url($redirect)), ] ); } if ('broadcast_email' === $args['type']) { $to = []; $bcc = []; $targets = []; if ($args['target_customers']) { $customers = explode(',', (string) $args['target_customers']); $targets = array_merge($targets, $customers); } if ($args['target_products']) { $product_targets = explode(',', (string) $args['target_products']); $customers = []; foreach ($product_targets as $product_id) { $customers = array_merge($customers, wu_get_membership_customers($product_id)); } $targets = array_merge($targets, $customers); } $targets = array_unique($targets); /** * Get name and email based on user id */ foreach ($targets as $target) { $customer = wu_get_customer($target); if ($customer) { $to[] = [ 'name' => $customer->get_display_name(), 'email' => $customer->get_email_address(), ]; } } if ( ! isset($args['custom_sender'])) { $from = [ 'name' => wu_get_setting('from_name', get_network_option(null, 'site_name')), 'email' => wu_get_setting('from_email', get_network_option(null, 'admin_email')), ]; } else { $from = [ 'name' => $args['custom_sender']['from_name'], 'email' => $args['custom_sender']['from_email'], ]; } $template_type = wu_get_setting('email_template_type', 'html'); $template_type = $template_type ?: 'html'; $send_args = [ 'site_name' => get_network_option(null, 'site_name'), 'site_url' => get_site_url(), 'type' => $template_type, 'subject' => $args['subject'], 'content' => $args['content'], ]; try { $status = Sender::send_mail($from, $to, $send_args); } catch (\Throwable $e) { $error = new \WP_Error($e->getCode(), $e->getMessage()); wp_send_json_error($error); } if ($status) { $args['targets'] = [ 'customers' => $args['target_customers'], 'products' => $args['target_products'], ]; // then we save with the message status (success, fail) $this->save_broadcast($args); wp_send_json_success( [ 'redirect_url' => wu_network_admin_url('wp-ultimo-broadcasts'), ] ); } } $error = new \WP_Error('mail-error', __('Something wrong happened.', 'wp-multisite-waas')); wp_send_json_error($error); } /** * Saves the broadcast message in the database * * @since 2.0.0 * * @param array $args With the message arguments. * @return Broadcast|\WP_Error */ public function save_broadcast($args) { $broadcast_data = [ 'type' => $args['type'], 'name' => $args['subject'], 'content' => $args['content'], 'status' => 'publish', ]; $broadcast = new Broadcast($broadcast_data); if ('broadcast_notice' === $args['type']) { $broadcast->set_notice_type($args['notice_type']); } $broadcast->set_message_targets($args['targets']); $saved = $broadcast->save(); return is_wp_error($saved) ? $saved : $broadcast; } /** * Returns targets for a specific broadcast. * * @since 2.0.0 * * @param string $object_id The broadcast object id. * @param string $type The broadcast target type. * @return string Return the broadcast targets for the specific type. */ public function get_broadcast_targets($object_id, $type) { $broadcast = Broadcast::get_by_id($object_id); $targets = $broadcast->get_message_targets(); if (isset($targets[ $type ])) { if (is_string($targets[ $type ])) { return explode(',', $targets[ $type ]); } return (array) $targets[ $type ]; } return []; } /** * Returns all customer from targets. * * @since 2.0.0 * * @param string $object_id The broadcast object id. * @return array Return the broadcast targets for the specific type. */ public function get_all_notice_customer_targets($object_id): array { $customers_targets = $this->get_broadcast_targets($object_id, 'customers'); $products = $this->get_broadcast_targets($object_id, 'products'); $product_customers = []; if (is_array($products) && $products[0]) { foreach ($products as $product_key => $product) { $membership_customers = wu_get_membership_customers($product); if ($membership_customers) { if (is_array($membership_customers)) { $product_customers = array_merge($membership_customers, $product_customers); } else { array_push($product_customers, $membership_customers); } } } } if (isset($product_customers) ) { $targets = array_merge($product_customers, $customers_targets); } else { $targets = $customers_targets; } return array_map('absint', array_filter(array_unique($targets))); } }