Done !
| Server IP : 46.105.57.169 / Your IP : 216.73.216.67 Web Server : Apache System : Linux webm002.cluster120.gra.hosting.ovh.net 6.18.42-ovh-vps-grsec-zfs+ #1 SMP PREEMPT_DYNAMIC Wed Aug 5 15:59:48 CEST 2026 x86_64 User : verseaumee ( 152031) PHP Version : 8.5.7 Disable Function : _dyuweyrj4,_dyuweyrj4r,dl MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : OFF | Pkexec : OFF Directory : /home/verseaumee/middletvnew/wp-content/plugins/armember/core/classes/ |
Upload File : |
<?php
if (!class_exists('ARM_crons')) {
class ARM_crons {
function __construct() {
global $wpdb, $ARMember, $arm_slugs;
add_filter('cron_schedules', array($this, 'arm_add_cron_schedules'));
//add_action('init', array($this, 'arm_add_crons'), 10);
add_action('arm_handle_change_user_plan', array($this, 'arm_handle_change_user_plan_func'));
add_action('arm_handle_expire_subscription', array($this, 'arm_handle_expire_subscription_func'));
add_action('arm_handle_failed_payment_for_subscription_plan', array($this, 'arm_handle_failed_payment_for_subscription_plan_func'));
/* For checking if recurring payment response is not arrived in the system OR
* For checking grace period is completed for failed payment
*/
add_action('arm_handle_expire_infinite_subscription', array($this, 'arm_handle_expire_infinite_subscription_func'));
add_action('arm_handle_before_expire_subscription', array($this, 'arm_handle_before_expire_subscription_func'));
add_action('arm_handle_before_dripped_content_available', array($this, 'arm_handle_before_dripped_content_available_func'));
add_action('arm_handle_trial_finished', array($this, 'arm_handle_trial_finished_func'));
add_action('arm_update_user_achievements', array($this, 'arm_update_user_achievements_func'));
add_action('arm_handle_renewal_reminder_of_subscription', array($this, 'arm_handle_renewal_reminder_of_subscription_func'));
add_action('arm_handle_renewal_reminder_of_subscription', array($this, 'arm_handle_renewal_reminder_of_automatic_subscription_func'));
add_action('arm_handle_failed_login_log_data_delete', array($this, 'arm_handle_failed_login_log_data_delete_func'));
add_action('armember_send_anonymous_data_cron', array($this, 'armember_send_anonymous_data_cron_func'));
}
function arm_handle_failed_login_log_data_delete_func()
{
global $wpdb, $ARMember, $arm_global_settings;
if(!empty($arm_global_settings->block_settings['failed_login_lockdown']))
{
$arm_tbl_arm_failed_login_logs = $ARMember->tbl_arm_fail_attempts;
$arm_delete_start_date = date('Y-m-d', strtotime('-30 days'));
$arm_delete_faild_login_log_data = $wpdb->query($wpdb->prepare("DELETE FROM `{$arm_tbl_arm_failed_login_logs}` WHERE `arm_fail_attempts_datetime` <= %s", $arm_delete_start_date)); //phpcs:ignore --Reason $arm_tbl_arm_failed_login_logs is a table
}
if(!empty($arm_global_settings->block_settings['track_login_history']))
{
$arm_tbl_arm_login_history = $ARMember->tbl_arm_login_history;
$arm_delete_start_date = date('Y-m-d 00:00:00', strtotime('-30 days'));
$arm_delete_login_history_data = $wpdb->query($wpdb->prepare("DELETE FROM `{$arm_tbl_arm_login_history}` WHERE `arm_logout_date` <= %s AND arm_history_id NOT IN ( SELECT arm_history_id_max_id FROM ( SELECT max(arm_history_id) as arm_history_id_max_id FROM `{$arm_tbl_arm_login_history}` Group BY arm_user_id ORDER BY arm_history_id DESC ) arm_history_ids )", $arm_delete_start_date)); //phpcs:ignore --Reason $arm_tbl_arm_login_history is a table name
}
}
function arm_add_cron_schedules($schedules) {
if (!is_array($schedules)) {
$schedules = array();
}
for ($i = 2; $i < 24; $i++) {
if ($i == 12) {
continue;
}
$display_label = esc_html__('Every', 'ARMember') . ' ' . $i . ' ' . esc_html__('Hour', 'ARMember');
$schedules['every' . $i . 'hour'] = array('interval' => HOUR_IN_SECONDS * $i, 'display' => $display_label);
}
return apply_filters('arm_add_cron_schedules', $schedules);
}
function arm_add_crons() {
global $wpdb, $ARMember, $arm_slugs, $arm_cron_hooks_interval, $arm_global_settings;
wp_get_schedules();
$all_global_settings = $arm_global_settings->arm_get_all_global_settings();
$general_settings = $all_global_settings['general_settings'];
$cron_schedules_time = isset($general_settings['arm_email_schedular_time']) ? $general_settings['arm_email_schedular_time'] : 12;
$interval = 'twicedaily';
if ($cron_schedules_time == 24) {
$interval = 'daily';
} else if ($cron_schedules_time == 12) {
$interval = 'twicedaily';
} else if ($cron_schedules_time == 1) {
$interval = 'hourly';
} else {
$interval = 'every' . $cron_schedules_time . 'hour';
}
$cron_hooks = $this->arm_get_cron_hook_names();
foreach ($cron_hooks as $hook) {
if (!wp_next_scheduled($hook)) {
wp_schedule_event(time(), $interval, $hook);
}
}
do_action('arm_membership_addon_crons', $interval);
}
function arm_handle_expire_subscription_func() {
global $wp, $wpdb, $ARMember, $arm_global_settings, $arm_subscription_plans, $arm_manage_communication, $arm_members_class;
set_time_limit(0); /* Preventing timeout issue. */
$now = current_time('timestamp');
$start_time = strtotime("-12 Hours", $now);
$end_time = strtotime("+30 Minutes", $now);
$cron_msgs = array();
/**
* For Expire Subscription on Today Process
*/
$args = array(
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'arm_user_plan_ids',
'value' => '',
'compare' => '!='
),
array(
'key' => 'arm_user_plan_ids',
'value' => 'a:0:{}',
'compare' => '!='
),
)
);
$expireUsers = get_users($args);
if (!empty($expireUsers)) {
foreach ($expireUsers as $usr) {
$user_id = $usr->ID;
$plan_ids = get_user_meta($user_id, 'arm_user_plan_ids', true);
$plan_ids = !empty($plan_ids) ? $plan_ids : array();
if (!empty($plan_ids) && is_array($plan_ids)) {
foreach ($plan_ids as $plan_id) {
$planData = get_user_meta($user_id, 'arm_user_plan_' . $plan_id, true);
if (!empty($planData)) {
$expireTime = isset($planData['arm_expire_plan']) ? $planData['arm_expire_plan'] : '';
$is_plan_cancelled = isset($planData['arm_cencelled_plan']) ? $planData['arm_cencelled_plan'] : '';
$planDetail = isset($planData['arm_current_plan_detail']) ? $planData['arm_current_plan_detail'] : '';
if (!empty($planDetail)) {
$plan = new ARM_Plan(0);
$plan->init((object) $planDetail);
} else {
$plan = new ARM_Plan($plan_id);
}
if (!empty($expireTime)) {
if ($expireTime <= $end_time) {
$plan_name = $arm_subscription_plans->arm_get_plan_name_by_id($plan_id);
/* Cancel Subscription on expiration */
if (isset($is_plan_cancelled) && $is_plan_cancelled == 'yes') {
if ($plan->exists()) {
$cancel_plan_action = isset($plan->options['cancel_plan_action']) ? $plan->options['cancel_plan_action'] : 'immediate';
if ($cancel_plan_action == 'on_expire') {
if ($plan->is_paid() && !$plan->is_lifetime() && $plan->is_recurring()) {
do_action('arm_cancel_subscription_gateway_action', $user_id, $plan_id);
$arm_subscription_plans->arm_add_membership_history($usr->ID, $plan_id, 'cancel_subscription');
do_action('arm_cancel_subscription', $usr->ID, $plan_id);
$arm_subscription_plans->arm_clear_user_plan_detail($usr->ID, $plan_id);
$cancel_plan_act = isset($plan->options['cancel_action']) ? $plan->options['cancel_action'] : 'block';
if ($arm_subscription_plans->isPlanExist($cancel_plan_act)) {
do_action('arm_general_log_entry', 'cron', 'subscription user plan assigned by system', 'armember', 'userid='.$usr->ID.', planid='.$plan_id.', plan='.$plan_name.', cancel action='.$cancel_plan_act);
$arm_members_class->arm_new_plan_assigned_by_system($cancel_plan_act, $plan_id, $usr->ID);
}
}
}
}
}
/* Send Notification Mail */
$alreadysentmsgs = $planData['arm_sent_msgs'];
$alreadysentmsgs = (!empty($alreadysentmsgs)) ? $alreadysentmsgs : array();
$arm_subscription_plans->arm_user_plan_status_action(array('plan_id' => $plan_id, 'user_id' => $usr->ID, 'action' => 'eot'));
do_action('arm_general_log_entry', 'cron', 'subscription user plan expired by system', 'armember', 'userid='.$usr->ID.', planid='.$plan_id.', plan='.$plan_name.', cancel action=eot');
}
}
}
}
}
}
}
if (!empty($cron_msgs)) {
do_action('arm_cron_expire_subscription', $cron_msgs);
}
}
function arm_handle_expire_infinite_subscription_func() {
global $wp, $wpdb, $ARMember, $arm_global_settings, $arm_subscription_plans, $arm_manage_communication, $arm_members_class;
set_time_limit(0); /* Preventing timeout issue. */
$now = current_time('timestamp');
$start_time = strtotime("-12 Hours", $now);
$end_time = strtotime("+30 Minutes", $now);
$cron_msgs = array();
/**
* For Expire infinite Subscription on Today Process
*/
$args = array(
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'arm_user_plan_ids',
'value' => '',
'compare' => '!='
),
array(
'key' => 'arm_user_plan_ids',
'value' => 'a:0:{}',
'compare' => '!='
),
)
);
$expireUsers = get_users($args);
if (!empty($expireUsers)) {
foreach ($expireUsers as $usr) {
$user_id = $usr->ID;
$plan_ids = get_user_meta($user_id, 'arm_user_plan_ids', true);
$plan_ids = !empty($plan_ids) ? $plan_ids : array();
if (!empty($plan_ids) && is_array($plan_ids)) {
foreach ($plan_ids as $plan_id) {
$planData = get_user_meta($user_id, 'arm_user_plan_' . $plan_id, true);
if (!empty($planData)) {
$expireTime = isset($planData['arm_next_due_payment']) ? $planData['arm_next_due_payment'] : '';
$is_plan_cancelled = isset($planData['arm_cencelled_plan']) ? $planData['arm_cencelled_plan'] : '';
$planDetail = isset($planData['arm_current_plan_detail']) ? $planData['arm_current_plan_detail'] : '';
if (!empty($planDetail)) {
$plan = new ARM_Plan(0);
$plan->init((object) $planDetail);
} else {
$plan = new ARM_Plan($plan_id);
}
if (!empty($expireTime) && isset($is_plan_cancelled) && $is_plan_cancelled == 'yes') {
if ($expireTime <= $now) {
$plan_name = $arm_subscription_plans->arm_get_plan_name_by_id($plan_id);
/* Cancel Subscription on expiration for infinite */
$plan_cycle = isset($planData['arm_payment_cycle']) ? $planData['arm_payment_cycle'] : '';
$paly_cycle_data = $plan->prepare_recurring_data($plan_cycle);
if($plan->is_recurring() && $paly_cycle_data['rec_time'] == 'infinite') {
if ($plan->exists()) {
$cancel_plan_action = isset($plan->options['cancel_plan_action']) ? $plan->options['cancel_plan_action'] : 'immediate';
if ($cancel_plan_action == 'on_expire') {
if ($plan->is_paid() && !$plan->is_lifetime() && $plan->is_recurring()) {
//Update Last Subscriptions Log Detail
do_action('arm_cancel_subscription_gateway_action', $user_id, $plan_id);
$arm_subscription_plans->arm_add_membership_history($usr->ID, $plan_id, 'cancel_subscription');
do_action('arm_cancel_subscription', $usr->ID, $plan_id);
$arm_subscription_plans->arm_clear_user_plan_detail($usr->ID, $plan_id);
do_action('arm_general_log_entry', 'cron', 'expired infinite subscription user plan', 'armember',
'userid='.$user_id.', planid='.$plan_id.', plan='.$plan_name.', expireTime='.$expireTime.', cancelled='.$is_plan_cancelled.', cancel action='.$cancel_plan_action.', recurringtime='.$paly_cycle_data['rec_time']);
$cancel_plan_act = isset($plan->options['cancel_action']) ? $plan->options['cancel_action'] : 'block';
if ($arm_subscription_plans->isPlanExist($cancel_plan_act)) {
$arm_members_class->arm_new_plan_assigned_by_system($cancel_plan_act, $plan_id, $usr->ID);
} else {
}
$arm_manage_communication->arm_user_plan_status_action_mail(array('plan_id' => $plan_id, 'user_id' => $user_id, 'action' => 'on_cancel_subscription'));
}
}
}
$arm_subscription_plans->arm_user_plan_status_action(array('plan_id' => $plan_id, 'user_id' => $user_id, 'action' => 'eot'));
do_action('arm_scheduler_user_plan_eot_outside', $user_id, $plan_id );
do_action('arm_general_log_entry', 'cron', 'recurring subscription user plan expired by system', 'armember', 'userid='.$usr->ID.', planid='.$plan_id.', plan='.$plan_name.', action=eot');
}
}
}
}
}
}
}
}
}
function arm_handle_failed_payment_for_subscription_plan_func()
{
/* Checked */
global $wp, $wpdb, $ARMember, $arm_global_settings, $arm_subscription_plans, $arm_manage_communication, $arm_members_class;
set_time_limit(0); /* Preventing timeout issue. */
$now = current_time('timestamp');
$cron_msgs = array();
/**
* For Expire Subscription on Today Process
*/
$args = array(
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'arm_user_plan_ids',
'value' => '',
'compare' => '!='
),
array(
'key' => 'arm_user_plan_ids',
'value' => 'a:0:{}',
'compare' => '!='
),
)
);
$expireUsers = get_users($args);
if (!empty($expireUsers)) {
foreach ($expireUsers as $usr) {
$user_id = $usr->ID;
$plan_ids = get_user_meta($user_id, 'arm_user_plan_ids', true);
$defaultPlanData = $arm_subscription_plans->arm_default_plan_array();
if(!empty($plan_ids) && is_array($plan_ids)) {
foreach($plan_ids as $plan_id) {
$planData = get_user_meta($user_id, 'arm_user_plan_' .$plan_id, true);
$planData = !empty($planData) ? $planData : array();
$planData = shortcode_atts($defaultPlanData, $planData);
if(!empty($planData))
{
$planDetail = $planData['arm_current_plan_detail'];
if (!empty($planDetail)) {
$plan = new ARM_Plan(0);
$plan->init((object) $planDetail);
} else {
$plan = new ARM_Plan($plan_id);
}
$payment_mode = $planData['arm_payment_mode'];
if ($plan->is_recurring() && $payment_mode == 'manual_subscription')
{
$expireTime = $planData['arm_next_due_payment'];
$arm_payment_cycle = $planData['arm_payment_cycle'];
$recurring_data = $plan->prepare_recurring_data($arm_payment_cycle);
$recurring_time = $recurring_data['rec_time'];
$completed = $planData['arm_completed_recurring'];
if($recurring_time != $completed || 'infinite'==$recurring_time)
{
if (!empty($expireTime))
{
$arm_next_due_date = strtotime("+24 Hours", $expireTime);
if ($arm_next_due_date <= $now)
{
$suspended_plan_ids = get_user_meta($usr->ID, 'arm_user_suspended_plan_ids', true);
$suspended_plan_id = (!empty($suspended_plan_ids) && is_array($suspended_plan_ids)) ? $suspended_plan_ids : array();
if(!in_array($plan_id, $suspended_plan_id))
{
/* Send Notification Mail */
$alreadysentmsgs = $planData['arm_sent_msgs'];
$alreadysentmsgs = (!empty($alreadysentmsgs)) ? $alreadysentmsgs : array();
$arm_user_complete_recurring_meta = $planData['arm_completed_recurring'];
$arm_user_complete_recurring = !empty($arm_user_complete_recurring_meta) ? $arm_user_complete_recurring_meta : 0;
$arm_is_user_in_grace = !empty($planData['arm_is_user_in_grace']) ? $planData['arm_is_user_in_grace'] : 0;
$arm_grace_period_end = $planData['arm_grace_period_end'];
do_action('arm_general_log_entry', 'cron', 'check user plan next due date', 'armember', 'user_id='.$user_id.', plan_id='.$plan_id.', next due date='.$arm_next_due_date.', end_time='.$now.', in grace='.$arm_is_user_in_grace.', grace end='.$arm_grace_period_end);
if (!in_array('failed_payment_' . $plan_id . '_' . $arm_user_complete_recurring, $alreadysentmsgs))
{
$alreadysentmsgs['failed_payment_'.$now] = 'failed_payment_' . $plan_id . '_' . $arm_user_complete_recurring;
$planData['arm_sent_msgs'] = $alreadysentmsgs;
update_user_meta($usr->ID, 'arm_user_plan_' . $plan_id, $planData);
do_action('arm_general_log_entry', 'cron', 'manual failed payment action', 'armember', 'user_id='.$user_id.', plan_id='.$plan_id );
$arm_subscription_plans->arm_user_plan_status_action(array('plan_id' => $plan_id, 'user_id' => $usr->ID, 'action' => 'failed_payment'), true);
do_action('arm_scheduler_user_plan_failed_payment_outside', $user_id, $plan_id );
}
else if( !in_array('failed_payment_after_grace_' . $plan_id . '_' . $arm_user_complete_recurring, $alreadysentmsgs) && !empty($arm_is_user_in_grace) && !empty($arm_grace_period_end) && $arm_grace_period_end < $now)
{
$alreadysentmsgs['failed_payment_after_grace_'.$now] = 'failed_payment_after_grace_' . $plan_id . '_' . $arm_user_complete_recurring;
$planData['arm_sent_msgs'] = $alreadysentmsgs;
update_user_meta($usr->ID, 'arm_user_plan_' . $plan_id, $planData);
do_action('arm_general_log_entry', 'cron', 'manual subscription after grace', 'armember', 'user_id='.$user_id.', plan='. $plan_id );
$arm_subscription_plans->arm_user_plan_status_action(array('plan_id' => $plan_id, 'user_id' => $usr->ID, 'action' => 'failed_payment'), true);
do_action('arm_scheduler_user_plan_failed_payment_after_grace_outside', $user_id, $plan_id );
}
//suspended plan id check because in above two if condition, if plan suspended then only we need to send next payment failed notification.
$suspended_plan_ids_check_for_next_payment_failed = get_user_meta($usr->ID, 'arm_user_suspended_plan_ids', true);
$suspended_plan_ids_check_for_next_payment_failed = (!empty($suspended_plan_ids_check_for_next_payment_failed) && is_array($suspended_plan_ids_check_for_next_payment_failed)) ? $suspended_plan_ids_check_for_next_payment_failed : array();
if (in_array($plan_id, $suspended_plan_ids_check_for_next_payment_failed) && !in_array('on_next_payment_failed_' . $plan_id . '_' . $arm_user_complete_recurring, $alreadysentmsgs))
{
$plan_name = $arm_subscription_plans->arm_get_plan_name_by_id($plan_id);
$notify = $arm_manage_communication->membership_communication_mail('on_next_payment_failed', $usr->ID, $plan_id);
if($notify) {
/* Update User meta for notification type */
$alreadysentmsgs['on_next_payment_failed_'.$now] = 'on_next_payment_failed_' . $plan_id . '_' . $arm_user_complete_recurring;
$planData['arm_sent_msgs'] = $alreadysentmsgs;
update_user_meta($usr->ID, 'arm_user_plan_' . $plan_id, $planData);
$cron_msgs[$usr->ID] = esc_html__("Mail successfully sent to", 'ARMember') . " " . $usr->ID . " " . esc_html__("for failed payment.", 'ARMember') . "({$plan_name})";
do_action('arm_general_log_entry', 'cron', 'manual next payment failed', 'armember', 'user_id='.$user_id.', plan='. $plan_id );
} else {
$cron_msgs[$usr->ID] = esc_html__("There is an error in sending mail to", 'ARMember') . " " . $usr->ID . " " . esc_html__("for failed payment.", 'ARMember') . "({$plan_name})";
}
}
else {
$plan_name = $arm_subscription_plans->arm_get_plan_name_by_id($plan_id);
$cron_msgs[$usr->ID] = esc_html__("Mail already sent to", 'ARMember') . " " . $usr->ID . " " . esc_html__("for failed payment.", 'ARMember') . "({$plan_name})";
}
}
}
}
}
}
else if ($payment_mode == 'auto_debit_subscription')
{
/* check for failed payment after 1 day of last next due payment date if failed payment was not occured and recurring response was not arrived, then in that case we need to call failed payment action */
$arm_payment_cycle = $planData['arm_payment_cycle'];
$recurring_data = $plan->prepare_recurring_data($arm_payment_cycle);
//$amount = !empty($recurring_data['amount']) ? $recurring_data['amount'] : 0;
$recurring_time = !empty($recurring_data['rec_time']) ? $recurring_data['rec_time'] : '';
$completed = $planData['arm_completed_recurring'];
if($recurring_time != $completed || 'infinite'==$recurring_time)
{
$actual_arm_next_due_date = $planData['arm_next_due_payment'];
if(!empty($actual_arm_next_due_date))
{
$arm_next_due_date = strtotime("+24 Hours", $actual_arm_next_due_date);
if($now > $arm_next_due_date)
{
$suspended_plan_ids = get_user_meta($user_id, 'arm_user_suspended_plan_ids', true);
$suspended_plan_id = (!empty($suspended_plan_ids) && is_array($suspended_plan_ids)) ? $suspended_plan_ids : array();
if(!in_array($plan_id, $suspended_plan_id))
{
/* control will come here only if recurring payment response was not arrived. */
$arm_subscription_plans->arm_user_plan_status_action(array('plan_id' => $plan_id, 'user_id' => $user_id, 'action' => 'failed_payment'), true);
$arm_user_payment_gateway = $planData['arm_user_gateway'];
do_action('arm_general_log_entry', 'cron', 'auto subscription check user suspend plan', 'armember', 'user_id='.$user_id.', plan='.$plan_id.', gateway='.$arm_user_payment_gateway.', time='.$now.'>'.$arm_next_due_date );
do_action('arm_scheduler_user_plan_failed_payment_outside', $user_id, $plan_id );
}
}
}
}
}
}
}
}
} /* End Foreach Loop `($expireUsers as $usr)` */
} /* End `(!empty($expireUsers))` */
if (!empty($cron_msgs)) {
do_action('arm_cron_failed_payment_subscription', $cron_msgs);
}
}
function arm_handle_change_user_plan_func() {
global $wp, $wpdb, $ARMember, $arm_global_settings, $arm_subscription_plans, $arm_manage_communication;
set_time_limit(0); /* Prevanting timeout issue. */
$now = current_time('timestamp');
$start_time = strtotime(date('Y-m-d 00:00:00'));
$end_time = strtotime(date('Y-m-d 23:59:59'));
$cron_msgs = array();
$args = array(
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'arm_user_plan_ids',
'value' => '',
'compare' => '!='
),
array(
'key' => 'arm_user_plan_ids',
'value' => 'a:0:{}',
'compare' => '!='
),
)
);
$users = get_users($args);
if (!empty($users)) {
foreach ($users as $usr) {
$user_id = $usr->ID;
$plan_ids = get_user_meta($usr->ID, 'arm_user_plan_ids', true);
if (!empty($plan_ids) && is_array($plan_ids)) {
foreach ($plan_ids as $plan_id) {
$planData = get_user_meta($usr->ID, 'arm_user_plan_' . $plan_id, true);
if (!empty($planData) && is_array($plan_ids)) {
$arm_subscription_effective = isset($planData['arm_subscr_effective']) ? $planData['arm_subscr_effective']: '';
$new_plan = isset($planData['arm_change_plan_to']) ? $planData['arm_change_plan_to'] : '';
if (!empty($arm_subscription_effective)) {
if ($arm_subscription_effective <= $end_time) {
if (!empty($new_plan)) {
$arm_subscription_plans->arm_update_user_subscription($user_id, $new_plan, 'system', false);
do_action('arm_general_log_entry', 'cron', 'user membership plan changed', 'armember', 'user_id='.$user_id.', plan='.$plan_id.', subscription effective='.$arm_subscription_effective.', change plan to='.$new_plan );
/* We can send mail to user for change subscription plan */
$cron_msgs[$usr->ID] = $usr->user_email . "'s " . esc_html__("membership has been changed to", 'ARMember') . " {$new_plan}.";
do_action('arm_scheduler_change_user_plan_outside', $user_id, $plan_id, $new_plan);
}
}
}
}
}
}
}
}
$args = array(
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'arm_user_future_plan_ids',
'value' => '',
'compare' => '!='
),
array(
'key' => 'arm_user_future_plan_ids',
'value' => 'a:0:{}',
'compare' => '!='
),
)
);
$users = get_users($args);
if (!empty($users)){
foreach ($users as $usr) {
$user_id = $usr->ID;
$plan_ids = get_user_meta($usr->ID, 'arm_user_future_plan_ids', true);
$current_plan_ids = get_user_meta($usr->ID, 'arm_user_plan_ids', true);
$current_plan_ids = !empty($current_plan_ids) ? $current_plan_ids : array();
if (!empty($plan_ids) && is_array($plan_ids)) {
foreach ($plan_ids as $plan_id) {
$planData = get_user_meta($usr->ID, 'arm_user_plan_' . $plan_id, true);
if (!empty($planData) && is_array($plan_ids)) {
$arm_subscription_effective = $planData['arm_start_plan'];
if($now >= $arm_subscription_effective){
if(!in_array($plan_id, $current_plan_ids)){
$arm_plan_role = $planData['arm_current_plan_detail']['arm_subscription_plan_role'];
if(count($current_plan_ids) > 0){
$usr->add_role($arm_plan_role);
}
else{
$usr->set_role($arm_plan_role);
}
unset($plan_ids[array_search($plan_id, $plan_ids)]);
$current_plan_ids[] = $plan_id;
update_user_meta($usr->ID, 'arm_user_last_plan', $plan_id);
do_action('arm_general_log_entry', 'cron', 'user membership future plan changed', 'armember',
'user_id='.$user_id.', plan='.$plan_id.', subscription effective='.$arm_subscription_effective);
}
}
}
}
update_user_meta($usr->ID, 'arm_user_future_plan_ids', array_values($plan_ids));
update_user_meta($usr->ID, 'arm_user_plan_ids', array_values($current_plan_ids));
}
}
}
if (!empty($cron_msgs)) {
do_action('arm_cron_change_user_plan', $cron_msgs);
}
}
function arm_handle_before_expire_subscription_func() {
global $wp, $wpdb, $ARMember, $arm_global_settings, $arm_subscription_plans, $arm_manage_communication,$arm_pay_per_post_feature;
set_time_limit(0); /* Preventing timeout issue. */
$now = current_time('timestamp');
$cron_msgs = array();
$notifications = $arm_manage_communication->arm_get_communication_messages_by('message_type', 'before_expire');
if (!empty($notifications)) {
foreach ($notifications as $message) {
$period_unit = $message->arm_message_period_unit;
$period_type = $message->arm_message_period_type;
$endtime = strtotime("+$period_unit Days", $now);
switch (strtolower($period_type)) {
case 'd':
case 'day':
case 'days':
$endtime = strtotime("+$period_unit Days", $now);
break;
case 'w':
case 'week':
case 'weeks':
$endtime = strtotime("+$period_unit Weeks", $now);
break;
case 'm':
case 'month':
case 'months':
$endtime = strtotime("+$period_unit Months", $now);
break;
case 'y':
case 'year':
case 'years':
$endtime = strtotime("+$period_unit Years", $now);
break;
default:
break;
}
$endtime_start = strtotime(date('Y-m-d 00:00:00', $endtime));
$endtime_end = strtotime(date('Y-m-d 23:59:59', $endtime));
$message_plans = (!empty($message->arm_message_subscription)) ? explode(',', $message->arm_message_subscription) : array();
$planArray = array();
if (empty($message_plans)) {
$table = $ARMember->tbl_arm_subscription_plans;
$all_plans = $wpdb->get_results($wpdb->prepare("SELECT `arm_subscription_plan_id` FROM `{$table}` WHERE `arm_subscription_plan_type` != %s AND `arm_subscription_plan_type` != %s AND `arm_subscription_plan_post_id` = %d", 'free', 'paid_infinite', 0)); //phpcs:ignore --Reason $table is a table name
if (!empty($all_plans)) {
foreach ($all_plans as $plan) {
$planId = $plan->arm_subscription_plan_id;
$planArray[] = $planId;
}
}
} else {
$planArray = $message_plans;
}
if (!empty($planArray)) {
foreach ($planArray as $plan_id) {
$plan_name = $arm_subscription_plans->arm_get_plan_name_by_id($plan_id);
$args = array(
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'arm_user_plan_ids',
'value' => '',
'compare' => '!='
),
array(
'key' => 'arm_user_plan_ids',
'value' => 'a:0:{}',
'compare' => '!='
),
)
);
$users = get_users($args);
if (empty($users)) {
continue;
}
foreach ($users as $usr) {
$user_plan_ids = get_user_meta($usr->ID, 'arm_user_plan_ids', true);
$user_post_ids = get_user_meta($usr->ID, 'arm_user_post_ids', true);
if( empty( $user_post_ids ) ){
$user_post_ids = array();
}
if (!empty($user_plan_ids) && is_array($user_plan_ids)) {
if (in_array($plan_id, $user_plan_ids) && !array_key_exists($plan_id, $user_post_ids) ) {
$planData = get_user_meta($usr->ID, 'arm_user_plan_' . $plan_id, true);
if (!empty($planData)) {
$expireTime = $planData['arm_expire_plan'];
if (!empty($expireTime)) {
if ($expireTime > $now && $expireTime <= $endtime_end) {
$memberStatus = arm_get_member_status($usr->ID);
$payment_mode = $planData['arm_payment_mode'];
$alreadysentmsgs = $planData['arm_sent_msgs'];
$alreadysentmsgs = (!empty($alreadysentmsgs)) ? $alreadysentmsgs : array();
if (!in_array('before_expire_' . $message->arm_message_id, $alreadysentmsgs)) {
$notify = $arm_manage_communication->arm_common_send_email($message,$usr->data->user_email,$usr->ID,$plan_id);
if ($notify) {
/* Update User meta for notification type */
$arm_now = $now . '_'.rand();
$alreadysentmsgs[$arm_now] = 'before_expire_' . $message->arm_message_id;
$planData['arm_sent_msgs'] = $alreadysentmsgs;
update_user_meta($usr->ID, 'arm_user_plan_' . $plan_id, $planData);
$cron_msgs[$usr->ID] = esc_html__("Mail successfully sent to", 'ARMember') . " " . $usr->ID . " " . esc_html__("for before expire membership.", 'ARMember') . "({$plan_name})";
} else {
$cron_msgs[$usr->ID] = esc_html__("There is an error in sending mail to", 'ARMember') . " " . $usr->ID . " " . esc_html__("for before expire membership.", 'ARMember') . "({$plan_name})";
}
if ($notify) {
$cron_msgs['admin_mail_for_' . $usr->ID] = esc_html__("Mail successfully sent to admin for", 'ARMember') . " " . $usr->ID . " " . esc_html__("for before expire membership.", 'ARMember') . "({$plan_name})";
} else {
$cron_msgs['admin_mail_for_' . $usr->ID] = esc_html__("There is an error in sending mail to admin for", 'ARMember') . " " . $usr->ID . " " . esc_html__("for before expire membership.", 'ARMember') . "({$plan_name})";
}
do_action('arm_general_log_entry', 'cron', 'expire subscription check plan', 'armember', 'user_id='.$usr->ID.', plan='.$plan_id.', expireTime='.$expireTime.', notify='.$notify.', message_id='.$message->arm_message_id);
} else {
$cron_msgs[$usr->ID] = esc_html__("Mail successfully sent to", 'ARMember') . " " . $usr->ID . " " . esc_html__("for before expire membership.", 'ARMember') . "({$plan_name})";
}
}
}
}
}
}
}
}
}
} /* End Foreach Loop `($notifications as $message)` */
} /* End `(!empty($notifications))` */
if( $arm_pay_per_post_feature->isPayPerPostFeature ) {
$now = current_time('timestamp');
$pp_notifications = $arm_manage_communication->arm_get_communication_messages_by( 'message_type', 'before_expire_post' );
if (!empty($pp_notifications)) {
foreach ($pp_notifications as $message) {
$period_unit = $message->arm_message_period_unit;
$period_type = $message->arm_message_period_type;
$endtime = strtotime("+$period_unit Days", $now);
switch (strtolower($period_type)) {
case 'd':
case 'day':
case 'days':
$endtime = strtotime("+$period_unit Days", $now);
break;
case 'w':
case 'week':
case 'weeks':
$endtime = strtotime("+$period_unit Weeks", $now);
break;
case 'm':
case 'month':
case 'months':
$endtime = strtotime("+$period_unit Months", $now);
break;
case 'y':
case 'year':
case 'years':
$endtime = strtotime("+$period_unit Years", $now);
break;
default:
break;
}
$endtime_start = strtotime(date('Y-m-d 00:00:00', $endtime));
$endtime_end = strtotime(date('Y-m-d 23:59:59', $endtime));
$message_plans = (!empty($message->arm_message_subscription)) ? explode(',', $message->arm_message_subscription) : array();
$planArray = array();
if (empty($message_plans)) {
$table = $ARMember->tbl_arm_subscription_plans;
$all_plans = $wpdb->get_results($wpdb->prepare("SELECT `arm_subscription_plan_id` FROM `{$table}` WHERE `arm_subscription_plan_type` != %s AND `arm_subscription_plan_type` != %s AND arm_subscription_plan_post_id > %d", 'free', 'paid_infinite', 0)); //phpcs:ignore --Reason $table is a table name
if (!empty($all_plans)) {
foreach ($all_plans as $plan) {
$planId = $plan->arm_subscription_plan_id;
$planArray[] = $planId;
}
}
} else {
$planArray = $message_plans;
}
if (!empty($planArray)) {
foreach ($planArray as $plan_id) {
$plan_name = $arm_subscription_plans->arm_get_plan_name_by_id($plan_id);
$args = array(
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'arm_user_plan_ids',
'value' => '',
'compare' => '!='
),
array(
'key' => 'arm_user_plan_ids',
'value' => 'a:0:{}',
'compare' => '!='
),
)
);
$users = get_users($args);
if (empty($users)) {
continue;
}
foreach ($users as $usr) {
$user_plan_ids = get_user_meta($usr->ID, 'arm_user_post_ids', true);
if (!empty($user_plan_ids) && is_array($user_plan_ids)) {
if (array_key_exists($plan_id, $user_plan_ids)) {
$planData = get_user_meta($usr->ID, 'arm_user_plan_' . $plan_id, true);
if (!empty($planData)) {
$expireTime = $planData['arm_expire_plan'];
if (!empty($expireTime)) {
if ($expireTime > $now && $expireTime <= $endtime_end) {
$memberStatus = arm_get_member_status($usr->ID);
$payment_mode = $planData['arm_payment_mode'];
$alreadysentmsgs = $planData['arm_sent_msgs'];
$alreadysentmsgs = (!empty($alreadysentmsgs)) ? $alreadysentmsgs : array();
if (!in_array('before_expire_post_' . $message->arm_message_id, $alreadysentmsgs)) {
$notify = $arm_manage_communication->arm_common_send_email($message,$usr->data->user_email,$usr->ID,$plan_id);
if ($notify) {
/* Update User meta for notification type */
$arm_now = $now . '_'.rand();
$alreadysentmsgs[$arm_now] = 'before_expire_post_' . $message->arm_message_id;
$planData['arm_sent_msgs'] = $alreadysentmsgs;
update_user_meta($usr->ID, 'arm_user_plan_' . $plan_id, $planData);
$cron_msgs[$usr->ID] = esc_html__("Mail successfully sent to", 'ARMember') . " " . $usr->ID . " " . esc_html__("for before expire paid post purchase.", 'ARMember') . "({$plan_name})";
} else {
$cron_msgs[$usr->ID] = esc_html__("There is an error in sending mail to", 'ARMember') . " " . $usr->ID . " " . esc_html__("for before expire paid post purchase.", 'ARMember') . "({$plan_name})";
}
if ($notify) {
$cron_msgs['admin_mail_for_' . $usr->ID] = esc_html__("Mail successfully sent to admin for", 'ARMember') . " " . $usr->ID . " " . esc_html__("for before expire membership.", 'ARMember') . "({$plan_name})";
} else {
$cron_msgs['admin_mail_for_' . $usr->ID] = esc_html__("There is an error in sending mail to admin for", 'ARMember') . " " . $usr->ID . " " . esc_html__("for before expire paid post purchase.", 'ARMember') . "({$plan_name})";
}
do_action('arm_general_log_entry', 'cron', 'expire subscription check post', 'armember', 'user_id='.$usr->ID.', plan='.$plan_id.', expireTime='.$expireTime.', notify='.$notify );
} else {
$cron_msgs[$usr->ID] = esc_html__("Mail successfully sent to", 'ARMember') . " " . $usr->ID . " " . esc_html__("for before expire paid post purchase.", 'ARMember') . "({$plan_name})";
}
}
}
}
}
}
}
do_action('arm_general_log_entry', 'cron', 'subscription user notify before subscription expire', 'armember', 'userid='.$usr->ID.', planid='.$plan_id.', action= before plan expire');
}
}
} /* End Foreach Loop `($notifications as $message)` */
}
}
if (!empty($cron_msgs)) {
do_action('arm_cron_before_expire_subscription', $cron_msgs);
}
}
function arm_handle_before_dripped_content_available_func() {
global $wp, $wpdb, $ARMember, $arm_global_settings, $arm_subscription_plans, $arm_manage_communication, $arm_drip_rules;
if ($arm_drip_rules->isDripFeature) {
set_time_limit(0); /* Preventing timeout issue. */
$now = current_time('timestamp');
$cron_msgs = array();
$notifications = $arm_manage_communication->arm_get_communication_messages_by('message_type', 'before_dripped_content_available');
$all_drip_rules = $wpdb->get_results("SELECT * FROM `" . $ARMember->tbl_arm_drip_rules . "` ORDER BY `arm_rule_id` DESC", ARRAY_A); //phpcs:ignore --Reason $ARMember->tbl_arm_drip_rules is a a table
$dripRulesMembers = array();
if (!empty($notifications) && !empty($all_drip_rules)) {
foreach ($notifications as $message) {
$period_unit = $message->arm_message_period_unit;
$period_type = $message->arm_message_period_type;
$message_plans = (!empty($message->arm_message_subscription)) ? explode(',', $message->arm_message_subscription) : array();
if (!empty($all_drip_rules)) {
foreach ($all_drip_rules as $dr) {
$ruleID = $dr['arm_rule_id'];
$dripAllowMembers = $arm_drip_rules->arm_get_members_for_before_dripped_reminder($ruleID, $period_type, $period_unit);
$dripRulesMembers[$ruleID] = $dripAllowMembers;
}
}
if (empty($dripRulesMembers)) {
continue;
}
$planArray = array();
if (empty($message_plans)) {
$table = $ARMember->tbl_arm_subscription_plans;
$all_plans = $wpdb->get_results("SELECT `arm_subscription_plan_id` FROM `{$table}` "); //phpcs:ignore --Reason Query without where clause so need to skip
if (!empty($all_plans)) {
foreach ($all_plans as $plan) {
$plan_id = $plan->arm_subscription_plan_id;
$planArray[] = $plan_id;
}
}
} else {
$planArray = $message_plans;
}
if (!empty($planArray)) {
foreach ($planArray as $plan_id) {
$plan_name = $arm_subscription_plans->arm_get_plan_name_by_id($plan_id);
foreach ($dripRulesMembers as $rule_id => $members) {
foreach ($members as $uID => $member) {
$user_id = $member['user_id'];
$user_email = $member['user_email'];
$arm_item_id = $member['arm_item_id'];
if (!empty($member['plan_array'])) {
foreach ($member['plan_array'] as $member_plan_array) {
if ($member_plan_array['plan_id'] == $plan_id) {
$memberStatus = arm_get_member_status($user_id);
$planData = get_user_meta($user_id, 'arm_user_plan_' . $plan_id, true);
$alreadysentmsgs = $planData['arm_sent_msgs'];
$alreadysentmsgs = (!empty($alreadysentmsgs)) ? $alreadysentmsgs : array();
if (!in_array('before_dripped_content_' . $message->arm_message_id . '_' . $rule_id, $alreadysentmsgs)) {
$ARM_MESSAGE_DRIP_CONTENT_URL = "";
if($arm_item_id > 0) {
$ARM_MESSAGE_DRIP_CONTENT_URL = get_permalink($member['arm_item_id']);
}
$mail_additional_details = array(
"ARM_MESSAGE_DRIP_CONTENT_URL" => $ARM_MESSAGE_DRIP_CONTENT_URL
);
$notify = $arm_manage_communication->arm_common_send_email($message,$user_email,$user_id,$plan_id,'',array(),$mail_additional_details);
$arm_now = $now . '_'.rand();
$alreadysentmsgs[$arm_now] = 'before_dripped_content_' . $message->arm_message_id . '_' . $rule_id;
$planData['arm_sent_msgs'] = $alreadysentmsgs;
update_user_meta($user_id, 'arm_user_plan_' . $plan_id, $planData);
if ($notify) {
/* Update User meta for notification type */
$cron_msgs[$user_id] = esc_html__("Mail successfully sent to", 'ARMember') . " " . $user_id . " " . esc_html__("for before dripped content available.", 'ARMember') . "({$plan_name})";
} else {
$cron_msgs[$user_id] = esc_html__("There is an error in sending mail to", 'ARMember') . " " . $user_id . " " . esc_html__("for before dripped content available.", 'ARMember') . "({$plan_name})";
}
if ($notify) {
$cron_msgs['admin_mail_for_' . $user_id] = esc_html__("Mail successfully sent to admin", 'ARMember') . " for " . $user_id . " " . esc_html__("for before dripped content available.", 'ARMember') . "({$plan_name})";
} else {
$cron_msgs['admin_mail_for_' . $user_id] = esc_html__("There is an error in sending mail to admin", 'ARMember') . " for " . $user_id . " " . esc_html__("for before dripped content available.", 'ARMember') . "({$plan_name})";
}
do_action('arm_general_log_entry', 'cron', 'dripped content available and email', 'armember', 'user_id='.$user_id.', plan='.$plan_id.', rule='.$rule_id.', msg='.$cron_msgs[$user_id].', notify='.$notify);
} else {
$cron_msgs[$user_id] = esc_html__("Mail successfully sent to", 'ARMember') . " " . $user_id . " " . esc_html__("for before dripped content available.", 'ARMember') . "({$plan_name})";
}
}
}
}
} /* End Foreach Loop `($users as $usr)` */
}
}
}
} /* End Foreach Loop `($notifications as $message)` */
} /* End `(!empty($notifications))` */
if (!empty($cron_msgs)) {
do_action('arm_cron_before_dripped_content_available', $cron_msgs);
}
}
}
/**
* For Trial Period Finished on Today Process
*/
function arm_handle_trial_finished_func() {
global $wp, $wpdb, $ARMember, $arm_global_settings, $arm_subscription_plans, $arm_manage_communication;
set_time_limit(0); /* Preventing timeout issue. */
$now = current_time('timestamp');
$eod_time = strtotime(date('Y-m-d 23:59:59', $now));
$cron_msgs = array();
$args = array(
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'arm_user_plan_ids',
'value' => '',
'compare' => '!='
),
array(
'key' => 'arm_user_plan_ids',
'value' => 'a:0:{}',
'compare' => '!='
),
)
);
$trialUsers = get_users($args);
if (!empty($trialUsers)) {
foreach ($trialUsers as $usr) {
$memberStatus = arm_get_member_status($usr->ID);
$plan_ids = get_user_meta($usr->ID, 'arm_user_plan_ids', true);
if (!empty($plan_ids) && is_array($plan_ids)) {
foreach ($plan_ids as $plan_id) {
$planData = get_user_meta($usr->ID, 'arm_user_plan_' . $plan_id, true);
if (!empty($planData) && is_array($planData)) {
$is_plan_trial = isset($planData['arm_is_trial_plan']) ? $planData['arm_is_trial_plan'] : 0;
$expireTime = isset($planData['arm_trial_end']) ? $planData['arm_trial_end'] : '';
if ($expireTime <= $eod_time && $is_plan_trial == '1') {
$plan_name = $arm_subscription_plans->arm_get_plan_name_by_id($plan_id);
/* Send Notification Mail */
$alreadysentmsgs = $planData['arm_sent_msgs'];
$alreadysentmsgs = (!empty($alreadysentmsgs)) ? $alreadysentmsgs : array();
if (!in_array('trial_finished', $alreadysentmsgs)) {
$notify = $arm_manage_communication->membership_communication_mail('trial_finished', $usr->ID, $plan_id);
$planData['arm_is_trial_plan'] = 0;
update_user_meta($usr->ID, 'arm_user_plan_' . $plan_id, $planData);
if ($notify) {
/* Update User meta for notification type */
$arm_now = $now . '_'.rand();
$alreadysentmsgs[$arm_now] = 'trial_finished';
$planData['arm_sent_msgs'] = $alreadysentmsgs;
update_user_meta($usr->ID, 'arm_user_plan_' . $plan_id, $planData);
$cron_msgs[$usr->ID] = esc_html__("Mail successfully sent to", 'ARMember') . " " . $usr->ID . " " . esc_html__("for trial period finished.", 'ARMember') . "({$plan_name})";
} else {
$cron_msgs[$usr->ID] = esc_html__("There is an error in sending mail to", 'ARMember') . " " . $usr->ID . " " . esc_html__("for trial period finished.", 'ARMember') . "({$plan_name})";
}
do_action('arm_general_log_entry', 'cron', 'trial finished email check email', 'armember', 'user_id='.$usr->ID.', plan='.$plan_id.', expireTime='.$expireTime.', msg='.$cron_msgs[$usr->ID].', notify='.$notify);
} else {
$cron_msgs[$usr->ID] = esc_html__("Mail successfully sent to", 'ARMember') . " " . $usr->ID . " " . esc_html__("for trial period finished.", 'ARMember') . "({$plan_name})";
}
}
}
}
}
}
}
if (!empty($cron_msgs)) {
do_action('arm_cron_trial_finished', $cron_msgs);
}
}
function arm_handle_renewal_reminder_of_subscription_func() {
global $wp, $wpdb, $ARMember, $arm_global_settings, $arm_subscription_plans, $arm_manage_communication;
set_time_limit(0);
$now = current_time('timestamp');
$cron_msgs = array();
$notifications = $arm_manage_communication->arm_get_communication_messages_by('message_type', 'manual_subscription_reminder');
$notifications = $arm_manage_communication->arm_get_communication_messages_sorted($notifications);
if (!empty($notifications)) {
foreach ($notifications as $message_key => $message) {
$period_unit = $message->arm_message_period_unit;
$period_type = $message->arm_message_period_type;
$endtime = strtotime("+$period_unit Days", $now);
switch (strtolower($period_type)) {
case 'd':
case 'day':
case 'days':
$endtime = strtotime("+$period_unit Days", $now);
break;
case 'w':
case 'week':
case 'weeks':
$endtime = strtotime("+$period_unit Weeks", $now);
break;
case 'm':
case 'month':
case 'months':
$endtime = strtotime("+$period_unit Months", $now);
break;
case 'y':
case 'year':
case 'years':
$endtime = strtotime("+$period_unit Years", $now);
break;
default:
break;
}
$endtime_start = strtotime(date('Y-m-d 00:00:00', $endtime));
$endtime_end = strtotime(date('Y-m-d 23:59:59', $endtime));
$message_plans = (!empty($message->arm_message_subscription)) ? explode(',', $message->arm_message_subscription) : array();
$planArray = array();
if (empty($message_plans)) {
$table = $ARMember->tbl_arm_subscription_plans;
$all_plans = $wpdb->get_results($wpdb->prepare("SELECT `arm_subscription_plan_id` FROM `{$table}` WHERE `arm_subscription_plan_type` != %s AND `arm_subscription_plan_type` != %s", 'free', 'paid_infinite')); //phpcs:ignore --Reason $table is a table name
if (!empty($all_plans)) {
foreach ($all_plans as $plan) {
$plan_id = $plan->arm_subscription_plan_id;
$planArray[] = $plan_id;
}
}
} else {
$planArray = $message_plans;
}
if (!empty($planArray)) {
foreach ($planArray as $plan_id) {
$planObj = new ARM_Plan($plan_id);
if (!$planObj->is_recurring()) {
continue;
}
$this->arm_send_mail_for_subsciption_expire_reminder($message, $plan_id, $endtime_start, $endtime_end, $now, $notifications, $message_key);
}
}
}
}
if (!empty($cron_msgs)) {
do_action('arm_cron_before_send_renew_subscption', $cron_msgs);
}
}
function arm_send_mail_for_subsciption_expire_reminder($message, $arm_plan_id, $endtime_start, $endtime_end, $now, $notifications=array(), $message_key=0) {
global $wp, $wpdb, $ARMember, $arm_manage_communication, $arm_global_settings, $arm_subscription_plans;
$plan_name = $arm_subscription_plans->arm_get_plan_name_by_id($arm_plan_id);
$args = array(
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'arm_user_plan_ids',
'value' => '',
'compare' => '!='
),
array(
'key' => 'arm_user_plan_ids',
'value' => 'a:0:{}',
'compare' => '!='
),
)
);
$users = get_users($args);
if (!empty($users)) {
foreach ($users as $user) {
$memberStatus = arm_get_member_status($user->ID);
$plan_ids = get_user_meta($user->ID, 'arm_user_plan_ids', true);
if (!empty($plan_ids) && is_array($plan_ids)) {
foreach ($plan_ids as $plan_id) {
if($arm_plan_id==$plan_id)
{
$planData = get_user_meta($user->ID, 'arm_user_plan_' . $plan_id, true);
if (!empty($planData)) {
$arm_next_due_payment = $planData['arm_next_due_payment'];
$payment_mode = $planData['arm_payment_mode'];
if ($payment_mode == 'auto_debit_subscription') {
continue;
}
if (!empty($arm_next_due_payment)) {
if ($arm_next_due_payment > $now && $arm_next_due_payment <= $endtime_end) {
$alreadysentmsgs = $planData['arm_sent_msgs'];
$alreadysentmsgs = (!empty($alreadysentmsgs)) ? $alreadysentmsgs : array();
$arm_user_complete_recurring_meta = $planData['arm_completed_recurring'];
$arm_user_complete_recurring = isset($arm_user_complete_recurring_meta) ? $arm_user_complete_recurring_meta : 0;
if (!in_array('manual_subscription_reminder_' . $message->arm_message_id . '_' . $arm_user_complete_recurring, $alreadysentmsgs)) {
$send_mail = $arm_manage_communication->arm_common_send_email($message,$user->data->user_email,$user->ID,$plan_id);
if ($send_mail) {
/* Update User meta for notification type */
$alreadysentmsgs[] = 'manual_subscription_reminder_' . $message->arm_message_id . '_' . $arm_user_complete_recurring;
for ($i=0; $i<count($notifications); $i++) {
$arm_message_period_unit = $notifications[$i]->arm_message_period_unit;
if(!empty($arm_message_period_unit))
{
$endtime_chk = strtotime("+$arm_message_period_unit Days", $now);
if ($arm_next_due_payment <= $endtime_chk) {
if(!in_array('manual_subscription_reminder_' . $notifications[$i]->arm_message_id . '_' . $arm_user_complete_recurring, $alreadysentmsgs))
{
$alreadysentmsgs[] = 'manual_subscription_reminder_' . $notifications[$i]->arm_message_id . '_' . $arm_user_complete_recurring;
}
}
}
}
$planData['arm_sent_msgs'] = $alreadysentmsgs;
update_user_meta($user->ID, 'arm_user_plan_' . $plan_id, $planData);
$cron_msgs[$user->ID] = esc_html__("Mail successfully sent to", 'ARMember') . " " . $user->ID . " " . esc_html__("for semi automatic subscription reminder.", 'ARMember') . "({$plan_name})";
} else {
$cron_msgs[$user->ID] = esc_html__("There is an error in sending mail to", 'ARMember') . " " . $user->ID . " " . esc_html__("for semi automatic subscription reminder.", 'ARMember') . "({$plan_name})";
}
if ($send_mail) {
$cron_msgs['admin_mail_for_' . $user->ID] = esc_html__("Mail successfully sent to admin", 'ARMember') . " for " . $user->ID . " " . esc_html__("for semi automatic subscription reminder.", 'ARMember') . "({$plan_name})";
} else {
$cron_msgs['admin_mail_for_' . $user->ID] = esc_html__("There is an error in sending mail to admin", 'ARMember') . " for " . $user->ID . " " . esc_html__("for semi automatic subscription reminder.", 'ARMember') . "({$plan_name})";
}
do_action('arm_general_log_entry', 'cron', 'before subscription expire reminder email sent', 'armember', 'user_id='.$user->ID.', plan='.$plan_id.', next due payment='.$arm_next_due_payment.', sentmsg='.maybe_serialize($alreadysentmsgs).', msg='.$cron_msgs[$user->ID].', notify='.$send_mail );
} else {
$cron_msgs[$user->ID] = esc_html__("Mail successfully sent to", 'ARMember') . " " . $user->ID . " " . esc_html__("for semi automatic subscription reminder.", 'ARMember') . "({$plan_name})";
}
}
}
}
}
}
}
}
}
}
//Repute Log Before Automatic Subscription Payment Due Code Start
function arm_handle_renewal_reminder_of_automatic_subscription_func() {
global $wp, $wpdb, $ARMember, $arm_global_settings, $arm_subscription_plans, $arm_manage_communication;
set_time_limit(0);
$now = current_time('timestamp');
$cron_msgs = array();
$notifications = $arm_manage_communication->arm_get_communication_messages_by('message_type', 'automatic_subscription_reminder');
$notifications = $arm_manage_communication->arm_get_communication_messages_sorted($notifications);
if (!empty($notifications)) {
foreach ($notifications as $message_key => $message) {
$period_unit = $message->arm_message_period_unit;
$period_type = $message->arm_message_period_type;
$endtime = strtotime("+$period_unit Days", $now);
switch (strtolower($period_type)) {
case 'd':
case 'day':
case 'days':
$endtime = strtotime("+$period_unit Days", $now);
break;
case 'w':
case 'week':
case 'weeks':
$endtime = strtotime("+$period_unit Weeks", $now);
break;
case 'm':
case 'month':
case 'months':
$endtime = strtotime("+$period_unit Months", $now);
break;
case 'y':
case 'year':
case 'years':
$endtime = strtotime("+$period_unit Years", $now);
break;
default:
break;
}
$endtime_start = strtotime(date('Y-m-d 00:00:00', $endtime));
$endtime_end = strtotime(date('Y-m-d 23:59:59', $endtime));
$message_plans = (!empty($message->arm_message_subscription)) ? explode(',', $message->arm_message_subscription) : array();
$planArray = array();
if (empty($message_plans)) {
$table = $ARMember->tbl_arm_subscription_plans;
$all_plans = $wpdb->get_results($wpdb->prepare("SELECT `arm_subscription_plan_id` FROM `{$table}` WHERE `arm_subscription_plan_type` != %s AND `arm_subscription_plan_type` != %s", 'free', 'paid_infinite')); //phpcs:ignore --Reason $table is a table name
if (!empty($all_plans)) {
foreach ($all_plans as $plan) {
$plan_id = $plan->arm_subscription_plan_id;
$planArray[] = $plan_id;
}
}
} else {
$planArray = $message_plans;
}
if (!empty($planArray)) {
foreach ($planArray as $plan_id) {
$planObj = new ARM_Plan($plan_id);
if (!$planObj->is_recurring()) {
continue;
}
$this->arm_send_mail_for_automatic_subsciption_expire_reminder($message, $plan_id, $endtime_start, $endtime_end, $now, $notifications, $message_key);
}
}
}
}
if (!empty($cron_msgs)) {
do_action('arm_cron_before_send_renew_subscption', $cron_msgs);
}
}
function arm_send_mail_for_automatic_subsciption_expire_reminder($message, $arm_plan_id, $endtime_start, $endtime_end, $now, $notifications=array(), $message_key=0) {
global $wp, $wpdb, $ARMember, $arm_manage_communication, $arm_global_settings, $arm_subscription_plans;
$plan_name = $arm_subscription_plans->arm_get_plan_name_by_id($arm_plan_id);
$args = array(
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'arm_user_plan_ids',
'value' => '',
'compare' => '!='
),
array(
'key' => 'arm_user_plan_ids',
'value' => 'a:0:{}',
'compare' => '!='
),
)
);
$users = get_users($args);
if (!empty($users)) {
foreach ($users as $user) {
$memberStatus = arm_get_member_status($user->ID);
$plan_ids = get_user_meta($user->ID, 'arm_user_plan_ids', true);
if (!empty($plan_ids) && is_array($plan_ids)) {
foreach ($plan_ids as $plan_id) {
if($arm_plan_id==$plan_id)
{
$planData = get_user_meta($user->ID, 'arm_user_plan_' . $plan_id, true);
if (!empty($planData)) {
$arm_next_due_payment = $planData['arm_next_due_payment'];
$payment_mode = $planData['arm_payment_mode'];
if ($payment_mode != 'auto_debit_subscription') {
continue;
}
if (!empty($arm_next_due_payment)) {
if ($arm_next_due_payment > $now && $arm_next_due_payment <= $endtime_end) {
$alreadysentmsgs = $planData['arm_sent_msgs'];
$alreadysentmsgs = (!empty($alreadysentmsgs)) ? $alreadysentmsgs : array();
$arm_user_complete_recurring_meta = $planData['arm_completed_recurring'];
$arm_user_complete_recurring = isset($arm_user_complete_recurring_meta) ? $arm_user_complete_recurring_meta : 0;
if (!in_array('automatic_subscription_reminder_' . $message->arm_message_id . '_' . $arm_user_complete_recurring, $alreadysentmsgs)) {
$notify = $arm_manage_communication->arm_common_send_email($message,$user->data->user_email,$user->ID,$plan_id);
if ($notify) {
/* Update User meta for notification type */
$alreadysentmsgs[] = 'automatic_subscription_reminder_' . $message->arm_message_id . '_' . $arm_user_complete_recurring;
for ($i=0; $i<count($notifications); $i++) {
$arm_message_period_unit = $notifications[$i]->arm_message_period_unit;
if(!empty($arm_message_period_unit))
{
$endtime_chk = strtotime("+$arm_message_period_unit Days", $now);
if ($arm_next_due_payment <= $endtime_chk) {
if(!in_array('automatic_subscription_reminder_' . $notifications[$i]->arm_message_id . '_' . $arm_user_complete_recurring, $alreadysentmsgs))
{
$alreadysentmsgs[] = 'automatic_subscription_reminder_' . $notifications[$i]->arm_message_id . '_' . $arm_user_complete_recurring;
}
}
}
}
$planData['arm_sent_msgs'] = $alreadysentmsgs;
update_user_meta($user->ID, 'arm_user_plan_' . $plan_id, $planData);
$cron_msgs[$user->ID] = esc_html__("Mail successfully sent to", 'ARMember') . " " . $user->ID . " " . esc_html__("for before automatic subscription due.", 'ARMember') . "({$plan_name})";
} else {
$cron_msgs[$user->ID] = esc_html__("There is an error in sending mail to", 'ARMember') . " " . $user->ID . " " . esc_html__("for before automatic subscription due.", 'ARMember') . "({$plan_name})";
}
if ($notify) {
$cron_msgs['admin_mail_for_' . $user->ID] = esc_html__("Mail successfully sent to admin", 'ARMember') . " for " . $user->ID . " " . esc_html__("for before automatic subscription due.", 'ARMember') . "({$plan_name})";
} else {
$cron_msgs['admin_mail_for_' . $user->ID] = esc_html__("There is an error in sending mail to admin", 'ARMember') . " for " . $user->ID . " " . esc_html__("for before automatic subscription due.", 'ARMember') . "({$plan_name})";
}
do_action('arm_general_log_entry', 'cron', 'automatic subscription expire and email sent', 'armember', 'user_id='.$user->ID.', plan='.$plan_id.', next due payment='.$arm_next_due_payment.', sentmsg='.maybe_serialize($alreadysentmsgs).', msg='.$cron_msgs[$user->ID].', notify='.$notify);
} else {
$cron_msgs[$user->ID] = esc_html__("Mail successfully sent to", 'ARMember') . " " . $user->ID . " " . esc_html__("for before automatic subscription due.", 'ARMember') . "({$plan_name})";
}
}
}
}
}
}
}
}
}
}
function arm_update_user_achievements_func() {
global $wp, $wpdb, $ARMember, $arm_global_settings, $arm_subscription_plans, $arm_members_badges;
set_time_limit(0); /* Preventing timeout issue. */
$now = current_time('timestamp');
$cron_msgs = array();
$arm_members_badges->arm_add_user_achieve_by_cron();
}
/**
* Send anonymous data through cron
*
* @return void
*/
function armember_send_anonymous_data_cron_func() {
global $ARMember, $wpdb, $arm_global_settings, $wp_version,$arm_payment_gateways, $arm_social_feature;
$general_settings = isset($arm_global_settings->global_settings) ? $arm_global_settings->global_settings : array();
$armember_send_anonymous_data = isset($general_settings['arm_anonymous_data']) ? $general_settings['arm_anonymous_data'] : 0;
if(!empty($armember_send_anonymous_data))
{
$armember_total_plans = $armember_total_members = $armember_total_payment_transactions = $armember_assign_plan_from_backend = $armember_total_register_custom_fields = 0;
$activated_modules = $inactivated_modules = $active_plugins_arr = $armember_gateway_wise_transactions = $inactive_plugin_arr = array();
$armember_lite_version = $armember_lite_installation_date = $armember_pro_version = $armember_pro_installation_date = $home_url = $admin_url = $site_timezone = $site_locale = '';
$armember_lite_version = get_option('armlite_version');
$armember_lite_version = !empty($armember_lite_version) ? $armember_lite_version : '';
$armember_lite_installation_date = get_option('armember_lite_install_date');
$armember_lite_installation_date = !empty($armember_lite_installation_date) ? $armember_lite_installation_date : '';
$armember_pro_version = get_option('arm_version');
$armember_pro_version = !empty($armember_pro_version) ? $armember_pro_version : '';
$armember_pro_installation_date = get_option('armember_pro_install_date');
$armember_pro_installation_date = !empty($armember_pro_installation_date) ? $armember_pro_installation_date : '';
$home_url = home_url();
$admin_url = admin_url();
$site_locale = get_locale();
$site_locale = !empty($site_locale) ? $site_locale : '';
$site_timezone = wp_timezone_string();
$tbl_armember_members = $ARMember->tbl_arm_members;
$tbl_armember_payment_log = $ARMember->tbl_arm_payment_log;
$server_information = isset( $_SERVER['SERVER_SOFTWARE'] ) ? sanitize_text_field($_SERVER['SERVER_SOFTWARE']) : ''; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash
$my_theme = wp_get_theme();
$theme_data = $my_theme->get('Name').' ('.$my_theme->get('Version').' )';
$is_multisite = is_multisite() ? 'Yes' : 'NO';
$plugin_list = get_plugins();
$active_plugins = get_option('active_plugins');
if(!empty($active_plugins))
{
foreach ( $plugin_list as $key => $plugin_detail ) {
$is_active = in_array($key, $active_plugins);
if ($is_active == 1 ) {
$name = substr($key, 0, strpos($key, '/'));
$active_plugins_arr[] = array(
$plugin_detail['Name'] => $plugin_detail['Version']
);
} else {
$inactive_plugin_arr[] = array(
$plugin_detail['Name'] => $plugin_detail['Version']
);
}
}
}
$armember_currency = $arm_payment_gateways->arm_get_global_currency();
$armember_module = array(
'arm_is_social_feature'=>'Social Feature',
'arm_is_opt_ins_feature'=>'Opts Ins',
'arm_is_drip_content_feature' => 'Drip Content',
'arm_is_social_login_feature' => 'Social Connect',
'arm_is_pay_per_post_feature' => 'Pay Per Post',
'arm_is_coupon_feature'=>'Coupon',
'arm_is_invoice_tax_feature' => 'Invoice and Tax',
'arm_is_user_private_content_feature'=>'User Private Content',
'arm_is_multiple_membership_feature' => 'Multiple Membership',
'arm_is_gutenberg_block_restriction_feature' => 'Gutenberg Block Restriction',
'arm_is_api_service_feature'=>'API Services',
'arm_is_buddypress_feature' => 'Buddypress/Buddyboss Integration',
'arm_is_woocommerce_feature'=> 'Woocommerce Integration',
'arm_is_mycred_feature' => 'myCRED Integration',
'arm_is_plan_limit_feature' => 'Membership Limit',
'arm_is_beaver_builder_restriction_feature' => 'Beaver Builder Restriction',
'arm_is_divi_builder_restriction_feature' => 'DIVI Builder Restriction',
'arm_is_wpbakery_page_builder_restriction_feature' => 'WPBakry Page Builder Restriction',
'arm_is_fusion_builder_restriction_feature' => 'Fusion Builder Restriction',
'arm_is_oxygen_builder_restriction_feature' => 'Oxygen Builder Restriction',
'arm_is_siteorigin_builder_restriction_feature' => 'SiteOrigin Builder Restriction',
'arm_is_bricks_builder_restriction_feature' => 'Bricks Builder Restriction',
'arm_is_pro_ration_feature' => 'Pro-Rata ',
);
foreach($armember_module as $key => $value) {
$is_module_active = get_option($key);
if(!empty($is_module_active)) {
$activated_modules[] = $value;
} else {
$inactivated_modules[] = $value;
}
}
$armember_addons = $arm_social_feature->addons_page();
if ($armember_addons != "") {
$resp = explode("|^^|", $armember_addons);
if ($resp[0] == 1) {
$myplugarr = array();
$myplugarr = unserialize(base64_decode($resp[1]));
$is_active = 0;
}
}
$active_addon_list = $inactive_addon_list = array();
foreach($myplugarr as $arm_armember_addon_key => $armember_addon_val)
{
if(!empty($armember_addon_val['plugin_installer'])) {
if(file_exists( WP_PLUGIN_DIR . '/'.$armember_addon_val['plugin_installer'])) {
$is_addon_active = is_plugin_active($armember_addon_val['plugin_installer']);
if($is_addon_active) {
$active_addon_list[$armember_addon_val['short_name']] = $armember_addon_val['plugin_version'];
} else {
$inactive_addon_list[$armember_addon_val['short_name']] = $armember_addon_val['plugin_version'];
}
}
}
}
$armember_total_members = $wpdb->get_var( "SELECT count(arm_member_id) FROM {$ARMember->tbl_arm_members}"); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared --Reason: $tbl_arm_members is a table name. false alarm
$armember_total_payment_transactions = $wpdb->get_var( "SELECT count(arm_log_id) FROM {$ARMember->tbl_arm_payment_log}"); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared --Reason: $ARMember->tbl_arm_payment_log is a table name. false alarm
$armember_total_transactions = $wpdb->get_results( "SELECT count(arm_log_id) as total, arm_payment_gateway FROM {$ARMember->tbl_arm_payment_log} GROUP BY arm_payment_gateway",ARRAY_A); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared --Reason: $tbl_arm_payment_log is a table name. false alarm
$armember_total_plans = $wpdb->get_var( "SELECT count(arm_subscription_plan_id) FROM {$ARMember->tbl_arm_subscription_plans}"); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared --Reason: $tbl_arm_subscription_plans is a table name. false alarm
if(!empty($armember_total_transactions)) {
foreach($armember_total_transactions as $key => $value) {
$armember_gateway_wise_transactions[$value['arm_payment_gateway']] = $value['total'];
}
}
$presetFormFields = get_option('arm_preset_form_fields', '');
$dbFormFields = maybe_unserialize($presetFormFields);
$armember_total_register_custom_fields = isset($dbFormFields['other']) ? count($dbFormFields['other']) : 0;
$total_wp_users = count_users();
$total_wp_users = $total_wp_users['total_users'];
$armember_anonymous_data = array(
'php_version' => phpversion(),
'armember_lite_version' => $armember_lite_version,
'armember_lite_installation_date' => $armember_lite_installation_date,
'armember_pro_version' => $armember_pro_version,
'armember_pro_installation_date' => $armember_pro_installation_date,
'wp_version' => $wp_version,
'server_information' => $server_information,
'is_multisite' => $is_multisite,
'theme_data' => $theme_data,
'home_url' => $home_url,
'admin_url' => $admin_url,
'active_plugin_list' => wp_json_encode($active_plugins_arr),
'inactivate_plugin_list' => wp_json_encode($inactive_plugin_arr),
'site_locale' => $site_locale,
'site_timezone' => $site_timezone,
'armember_currency' => $armember_currency,
'activated_modules' => wp_json_encode($activated_modules),
'inactive_modules' => wp_json_encode($inactivated_modules),
'activated_addons' => wp_json_encode($active_addon_list),
'inactive_addons' => wp_json_encode($inactive_addon_list),
'armember_total_members' => $armember_total_members,
'armember_total_plans' => $armember_total_plans,
'total_wp_users' => $total_wp_users,
'armember_total_register_custom_fields' => $armember_total_register_custom_fields,
'total_payment_transactions' => $armember_total_payment_transactions,
'payment_gateway_wise_transaction' => wp_json_encode($armember_gateway_wise_transactions),
);
$headers = array('user-agent' => $_SERVER['HTTP_USER_AGENT']); //phpcs:ignore --Reason: $_SERVER is a superglobal variable.
$url = 'https://www.armemberplugin.com/armember_lite_version/arm_tracking_usage.php';
$response = wp_remote_post(
$url,
array(
'timeout' => 500,
'body' => array( 'arm_anonymous_data' => wp_json_encode($armember_anonymous_data), 'headers' => $headers ),
)
);
}
}
function arm_clear_cron($name = '') {
global $ARMember;
if (!empty($name)) {
wp_clear_scheduled_hook($name);
}
}
function arm_get_cron_hook_names() {
$cron_array = array(
'arm_handle_change_user_plan',
'arm_handle_expire_subscription',
'arm_handle_expire_infinite_subscription',
'arm_handle_before_expire_subscription',
'arm_handle_before_dripped_content_available',
'arm_handle_renewal_reminder_of_subscription',
'arm_handle_trial_finished',
'arm_update_user_achievements',
'arm_handle_failed_login_log_data_delete',
'armember_send_anonymous_data_cron'
);
$cron_array = apply_filters('arm_filter_cron_hook_name_outside', $cron_array);
$cron_array[] = 'arm_handle_failed_payment_for_subscription_plan';
$cron_array[] = 'arm_handle_failed_payment_for_auto_subscription';
$cron_array = apply_filters('arm_filter_cron_hook_name_after_outside', $cron_array);
return $cron_array;
}
}
}
global $arm_crons;
$arm_crons = new ARM_crons();