function premise_recurring_payment_handler() { global $premise_cron_args, $wpdb; if (is_user_logged_in() || !function_exists('memberaccess_get_cron_key')) { return; } if (!is_array($premise_cron_args) || empty($premise_cron_args['key']) || memberaccess_get_cron_key() != $premise_cron_args['key']) { return; } $now = time(); // check for expired subscriptions $expired_subscriptions = $wpdb->get_col($wpdb->prepare("SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = '_acp_order_renewal_time' AND meta_value BETWEEN %s AND %s", $now - 259200, $now - 172800)); if (!empty($expired_subscriptions)) { foreach ($expired_subscriptions as $order) { $order_status = get_post_meta($order, '_acp_order_status', true); if ($order_status == __('cancel', 'premise')) { continue; } AccessPress_Orders::cancel_subscription($order, false); } } // try renewing over a 3 day window $subscriptions = $wpdb->get_col($wpdb->prepare("SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = '_acp_order_renewal_time' AND meta_value BETWEEN %s AND %s", $now - 172800, $now + 86400)); if (!empty($subscriptions)) { $orders = $wpdb->get_col("SELECT ID FROM {$wpdb->posts} WHERE post_type = 'acp-orders' AND post_status = 'publish' AND ID IN (" . implode(',', $subscriptions) . ')'); } if (empty($orders)) { premise_recurring_payment_notification(__('No subscriptions to renew.', 'premise')); } $results = array(); foreach ($orders as $order) { $order_status = get_post_meta($order, '_acp_order_status', true); if ($order_status == __('cancel', 'premise')) { continue; } $order_post = get_post($order); $result = AccessPress_Orders::renew_subscription($order, false); if (!$result) { $results[] = sprintf(__('Could not find product on order # %s', 'premise'), $order_post->post_name); continue; } if (is_wp_error($result)) { $results[] = sprintf(__('Error on order # %s - %s', 'premise'), $order_post->post_name, $result->get_error_message()); continue; } $product = get_post($result['product_id']); $results[] = sprintf(__('Processed order # %d - %s - %s - Amount %.2f', 'premise'), $order, $order_post->post_name, $product->post_title, $result['order_details']['_acp_order_price']); } premise_recurring_payment_notification(implode("\n", $results)); }
function build_renewal_table($start_date_ts, $end_date_ts, $product_id, $coupon_id, $export) { global $wpdb; $meta_where = ''; if ($product_id) { $meta_where .= $wpdb->prepare(" AND post_id IN (SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = '_acp_order_product_id' AND meta_value = %d)", $product_id); } if ($coupon_id) { $meta_where .= $wpdb->prepare(" AND post_id IN (SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = '_acp_order_coupon_id' AND meta_value = %d)", $coupon_id); } $subscriptions = $wpdb->get_col($wpdb->prepare("SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = '_acp_order_renewal_time' AND meta_value BETWEEN %s AND %s{$meta_where}", $start_date_ts, $end_date_ts)); if (empty($subscriptions)) { return array(); } $order_rows = $wpdb->get_results("SELECT ID, post_title FROM {$wpdb->posts} WHERE post_type = 'acp-orders' AND post_status = 'publish' AND ID IN (" . implode(',', $subscriptions) . ')'); $orders = array(); foreach ($order_rows as $row) { $orders[$row->ID] = $row->post_title; } $details = $wpdb->get_results("SELECT * FROM {$wpdb->postmeta} WHERE post_id IN (" . implode(',', array_keys($orders)) . ')'); if (empty($orders) || empty($details)) { return array(); } $order_details = array(); $order_table = array('header' => array(__('ID', 'premise'), __('Email', 'premise'), __('Member', 'premise'), __('Product', 'premise'), __('Purchase Date', 'premise'), __('Renewal Date', 'premise'), __('Subscription Price', 'premise'))); if ($export) { $order_table['header'] = array_merge($order_table['header'], array(__('Trial Price', 'premise'), __('Status', 'premise'), __('Coupon', 'premise'), __('Gateway', 'premise'), __('Transaction ID', 'premise'))); } else { $order_table['header'][] = __('Action', 'premise'); } $date_format = get_option('date_format'); $order_total = 0; foreach ($details as $meta) { if (!isset($order_details[$meta->post_id])) { $order_details[$meta->post_id] = array(); } $order_details[$meta->post_id][$meta->meta_key] = $meta->meta_value; if ($meta->meta_key == '_acp_order_price') { $order_total += $meta->meta_value; } } if ($raw) { return $order_details; } $order_sort = array(); foreach ($orders as $order => $title) { $key = $order_details[$order->ID]['_acp_order_renewal_time']; while (isset($order_sort[$key])) { $key++; } $order_sort[$key] = $order; } ksort($order_sort); foreach ($order_sort as $order) { $row = array($title); $user = isset($order_details[$order]['_acp_order_member_id']) ? get_user_by('id', $order_details[$order]['_acp_order_member_id']) : null; $row[] = $user ? $user->user_email : ''; $row[] = $user ? sprintf('%s - %s %s', $user->user_login, $user->first_name, $user->last_name) : ''; $product = isset($order_details[$order]['_acp_order_product_id']) ? get_post($order_details[$order]['_acp_order_product_id']) : null; $row[] = $product ? $product->post_title : ''; $row[] = isset($order_details[$order]['_acp_order_time']) ? date($date_format, $order_details[$order]['_acp_order_time']) : ''; $row[] = isset($order_details[$order]['_acp_order_renewal_time']) ? date($date_format, $order_details[$order]['_acp_order_renewal_time']) : ''; $row[] = isset($order_details[$order]['_acp_order_price']) ? $order_details[$order]['_acp_order_price'] : ''; if ($export) { $row[] = isset($order_details[$order]['_acp_order_trial_price']) ? $order_details[$order]['_acp_order_trial_price'] : ''; $row[] = isset($order_details[$order]['_acp_order_status']) ? $order_details[$order]['_acp_order_status'] : ''; $coupon = isset($order_details[$order]['_acp_order_coupon_id']) ? get_post($order_details[$order]['_acp_order_coupon_id']) : null; $row[] = $coupon ? $coupon->post_title : ''; $gateway = AccessPress_Orders::find_gateway($order); $row[] = $gateway ? $gateway->payment_method : ''; $row[] = $gateway && $gateway->has_transaction_meta($order) ? $gateway->has_transaction_meta($order) : ''; } else { $renew_url = add_query_arg(array('action' => 'renew', 'subscription' => $order, 'key' => wp_create_nonce('renew-subscription-' . $order)), menu_page_url('premise-reports', false)); $row[] = sprintf(__('<a href="%s" %s>Renew</a>', 'premise'), $renew_url, 'target="_blank"'); } $order_table[$order] = $row; } if (!$export) { $order_table['total'] = array(__('Total Sales', 'premise'), '', '', count($orders), $order_total); } return $order_table; }