/** * Change a queue item's status and redirect the browser back to the scheduled emails page after */ public static function update_queue_item_status() { check_admin_referer('update_queue_status'); $scheduler = Follow_Up_Emails::instance()->scheduler; $item = new FUE_Sending_Queue_Item(absint($_GET['id'])); $item->status = absint($_GET['status']); $item->save(); if ($item->status == 1) { $scheduler->schedule_email($item->id, $item->send_on); } elseif ($item->status == 0) { $scheduler->unschedule_email($item->id); } $messages = array(__('Scheduled email updated successfully', 'follow_up_emails')); $message_nonce = wp_create_nonce(__FILE__); set_transient('_fue_messages_' . $message_nonce, array('messages' => $messages), 60 * 60); // redirect back to scheduled emails wp_redirect(add_query_arg('message', $message_nonce, 'admin.php?page=followup-emails-queue')); exit; }
/** * Insert a queue item to the followup_email_orders table * * @param array $data * @param bool $schedule_event Pass false to not register a new scheduled event * @return int|WP_Error The email order ID or WP_Error on error */ private function insert_email_order($data, $schedule_event = true) { $wpdb = Follow_Up_Emails::instance()->wpdb; $item = new FUE_Sending_Queue_Item(); $data = apply_filters('fue_insert_email_order', $data); foreach ($data as $field => $value) { if (isset($item->{$field})) { $item->{$field} = $value; } } // get the correct email address if ($item->user_id > 0 && empty($item->user_email)) { $user = new WP_User($item->user_id); $item->user_email = $user->user_email; } if (empty($item->email_id)) { // to be able to queue emails without an email_id, // a meta named subscription_notification or daily_summary must be present if (isset($item->meta['subscription_notification']) || isset($item->meta['daily_summary'])) { $queue_id = $item->save(); $message = sprintf(__('Email has been added to the queue (Queue ID #%d)', 'follow_up_emails'), $queue_id); $item->add_note($message); if ($schedule_event) { $this->schedule_email($queue_id, $item->send_on); } } } $email = new FUE_Email($item->email_id); $email_meta = $email->meta; $adjust_date = false; // do not queue if email is missing the subject or the message if (empty($email->message)) { return new WP_Error('fue_insert_email_order', __('Cannot add to queue an email with a missing message', 'follow_up_emails')); } $passed_conditions = $this->filter_conditions($item); if (is_wp_error($passed_conditions)) { return new WP_Error('fue_insert_email_order', $passed_conditions->get_error_message()); } if (!empty($email_meta)) { if (isset($email_meta['adjust_date']) && $email_meta['adjust_date'] == 'yes') { $adjust_date = true; } // send email only once if (isset($email_meta['one_time']) && $email_meta['one_time'] == 'yes') { $count_sent = $wpdb->get_var($wpdb->prepare("SELECT COUNT(*)\n FROM {$wpdb->prefix}followup_email_orders\n WHERE `user_email` = %s\n AND `email_id` = %d", $item->user_email, $item->email_id)); if ($count_sent > 0) { // do not send more of the same emails to this user return new WP_Error('fue_insert_email_order', sprintf(__('One-time email has already been sent to %s', 'follow_up_emails'), $item->user_email)); } } } // adjust date only applies to non-guest orders if ($adjust_date && $item->user_id) { // check for similar existing and unsent email orders // and adjust the date to send instead of inserting a duplicate row $similar_emails = $this->get_items(array('email_id' => $item->email_id, 'user_id' => $item->user_id, 'product_id' => $item->product_id, 'is_cart' => $item->is_cart, 'is_sent' => 0)); if (count($similar_emails) > 0) { $similar_email = current($similar_emails); $similar_item = new FUE_Sending_Queue_Item($similar_email->id); $similar_item->send_on = $item->send_on; $similar_item->save(); // remove the existing schedule and save the new one $param = array('email_order_id' => $similar_email->id); wc_unschedule_action('sfn_followup_emails', $param, 'fue'); if ($schedule_event) { $this->schedule_email($similar_email->id, $item->send_on); } $message = sprintf(__('Similar queue item found (#%d). Adjusting schedule to send on %s', 'follow_up_emails'), $similar_item->id, date(get_option('date_format') . ' ' . get_option('time_format'), $item->send_on)); $similar_item->add_note($message); return $similar_item->id; } } $queue_id = $item->save(); $message = sprintf(__('The email "%s" has been added to the queue (Queue ID #%d)', 'follow_up_emails'), $email->name, $queue_id); $item->add_note($message); if ($schedule_event) { $this->schedule_email($queue_id, $item->send_on); } return $queue_id; }
/** * Create a new queue item * * @since 4.1 * @param array $data * @return array|WP_Error */ public function create_queue_item($data) { if (!current_user_can('manage_follow_up_emails')) { return new WP_Error('fue_api_user_cannot_access_queue', __('You do not have permission to access this resource', 'follow_up_emails'), array('status' => 400)); } $defaults = array('user_id' => 0, 'user_email' => '', 'order_id' => 0, 'product_id' => 0, 'email_id' => '', 'send_date' => '', 'is_cart' => 0, 'is_sent' => 1, 'date_sent' => '', 'email_trigger' => '', 'meta' => array(), 'status' => 0); $data = wp_parse_args($data, $defaults); $data = apply_filters('fue_api_create_queue_data', $data, $this); // basic data validation if (empty($data['user_email'])) { return new WP_Error('fue_api_missing_callback_param', sprintf(__('Missing parameter %s', 'follow_up_emails'), 'user_email'), array('status' => 400)); } if (empty($data['email_id'])) { return new WP_Error('fue_api_missing_callback_param', sprintf(__('Missing parameter %s', 'follow_up_emails'), 'email_id'), array('status' => 400)); } else { $email = new FUE_Email($data['email_id']); if (!$email->exists()) { return new WP_Error('fue_api_invalid_email_id', __('Invalid email ID', 'follow_up_emails'), array('status' => 400)); } } $item = new FUE_Sending_Queue_Item(); $item->user_id = $data['user_id']; $item->user_email = $data['user_email']; $item->order_id = $data['order_id']; $item->product_id = $data['product_id']; $item->email_id = $data['email_id']; $item->send_on = get_date_from_gmt($this->server->parse_datetime($data['send_date']), 'U'); $item->is_cart = $data['is_cart'] == 1 ? 1 : 0; $item->is_sent = $data['is_sent'] == 1 ? 1 : 0; $item->date_sent = get_date_from_gmt($this->server->parse_datetime($data['date_sent'])); $item->email_trigger = $data['email_trigger']; $item->meta = !is_array($data['meta']) ? array() : $data['meta']; $item->status = $data['status'] == 0 ? 0 : 1; $id = $item->save(); // Checks for an error in the queue entry creation. if (is_wp_error($id)) { return new WP_Error('fue_api_cannot_create_queue', $id->get_error_message(), array('status' => 400)); } do_action('fue_api_created_queue', $id, $data); // if the queue's send date is in the future and if the status is 1 (active), // schedule if for sending if (time() < $item->send_on && $item->status == 1) { $this->scheduler->schedule_email($id, $item->send_on); } $this->server->send_status(201); return $this->get_queue_item($id); }
<?php /** * Update Data to 7.5 * Look for queue items for subscription emails without subscription keys in the meta */ if (!defined('ABSPATH')) { exit; // Exit if accessed directly } global $wpdb; if (class_exists('WC_Subscriptions_Manager')) { $email_ids = fue_get_emails('subscription', '', array('fields' => 'ids')); if (count($email_ids)) { $item_ids = $wpdb->get_results("SELECT id FROM {$wpdb->prefix}followup_email_orders WHERE email_id IN (" . implode(',', $email_ids) . ")"); foreach ($item_ids as $item_id) { $item = new FUE_Sending_Queue_Item($item_id->id); if (empty($item->meta['subs_key']) && WC_Subscriptions_Order::order_contains_subscription($item->order_id)) { $subs_key = WC_Subscriptions_Manager::get_subscription_key($item->order_id); $item->meta['subs_key'] = $subs_key; $item->save(); } } } }