예제 #1
0
 /**
  * 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;
 }
예제 #3
0
 /**
  * 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);
 }
예제 #4
0
<?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();
            }
        }
    }
}