function _cancel_membership($user_id, $redirect = false)
 {
     // system
     $system_obj = mgm_get_class('system');
     $s_packs = mgm_get_class('subscription_packs');
     $dge = bool_from_yn($system_obj->get_setting('disable_gateway_emails'));
     $dpne = bool_from_yn($system_obj->get_setting('disable_payment_notify_emails'));
     //issue #1521
     $is_admin = is_super_admin() ? true : false;
     // find user
     $user = get_userdata($user_id);
     $member = mgm_get_member($user_id);
     // multiple membesrhip level update:
     $multiple_update = false;
     // check
     if (isset($_POST['membership_type']) && $member->membership_type != $_POST['membership_type']) {
         $multiple_update = true;
         $member = mgm_get_member_another_purchase($user_id, $_POST['membership_type']);
     }
     // get pack
     if ($member->pack_id) {
         $subs_pack = $s_packs->get_pack($member->pack_id);
     } else {
         $subs_pack = $s_packs->validate_pack($member->amount, $member->duration, $member->duration_type, $member->membership_type);
     }
     // reset payment info
     $member->payment_info->txn_type = 'subscription_cancel';
     // types
     $duration_exprs = $s_packs->get_duration_exprs();
     // default expire date
     $expire_date = $member->expire_date;
     // if lifetime:
     if ($member->duration_type == 'l') {
         $expire_date = date('Y-m-d');
     }
     // if trial on
     if (isset($subs_pack['trial_on']) && (bool) $subs_pack['trial_on'] == true && isset($duration_exprs[$subs_pack['trial_duration_type']])) {
         // if cancel data is before trial end, set cancel on trial expire_date
         $trial_expire_date = strtotime('+' . $subs_pack['trial_duration'] . ' ' . $duration_exprs[$subs_pack['trial_duration_type']], $member->join_date);
         // if lower
         if (time() < $trial_expire_date) {
             $expire_date = date('Y-m-d', $trial_expire_date);
         }
     }
     // transaction_id
     $trans_id = $member->transaction_id;
     // if today
     if ($expire_date == date('Y-m-d')) {
         // status
         $new_status = MGM_STATUS_CANCELLED;
         $new_status_str = __('Subscription cancelled', 'mgm');
         // set
         $member->status = $new_status;
         $member->status_str = $new_status_str;
         $member->expire_date = date('Y-m-d');
         // reassign expiry membership pack if exists: issue#: 535
         $member = apply_filters('mgm_reassign_member_subscription', $user_id, $member, 'CANCEL', true);
     } else {
         // date
         $date_format = mgm_get_date_format('date_format');
         // status
         $new_status = MGM_STATUS_AWAITING_CANCEL;
         $new_status_str = sprintf(__('Subscription awaiting cancellation on %s', 'mgm'), date($date_format, strtotime($expire_date)));
         // set
         $member->status = $new_status;
         $member->status_str = $new_status_str;
         // set reset date
         $member->status_reset_on = $expire_date;
         $member->status_reset_as = MGM_STATUS_CANCELLED;
     }
     // multiple memberhip level update:
     if ($multiple_update) {
         mgm_save_another_membership_fields($member, $user_id);
     } else {
         $member->save();
     }
     // transaction status
     mgm_update_transaction_status($trans_id, $new_status, $new_status_str);
     // send email notification to client
     $blogname = get_option('blogname');
     // notify user
     if (!$dpne) {
         // notify user
         mgm_notify_user_membership_cancellation($blogname, $user, $member, $system_obj, $new_status, $membership_type);
     }
     // notify admin
     if (!$dge) {
         // notify admin
         mgm_notify_admin_membership_cancellation($blogname, $user, $member);
     }
     // after cancellation hook
     do_action('mgm_membership_subscription_cancelled', array('user_id' => $user_id));
     // redirect only internal
     if ($redirect) {
         // message
         $lformat = mgm_get_date_format('date_format_long');
         $message = sprintf(__("You have successfully unsubscribed. Your account has been marked for cancellation on %s", "mgm"), $expire_date == date('Y-m-d') ? 'Today' : date($lformat, strtotime($expire_date)));
         //issue #1521
         if ($is_admin) {
             mgm_redirect(add_query_arg(array('user_id' => $user_id, 'unsubscribe_errors' => urlencode($message)), admin_url('user-edit.php')));
         }
         // redirect
         mgm_redirect(mgm_get_custom_url('membership_details', false, array('unsubscribed' => 'true', 'unsubscribe_errors' => urlencode($message))));
     }
 }
/**
 * get payment processed page html
 *
 * @param void
 * @return string
 * @since 1.5
 */
function mgm_get_payment_processed_page_html()
{
    // home url
    $home_url = trailingslashit(get_option('siteurl'));
    // current module
    $module = mgm_request_var('module', '', true);
    // check
    if (!mgm_is_valid_module($module) || empty($module)) {
        // redirect
        mgm_redirect($home_url);
    }
    // init
    $html = '';
    // refresh wait time
    $refresh_wait_time = 5;
    //in seconds
    // redirect url
    $redirect_url = '';
    // redirect
    $do_redirect = true;
    // refresh header for post redirecr
    if (isset($_GET['post_redirect'])) {
        // redirect url
        $redirect_url = strip_tags($_GET['post_redirect']);
    } elseif (isset($_GET['register_redirect'])) {
        // redirect url, if 1/true, redirect to profile, else its register & redirect url
        if ($_GET['register_redirect'] != 1) {
            $redirect_url = strip_tags($_GET['register_redirect']);
        } else {
            // auto login
            $system_obj = mgm_get_class('system');
            //issue# 1392
            $current_user_id = get_current_user_id();
            // check if set
            if ($autologin_redirect_url = $system_obj->get_setting('autologin_redirect_url')) {
                $page_title = '';
                $redirect_url = $autologin_redirect_url;
                //short code support
                if (!empty($current_user_id)) {
                    $user = get_userdata($current_user_id);
                    $redirect_url = str_replace('[username]', $user->user_login, $redirect_url);
                }
            } elseif (mgm_get_user_package_redirect_url($current_user_id) && $current_user_id) {
                $page_title = '';
                $redirect_url = mgm_get_user_package_redirect_url($current_user_id);
            } else {
                $page_title = 'Profile';
                $redirect_url = mgm_get_custom_url('profile');
            }
        }
        // check not logged in, #948 paypal fails to redirect
        if (!is_user_logged_in()) {
            // user login
            if (isset($_GET['trans_ref'])) {
                // re construct redirect url
                $redirect_url = mgm_get_custom_url('login', false, array('trans_ref' => strip_tags($_GET['trans_ref']), 'auto_login' => true, 'redirect_to' => $redirect_url));
            }
        }
    }
    // check and set
    if (!empty($redirect_url) && $do_redirect) {
        // alter
        $redirect_url = apply_filters('mgm_register_redirect', $redirect_url);
        // no headers
        if (!headers_sent()) {
            @header(sprintf('Refresh: %d;url=%s', $refresh_wait_time, $redirect_url));
        } else {
            $html .= sprintf('<script language="javascript">window.setTimeout(function(){window.location.href="%s";}, %d)</script>', $redirect_url, (int) $refresh_wait_time * 5);
        }
    }
    // module object
    $module_object = mgm_get_module($module, 'payment');
    // [domain]/subscribe/?method=payment_processed&module=mgm_paypal&status=success
    // [domain]/subscribe/?method=payment_processed&module=mgm_paypal&status=cancel
    // status and message
    $arr_shortcodes = array('transaction_amount' => '');
    // check
    if (!isset($_GET['status']) || $_GET['status'] == 'success') {
        // mgm_replace_oldlinks_with_tag is a patch for replacing the old link
        $message = $module_object->setting['success_message'] ? mgm_replace_oldlinks_with_tag($module_object->setting['success_message'], 'payment_success_message') : $system_obj->get_template('payment_success_message', array(), true);
        // get price
        if (isset($_GET['trans_ref'])) {
            // tarns
            $_GET['trans_ref'] = mgm_decode_id(strip_tags($_GET['trans_ref']));
            // get transaction data
            $trans = mgm_get_transaction($_GET['trans_ref']);
            // set amount
            if ($trans['module'] == 'manualpay') {
                $arr_shortcodes['transaction_amount'] = $trans['data']['cost'] . ' ' . $trans['data']['currency'];
            }
            // update googe analytics:
            $html .= apply_filters('mgm_payment_processed_page_analytics', $trans);
            // @todo, callback in template function
            // mgm_update_google_analytics($trans);	deprecated, use hook
        }
    } else {
        if (!isset($_GET['status']) || $_GET['status'] == 'cancel') {
            // set message
            $message = __('You have cancelled the transaction.', 'mgm');
        } else {
            // mgm_replace_oldlinks_with_tag is a patch for replacing the old link
            $message = $module_object->setting['failed_message'] ? mgm_replace_oldlinks_with_tag($module_object->setting['failed_message'], 'payment_failed_message') : $system_obj->get_template('payment_failed_message', array(), true);
        }
    }
    // parse short codes:
    // [transaction_amount] = amount paid
    foreach ($arr_shortcodes as $code => $value) {
        $message = str_replace('[' . $code . ']', $value, $message);
    }
    // html
    $html .= mgm_stripslashes_deep(mgm_get_message_template($message));
    // get error
    if (isset($_GET['errors'])) {
        // get errors
        $errors = explode('|', strip_tags($_GET['errors']));
        // html
        $html .= sprintf('<h3> %s </h3><div><ul>', __('Messages', 'mgm'));
        // loop
        foreach ($errors as $error) {
            $html .= sprintf('<li> %s </li>', $error);
        }
        // end
        $html .= '</ul></div>';
    }
    // auto redirect to post purchased
    if (isset($_GET['post_redirect'])) {
        // message
        $m = sprintf(__('You will be automatically redirected to the post you purchased within %d seconds. Please <a href="%s"> click here </a> to go to the page. ', 'mgm'), $refresh_wait_time, strip_tags($_GET['post_redirect']));
        // set
        $html .= sprintf('<b>%s</b>', $m);
    } elseif (isset($_GET['register_redirect'])) {
        // auto login redirect
        // message
        $m = sprintf(__('You will be automatically redirected to your %s page within %d seconds. Please <a href="%s"> click here </a> to go to the page. ', 'mgm'), $_GET['register_redirect'] == 1 ? __($page_title, 'mgm') : __('Post', 'mgm'), $refresh_wait_time, $redirect_url);
        // set
        $html .= sprintf('<b>%s</b>', $m);
    }
    // return
    return apply_filters('mgm_payment_processed_page_html', $html);
}
 /**
  * return process api hook, link back to site after payment is made	
  * Note: as Worldpay Gateway doesn't support custom thankyou url redirection, we make use of resultY.html/resultC.html 
  * template html MC_success/MC_error tags to print thankyou page url. The user will need to click the respective links
  * to get redirected back to the site.
  * Check payment form creation for success/error url and parameters details.  
  *
  */
 function process_return()
 {
     do_action('mgm_print_module_data', $this->module, __FUNCTION__);
     // check and show message
     //if((isset($_POST['rawAuthCode']) && !empty($_POST['rawAuthCode'])) || (isset($_POST['M_custom']) && !empty($_POST['M_custom']))){
     if (isset($_POST['rawAuthCode']) && !empty($_POST['rawAuthCode']) || ($_REQUEST['transtatus'] == 'success' && (isset($_REQUEST['M_custom']) && !empty($_REQUEST['M_custom'])) || isset($_REQUEST['transid']) && !empty($_REQUEST['transid']))) {
         if (isset($_REQUEST['M_custom'])) {
             //not sure M_custom is available on thank you page
             $trans_id = $_REQUEST['M_custom'];
         } elseif (isset($_REQUEST['transid'])) {
             $trans_id = mgm_decode_id($_REQUEST['transid']);
         }
         // process notify, internally called
         if (isset($this->setting['shopper_response']) && bool_from_yn($this->setting['shopper_response'])) {
             // track
             $this->webhook_called_by = 'self';
             // process
             $this->process_notify();
         }
         // redirect as success if not already redirected
         $query_arg = array('status' => 'success', 'trans_ref' => mgm_encode_id($trans_id));
         // is a post redirect?
         $post_redirect = $this->_get_post_redirect($trans_id);
         // set post redirect
         if ($post_redirect !== false) {
             $query_arg['post_redirect'] = $post_redirect;
         }
         // is a register redirect?
         $register_redirect = $this->_auto_login($trans_id);
         // set register redirect
         if ($register_redirect !== false) {
             $query_arg['register_redirect'] = $register_redirect;
         }
         // meta redirect for wp only
         mgm_redirect(add_query_arg($query_arg, $this->_get_thankyou_url()));
     } else {
         // error
         mgm_redirect(add_query_arg(array('status' => 'error', 'errors' => urlencode('WorldPay data error')), $this->_get_thankyou_url()));
     }
 }
 function _cancel_membership($user_id = NULL, $redirect = false)
 {
     // system
     $system_obj = mgm_get_class('system');
     $s_packs = mgm_get_class('subscription_packs');
     $dge = bool_from_yn($system_obj->get_setting('disable_gateway_emails'));
     $dpne = bool_from_yn($system_obj->get_setting('disable_payment_notify_emails'));
     //issue #1521
     $is_admin = is_super_admin() ? true : false;
     // passthrough var
     $alt_tran_id = $this->_get_alternate_transaction_id();
     // get custom field values if not called with user id( internal)
     if (!$user_id) {
         // get passthrough, stop further process if fails to parse
         $custom = $this->_get_transaction_passthrough($alt_tran_id);
         // local var
         extract($custom);
     }
     // user
     $user = get_userdata($user_id);
     $member = mgm_get_member($user_id);
     // multiple membesrhip level update:
     $multiple_update = false;
     // check
     if (isset($_POST['membership_type']) && $member->membership_type != $_POST['membership_type'] || isset($membership_type) && $member->membership_type != $membership_type) {
         $multiple_update = true;
         $member = mgm_get_member_another_purchase($user_id, $_POST['membership_type']);
     }
     // skip if IPN POST for previous subscription:
     if (!empty($alt_tran_id) && !empty($member->transaction_id) && $alt_tran_id != $member->transaction_id) {
         return false;
     }
     // get pack
     if ($member->pack_id) {
         $subs_pack = $s_packs->get_pack($member->pack_id);
     } else {
         $subs_pack = $s_packs->validate_pack($member->amount, $member->duration, $member->duration_type, $member->membership_type);
     }
     // tracking fields module_field => post_field
     $tracking_fields = array('txn_type' => 'message_type', 'subscr_id' => array('order_number', 'sale_id'), 'txn_id' => array('order_number', 'sale_id'));
     // save tracking fields
     $this->_save_tracking_fields($tracking_fields, $member);
     // types
     $duration_exprs = $s_packs->get_duration_exprs();
     // default expire date
     $expire_date = $member->expire_date;
     // if lifetime:
     if ($member->duration_type == 'l') {
         $expire_date = date('Y-m-d');
     }
     // if trial on
     if ($subs_pack['trial_on'] && isset($duration_exprs[$subs_pack['trial_duration_type']])) {
         // if cancel data is before trial end, set cancel on trial expire_date
         $trial_expire_date = strtotime("+{$subs_pack['trial_duration']} {$duration_exprs[$subs_pack['trial_duration_type']]}", $member->join_date);
         // if lower
         if (time() < $trial_expire_date) {
             $expire_date = date('Y-m-d', $trial_expire_date);
         }
     }
     // transaction_id
     $trans_id = $member->transaction_id;
     // if today or set as instant cancel
     if ($expire_date == date('Y-m-d') || $this->setting['subs_cancel'] == 'instant') {
         // status
         $new_status = MGM_STATUS_CANCELLED;
         $new_status_str = __('Subscription cancelled', 'mgm');
         // set
         $member->status = $new_status;
         $member->status_str = $new_status_str;
         $member->expire_date = date('Y-m-d');
         // reassign expiry membership pack if exists: issue#: 535
         $member = apply_filters('mgm_reassign_member_subscription', $user_id, $member, 'CANCEL', true);
     } else {
         // date
         $date_format = mgm_get_date_format('date_format');
         // status
         $new_status = MGM_STATUS_AWAITING_CANCEL;
         $new_status_str = sprintf(__('Subscription awaiting cancellation on %s', 'mgm'), date($date_format, strtotime($expire_date)));
         // set
         $member->status = $new_status;
         $member->status_str = $new_status_str;
         // set reset date
         $member->status_reset_on = $expire_date;
         $member->status_reset_as = MGM_STATUS_CANCELLED;
     }
     // multiple membesrhip level update:
     if ($multiple_update) {
         mgm_save_another_membership_fields($member, $user_id);
     } else {
         $member->save();
     }
     // transaction status
     mgm_update_transaction_status($trans_id, $new_status, $new_status_str);
     // send email notification to client
     $blogname = get_option('blogname');
     // notify user
     if (!$dpne) {
         // notify user
         mgm_notify_user_membership_cancellation($blogname, $user, $member, $system_obj, $new_status, $membership_type);
     }
     // notify admin
     if (!$dge) {
         // notify admin
         mgm_notify_admin_membership_cancellation($blogname, $user, $member);
     }
     // after cancellation hook
     do_action('mgm_membership_subscription_cancelled', array('user_id' => $user_id));
     // redirect only internal
     if ($redirect) {
         // message
         $lformat = mgm_get_date_format('date_format_long');
         $message = sprintf(__("You have successfully unsubscribed. Your account has been marked for cancellation on %s", "mgm"), $expire_date == date('Y-m-d') ? 'Today' : date($lformat, strtotime($expire_date)));
         //issue #1521
         if ($is_admin) {
             mgm_redirect(add_query_arg(array('user_id' => $user_id, 'unsubscribe_errors' => urlencode($message)), admin_url('user-edit.php')));
         }
         // redirect
         mgm_redirect(add_query_arg(array('unsubscribed' => 'true', 'unsubscribe_errors' => urlencode($message)), mgm_get_custom_url('membership_details')));
     }
 }
 function _buy_post()
 {
     global $wpdb;
     // system
     $system_obj = mgm_get_class('system');
     $dge = bool_from_yn($system_obj->get_setting('disable_gateway_emails'));
     $dpne = bool_from_yn($system_obj->get_setting('disable_payment_notify_emails'));
     // passthrough
     $alt_tran_id = $this->_get_alternate_transaction_id();
     // get passthrough, stop further process if fails to parse
     $custom = $this->_get_transaction_passthrough($alt_tran_id);
     // local var
     extract($custom);
     //getting purchase post title and & price - issue #981
     $post_obj = mgm_get_post($post_id);
     $purchase_cost = mgm_convert_to_currency($post_obj->purchase_cost);
     $post = get_post($post_id);
     $post_title = $post->post_title;
     // find user
     //issue #504
     if ($user_id) {
         $user = get_userdata($user_id);
     }
     // errors
     $errors = array();
     $blogname = get_option('blogname');
     $tran_success = false;
     $payment_status = $_POST['Status'];
     switch ($payment_status) {
         case 'OK':
             // status success
             $tran_success = true;
             // status
             $status_str = __('Last payment was successful', 'mgm');
             // emails not for guest
             //issue #504
             if ($user_id) {
                 // subject
                 $subject = $system_obj->get_template('payment_success_email_template_subject', array('blogname' => $blogname), true);
                 // body
                 $message = $system_obj->get_template('payment_success_email_template_body', array('blogname' => $blogname, 'name' => $user->display_name, 'post_title' => $post_title, 'purchase_cost' => $purchase_cost, 'email' => $user->user_email, 'admin_email' => $system_obj->setting['admin_email']), true);
             }
             // transaction id
             $transaction_id = $this->_get_transaction_id();
             // hook args
             $args = array('post_id' => $post_id, 'transaction_id' => $transaction_id);
             // user purchase
             if (isset($user_id) && (int) $user_id > 0) {
                 $args['user_id'] = $user_id;
             } else {
                 // guest purchase
                 $args['guest_token'] = $guest_token;
             }
             // after succesful payment hook
             do_action('mgm_buy_post_transaction_success', $args);
             // backward compatibility
             do_action('mgm_post_purchase_payment_success', $args);
             // new organized name
             break;
         case 'NOTAUTHED':
         case 'INVALID':
         case 'REJECTED':
             // status
             $status_str = __('Last payment was refunded or denied', 'mgm');
             // emails not for guest
             //issue #504
             if ($user_id) {
                 // subject
                 $subject = $system_obj->get_template('payment_failed_email_template_subject', array('blogname' => $blogname), true);
                 // body
                 $message = $system_obj->get_template('payment_failed_email_template_body', array('blogname' => $blogname, 'name' => $user->display_name, 'post_title' => $post_title, 'purchase_cost' => $purchase_cost, 'email' => $user->user_email, 'payment_type' => 'post purchase payment', 'reason' => $status_str, 'admin_email' => $system_obj->setting['admin_email']), true);
             }
             // error
             $errors[] = $status_str;
             break;
         case 'ABORT':
             // status
             $reason = 'Unknown';
             $status_str = sprintf(__('Last payment is pending. Reason: %s', 'mgm'), $reason);
             // emails not for guest
             //issue #504
             if ($user_id) {
                 // subject
                 $subject = $system_obj->get_template('payment_pending_email_template_subject', array('blogname' => $blogname), true);
                 // body
                 $message = $system_obj->get_template('payment_pending_email_template_body', array('blogname' => $blogname, 'name' => $user->display_name, 'post_title' => $post_title, 'purchase_cost' => $purchase_cost, 'email' => $user->user_email, 'reason' => $status_str, 'admin_email' => $system_obj->setting['admin_email']), true);
             }
             // error
             $errors[] = $status_str;
             break;
         default:
             // status
             $status_str = sprintf(__('Last payment status: %s', 'mgm'), $payment_status);
             // emails not for guest
             //issue #504
             if ($user_id) {
                 // subject
                 $subject = $system_obj->get_template('payment_unknown_email_template_subject', array('blogname' => $blogname), true);
                 // body
                 $message = $system_obj->get_template('payment_unknown_email_template_body', array('blogname' => $blogname, 'name' => $user->display_name, 'post_title' => $post_title, 'purchase_cost' => $purchase_cost, 'email' => $user->user_email, 'reason' => $status_str, 'admin_email' => $system_obj->setting['admin_email']), true);
             }
             // error
             $errors[] = $status_str;
     }
     // do action
     do_action('mgm_return_post_purchase_payment_' . $this->module, array('post_id' => $post_id));
     // new, individual
     do_action('mgm_return_post_purchase_payment', array('post_id' => $post_id));
     // new, global
     // notify user
     if (!$dpne) {
         if ($user_id && $this->send_payment_email($alt_tran_id)) {
             //issue #862
             $subject = mgm_replace_email_tags($subject, $user_id);
             $message = mgm_replace_email_tags($message, $user_id);
             mgm_mail($user->user_email, $subject, $message);
             //send an email to the buyer
             //update as email sent
             $this->update_paymentemail_sent($alt_tran_id);
         }
     }
     $status = __('Failed join', 'mgm');
     //overridden on a successful payment
     if ($tran_success) {
         //issue #1421
         if ($user_id) {
             do_action('mgm_update_coupon_usage', array('user_id' => $user_id));
         }
         // mark as purchased
         if (isset($guest_token)) {
             // issue #1421
             if (isset($coupon_id) && isset($coupon_code)) {
                 do_action('mgm_update_coupon_usage', array('guest_token' => $guest_token, 'coupon_id' => $coupon_id));
                 $this->_set_purchased(NULL, $post_id, $guest_token, $alt_tran_id, $coupon_code);
             } else {
                 $this->_set_purchased(NULL, $post_id, $guest_token, $alt_tran_id);
             }
         } else {
             $this->_set_purchased($user_id, $post_id, NULL, $alt_tran_id);
         }
         // status
         $status = __('The post was purchased successfully', 'mgm');
     }
     // transaction status
     mgm_update_transaction_status($alt_tran_id, $status, $status_str);
     // notify admin, only if gateway emails on
     if (!$dge) {
         // not for guest
         if ($user_id) {
             $subject = "[" . $blogname . "] Admin Notification: " . $user->user_email . " purchased post " . $post_id;
             $message = "User display name: {$user->display_name}<br />User email: {$user->user_email}<br />User ID: {$user->ID}<br />Status: " . $status . "<br />Action: Purchase post:" . $subject . "<br /><br />" . $message . "<br /><br /><pre>" . print_r($_POST, true) . '</pre>';
         } else {
             $subject = "[" . $blogname . "] Admin Notification: Guest[IP: " . mgm_get_client_ip_address() . "] purchased post " . $post_id;
             $message = "Guest Purchase";
         }
         mgm_mail($system_obj->setting['admin_email'], $subject, $message);
     }
     // error condition redirect
     if (count($errors) > 0) {
         mgm_redirect(add_query_arg(array('status' => 'error', 'errors' => implode('|', $errors)), $this->_get_thankyou_url()));
     }
 }
    function _cancel_membership($user_id = NULL, $redirect = false)
    {
        // system
        $system_obj = mgm_get_class('system');
        $s_packs = mgm_get_class('subscription_packs');
        $duration_str = $s_packs->duration_str;
        $dge = bool_from_yn($system_obj->get_setting('disable_gateway_emails'));
        $dpne = bool_from_yn($system_obj->get_setting('disable_payment_notify_emails'));
        //issue #1521
        $is_admin = is_super_admin() ? true : false;
        // if passthrough provided
        if (isset($_REQUEST['extra'])) {
            // get passthrough, stop further process if fails to parse
            $custom = $this->_get_transaction_passthrough($_REQUEST['extra']);
            // local var
            extract($custom);
        } elseif (isset($_REQUEST['SUBSCRIPTION_ID']) || isset($_REQUEST['SubscriptionID'])) {
            // get tran
            $tran = mgm_get_transaction_by_option('zombaio_subscription_id', isset($_REQUEST['SUBSCRIPTION_ID']) ? $_REQUEST['SUBSCRIPTION_ID'] : $_REQUEST['SubscriptionID']);
            // local var
            extract($tran['data']);
        } elseif (isset($_REQUEST['TRANSACTION_ID'])) {
            // get tran
            $tran = mgm_get_transaction_by_option('zombaio_transaction_id', $_REQUEST['TRANSACTION_ID']);
            // local var
            extract($tran['data']);
        } elseif (isset($_REQUEST['username'])) {
            // get user
            if ($user = get_user_by('login', $_REQUEST['username'])) {
                $user_id = $user->ID;
            }
        }
        // log
        // mgm_log($user_id, ($this->module . '_' . __FUNCTION__));
        // no user id
        if (!$user_id) {
            // message
            $message = 'Could not read member in the following REQUEST data. 
			            Please debug or contact magic members to fix the problem making sure to pass 
						on the following data. <br /><br /><pre>' . "\n\n" . print_r($_REQUEST, true) . '</pre>';
            // notify admin, only if gateway emails on
            if (!$dge) {
                // mail
                mgm_mail($system_obj->get_setting('admin_email'), 'Error in Zombaio membership cancellation', $message);
            } else {
                // log
                mgm_log($message, $this->module . '_' . __FUNCTION__);
            }
            // exit
            exit;
        }
        // find user
        $user = get_userdata($user_id);
        $member = mgm_get_member($user_id);
        // multiple membesrhip level update:
        $multiple_update = false;
        // check
        if (isset($_POST['membership_type']) && $member->membership_type != $_POST['membership_type'] || isset($membership_type) && $member->membership_type != $membership_type) {
            $multiple_update = true;
            $member = mgm_get_member_another_purchase($user_id, $_POST['membership_type']);
        }
        // get pack
        if ($member->pack_id) {
            $subs_pack = $s_packs->get_pack($member->pack_id);
        } else {
            $subs_pack = $s_packs->validate_pack($member->amount, $member->duration, $member->duration_type, $member->membership_type);
        }
        // tracking fields module_field => post_field
        $tracking_fields = array('txn_type' => 'Action', 'subscr_id' => array('SUBSCRIPTION_ID', 'SubscriptionID'), 'txn_id' => 'TRANSACTION_ID');
        // save tracking fields
        $this->_save_tracking_fields($tracking_fields, $member, $_REQUEST);
        // types
        $duration_exprs = $s_packs->get_duration_exprs();
        // default expire date
        $expire_date = $member->expire_date;
        // if lifetime:
        if ($member->duration_type == 'l') {
            $expire_date = date('Y-m-d');
        }
        // if trial on
        if ($subs_pack['trial_on'] && isset($duration_exprs[$subs_pack['trial_duration_type']])) {
            // if cancel data is before trial end, set cancel on trial expire_date
            $trial_expire_date = strtotime("+{$subs_pack['trial_duration']} {$duration_exprs[$subs_pack['trial_duration_type']]}", $member->join_date);
            // if lower
            if (time() < $trial_expire_date) {
                $expire_date = date('Y-m-d', $trial_expire_date);
            }
        }
        // transaction_id
        $trans_id = $member->transaction_id;
        // log
        // mgm_log($member, ($this->module . '_' . __FUNCTION__));
        // mgm_log($expire_date . ' ' . date('Y-m-d H:i:s'), ($this->module . '_' . __FUNCTION__));
        // if today
        if (time() >= strtotime($expire_date)) {
            // status
            $new_status = MGM_STATUS_CANCELLED;
            $new_status_str = __('Subscription cancelled', 'mgm');
            // set
            $member->status = $new_status;
            $member->status_str = $new_status_str;
            $member->expire_date = date('Y-m-d H:i:s');
            // reassign expiry membership pack if exists: issue#: 535
            $member = apply_filters('mgm_reassign_member_subscription', $user_id, $member, 'CANCEL', true);
        } else {
            // date
            $date_format = mgm_get_date_format('date_format');
            // status
            $new_status = MGM_STATUS_AWAITING_CANCEL;
            $new_status_str = sprintf(__('Subscription awaiting cancellation on %s', 'mgm'), date($date_format, strtotime($expire_date)));
            // set
            $member->status = $new_status;
            $member->status_str = $new_status_str;
            // set reset date
            $member->status_reset_on = $expire_date;
            $member->status_reset_as = MGM_STATUS_CANCELLED;
        }
        // log
        // mgm_log($member, ($this->module . '_' . __FUNCTION__));
        // update user
        // multiple membesrhip level update:
        if ($multiple_update) {
            mgm_save_another_membership_fields($member, $user_id);
        } else {
            $member->save();
        }
        // transaction status
        mgm_update_transaction_status($trans_id, $new_status, $new_status_str);
        // send email notification to client
        $blogname = get_option('blogname');
        // subject
        $subject = $system_obj->get_template('subscription_cancelled_email_template_subject', array('blogname' => $blogname), true);
        // body
        $message = $system_obj->get_template('subscription_cancelled_email_template_body', array('blogname' => $blogname, 'name' => $user->display_name, 'email' => $user->user_email, 'admin_email' => $system_obj->setting['admin_email']), true);
        // send email notification to user
        if (!$dpne) {
            //issue #862
            $subject = mgm_replace_email_tags($subject, $user_id);
            $message = mgm_replace_email_tags($message, $user_id);
            // mail
            mgm_mail($user->user_email, $subject, $message);
        }
        // notify admin, only if gateway emails on
        if (!$dge) {
            $subject = "[{$blogname}] {$user->user_email} - {$new_status}";
            $message = "\tUser display name: {$user->display_name}\n\n<br />\r\r\n\t\t\t\t\tUser email: {$user->user_email}\n\n<br />\r\r\n\t\t\t\t\tUser ID: {$user->ID}\n\n<br />\r\r\n\t\t\t\t\tMembership Type: {$membership_type}\n\n<br />\r\r\n\t\t\t\t\tNew status: {$new_status}\n\n<br />\r\r\n\t\t\t\t\tStatus message: {$member->status_str}\n\n<br />\t\t\t\t\t\r\r\n\t\t\t\t\tPayment Mode: Cancelled\n\n<br />\r\r\n\t\t\t\t\tPOST Data was: \n\n<br /><br /><pre>" . print_r($_POST, true) . '</pre>';
            mgm_mail($system_obj->setting['admin_email'], $subject, $message);
        }
        // after cancellation hook
        do_action('mgm_membership_subscription_cancelled', array('user_id' => $user_id));
        // redirect
        if ($redirect) {
            // message
            $lformat = mgm_get_date_format('date_format_long');
            $message = sprintf(__("You have successfully unsubscribed. Your account has been marked for cancellation on %s", "mgm"), $expire_date == date('Y-m-d') ? 'Today' : date($lformat, strtotime($expire_date)));
            //issue #1521
            if ($is_admin) {
                mgm_redirect(add_query_arg(array('user_id' => $user_id, 'unsubscribe_errors' => urlencode($message)), admin_url('user-edit.php')));
            }
            // redirect
            mgm_redirect(mgm_get_custom_url('membership_details', false, array('unsubscribed' => 'true', 'unsubscribe_errors' => urlencode($message))));
        }
    }
/**
 * hide protected post/pages from apearing in list/feeds etc
 *
 * @param object $query
 * @return object $query
 * @since 1.0
 */
function mgm_hide_protected($query)
{
    global $post;
    // do not run when admin section loaded #1459
    if (is_admin()) {
        return $query;
    }
    // if loading from feed
    if (is_feed() && isset($_GET['token']) && mgm_use_rss_token()) {
        // get user by rss token, only for feed
        $user = mgm_get_user_by_token(strip_tags($_GET['token']));
    } else {
        // current user
        if (function_exists('wp_get_current_user')) {
            $user = wp_get_current_user();
        } else {
            global $user_ID;
            // pick
            $user = get_userdata($user_ID);
        }
    }
    // get system
    $system_obj = mgm_get_class('system');
    // flag
    $run_cat_notin = $run_term_notin = false;
    // user is not a spider
    if (!mgm_is_a_bot()) {
        // hide post
        $hide_posts = mgm_content_exclude_by_user($user->ID, 'post');
        // hide post
        // set filter
        if (is_array($hide_posts) && !empty($hide_posts)) {
            $query->set('post__not_in', array_unique($hide_posts));
            // set negation
        }
        // hide cats
        $hide_cats = mgm_content_exclude_by_user($user->ID, 'category');
        //hide cats
        // set filter
        if (is_array($hide_cats) && !empty($hide_cats)) {
            // flag
            $run_cat_notin = true;
            //category not found redirection
            //skip admin and home
            //consider only posts:
            if (!is_super_admin() && !is_home() && is_single()) {
                // url
                $category_access_redirect_url = $system_obj->get_setting('category_access_redirect_url');
                //skip if same url:
                if (!empty($category_access_redirect_url) && trailingslashit(mgm_current_url()) != trailingslashit($category_access_redirect_url)) {
                    //check returned category ids belongs to the loaded post:
                    if (isset($post->ID) && is_numeric($post->ID)) {
                        //get post categories
                        $post_cats = wp_get_post_categories($post->ID);
                        // loop
                        foreach ($post_cats as $cat) {
                            //redirect if post category exists in blocked categories
                            if (in_array($cat, $hide_cats)) {
                                //redirect:
                                mgm_redirect($category_access_redirect_url);
                                exit;
                            }
                        }
                    }
                }
            }
            //issue#: 510
            if ($run_cat_notin) {
                // set
                $query->set('category__not_in', array_unique($hide_cats));
                // set negation
                // issue#: 510
                if (substr(get_bloginfo('version'), 0, 3) > 3.0 && !is_page()) {
                    //Note: selectively attach the filter to not apply in other scenarios
                    //issue #1600
                    $post_name = $query->query_vars['name'];
                    if (empty($post_name)) {
                        $current_uri = trim($_SERVER['REQUEST_URI']);
                        $uri = explode('?', $current_uri);
                        $uriArr = explode('/', $uri[0]);
                        if (!empty($uriArr)) {
                            $post_name = $uriArr[1];
                        }
                    }
                    $member = mgm_get_member($user->ID);
                    $membership_type = $member->membership_type;
                    $membership_type = empty($membership_type) ? 'guest' : $membership_type;
                    $arr_memberships = mgm_get_subscribed_membershiptypes($user->ID, $member);
                    if (!in_array($membership_type, $arr_memberships)) {
                        $arr_memberships[] = $membership_type;
                    }
                    $accessible = false;
                    $post_data = mgm_get_post_data_by_name($post_name);
                    // check found
                    if (isset($post_data->ID)) {
                        $post_obj = mgm_get_post($post_data->ID);
                        if (count(array_intersect($post_obj->access_membership_types, $arr_memberships)) > 0) {
                            $accessible = true;
                        }
                    }
                    //not accessible add filter
                    if (!$accessible) {
                        //to filter posts as per category__not_in values
                        add_filter('posts_search', 'mgm_attach_category_not_in');
                    }
                }
            }
            // if on category archive listing page: check cateory is accessible, if not redirect to category_access_redirect_url setting url
            if (!is_super_admin() && !is_home() && is_category()) {
                // url
                $the_url = mgm_current_url();
                //get archived category details
                $loaded_cat = get_category_by_path($the_url, false);
                //getting subcategory by path - issue #1578
                if (empty($loaded_cat)) {
                    $flag = false;
                    $url_segments = preg_split('#/#', $the_url);
                    foreach ($url_segments as $key => $url_segment) {
                        if (strtolower($url_segment) == 'category') {
                            $flag = $key;
                        }
                    }
                    if ($flag) {
                        if (!empty($url_segments[$flag + 2])) {
                            $slug = $url_segments[$flag + 2];
                            $loaded_cat = get_category_by_slug($slug);
                        }
                    }
                }
                // url
                if (!isset($category_access_redirect_url)) {
                    $category_access_redirect_url = $system_obj->get_setting('category_access_redirect_url');
                }
                // issue #: 657
                // if the loaded category cannot be accessed by the user, and if category_access_redirect_url is set, redirect
                if (isset($loaded_cat->cat_ID) && in_array($loaded_cat->cat_ID, $hide_cats) && !empty($category_access_redirect_url) && trailingslashit($the_url) != trailingslashit($category_access_redirect_url)) {
                    // redirect:
                    mgm_redirect($category_access_redirect_url);
                    exit;
                }
            }
        }
    }
    // endif
    // hide terms
    $hide_terms = mgm_content_exclude_by_user($user->ID, 'taxonomy');
    //hide terms
    // set filter
    if (is_array($hide_terms) && !empty($hide_terms)) {
        // flag
        $run_term_notin = true;
        // set filter
        $query->set('tag__not_in', array_unique($hide_terms));
        // set negation
        // set in search
        if (substr(get_bloginfo('version'), 0, 3) > 3.0 && !is_page()) {
            //note: selectively attach the filter to not apply in other scenarios
            add_filter('posts_search', 'mgm_attach_tag_not_in');
            //to filter posts as per tag__not_in values
        }
    }
    // term check
    if ($run_cat_notin || $run_term_notin) {
        add_filter('list_terms_exclusions', 'mgm_exclude_terms');
        // terms
    }
    // return
    return $query;
}
 /**
  * API helper method redirect
  *
  * @param array $arg
  * @return none
  */
 function _redirect($arg = false)
 {
     // add arg
     if (is_array($arg)) {
         $redirect = add_query_arg(array('status' => 'success'), $this->setting['processed_url']);
     } else {
         $redirect = $this->setting['processed_url'];
     }
     // redirect
     mgm_redirect($redirect);
 }
 function _cancel_membership($user_id = null, $redirect = false)
 {
     // system
     $system_obj = mgm_get_class('system');
     $s_packs = mgm_get_class('subscription_packs');
     $dge = bool_from_yn($system_obj->get_setting('disable_gateway_emails'));
     $dpne = bool_from_yn($system_obj->get_setting('disable_payment_notify_emails'));
     //issue #1521
     $is_admin = is_super_admin() ? true : false;
     // get passthrough, stop further process if fails to parse
     $custom = $this->_get_transaction_passthrough($_POST['COMPLUS']);
     // local var
     extract($custom);
     // currency
     if (!$currency) {
         $currency = $this->setting['currency'];
     }
     // find user
     $user = get_userdata($user_id);
     $member = mgm_get_member($user_id);
     // multiple membesrhip level update:
     $multiple_update = false;
     if (isset($_POST['membership_type']) && $member->membership_type != $_POST['membership_type'] || isset($is_another_membership_purchase) && $is_another_membership_purchase == 'Y') {
         $multiple_update = true;
         $multi_memtype = isset($_POST['membership_type']) ? $_POST['membership_type'] : $membership_type;
         $member = mgm_get_member_another_purchase($user_id, $multi_memtype);
     }
     // tracking fields module_field => post_field
     $tracking_fields = array('txn_type' => 'txn_type', 'subscr_id' => 'subscr_id', 'txn_id' => 'txn_id');
     // save tracking fields
     $this->_save_tracking_fields($tracking_fields, $member);
     $expire_date = $member->expire_date;
     // if lifetime:
     if ($member->duration_type == 'l') {
         $expire_date = date('Y-m-d');
     }
     // transaction_id
     $trans_id = $member->transaction_id;
     // if today
     if ($expire_date == date('Y-m-d')) {
         // status
         $new_status = MGM_STATUS_CANCELLED;
         $new_status_str = __('Subscription cancelled', 'mgm');
         // set
         $member->status = $new_status;
         $member->status_str = $new_status_str;
         $member->expire_date = date('Y-m-d');
         // reassign expiry membership pack if exists: issue#: 535
         $member = apply_filters('mgm_reassign_member_subscription', $user_id, $member, 'CANCEL', true);
     } else {
         // date
         $date_format = mgm_get_date_format('date_format');
         // status
         $new_status = MGM_STATUS_AWAITING_CANCEL;
         $new_status_str = sprintf(__('Subscription awaiting cancellation on %s', 'mgm'), date($date_format, strtotime($expire_date)));
         // set
         $member->status = $new_status;
         $member->status_str = $new_status_str;
         // set reset date
         $member->status_reset_on = $expire_date;
         $member->status_reset_as = MGM_STATUS_CANCELLED;
     }
     // multiple membesrhip level update:
     if ($multiple_update) {
         mgm_save_another_membership_fields($member, $user_id);
     } else {
         $member->save();
     }
     // transaction status
     mgm_update_transaction_status($trans_id, $new_status, $new_status_str);
     // send email notification to client
     $blogname = get_option('blogname');
     // notify user
     if (!$dpne) {
         // notify user
         mgm_notify_user_membership_cancellation($blogname, $user, $member, $system_obj, $new_status, $membership_type);
     }
     // notify admin
     if (!$dge) {
         // notify admin
         mgm_notify_admin_membership_cancellation($blogname, $user, $member);
     }
     // after cancellation hook
     do_action('mgm_membership_subscription_cancelled', array('user_id' => $user_id));
     // redirect only internal
     if ($redirect) {
         // message
         $lformat = mgm_get_date_format('date_format_long');
         $message = sprintf(__("You have successfully unsubscribed. Your account has been marked for cancellation on %s", "mgm"), $expire_date == date('Y-m-d') ? 'Today' : date($lformat, strtotime($expire_date)));
         //issue #1521
         if ($is_admin) {
             mgm_redirect(add_query_arg(array('user_id' => $user_id, 'unsubscribe_errors' => urlencode($message)), admin_url('user-edit.php')));
         }
         // redirect
         mgm_redirect(mgm_get_custom_url('membership_details', false, array('unsubscribed' => 'true', 'unsubscribe_errors' => urlencode($message))));
     }
 }
/**
 * get post purchase buttons
 * final step for post purchase
 *
 * @param void
 * @return $html
 */
function mgm_get_post_purchase_buttons()
{
    // get current user data - issue #1421
    $user = wp_get_current_user();
    // pack
    $pack = NULL;
    // addon options
    if ($addon_option_ids = mgm_post_var('addon_options')) {
        $addon_options = mgm_get_addon_options_only($addon_option_ids);
        // mgm_pr($addon_options);
    }
    // post purchase
    if (isset($_POST['post_id'])) {
        //issue #1250
        if (isset($_POST['mgm_postpurchase_field']['coupon']) && !empty($_POST['mgm_postpurchase_field']['coupon'])) {
            //issue #1250 - Coupon validation
            if (!empty($_POST['form_action'])) {
                // check if its a valid coupon
                if (!($coupon = mgm_get_coupon_data($_POST['mgm_postpurchase_field']['coupon']))) {
                    //redirect back to the form
                    $q_arg = array('error_field' => 'Coupon', 'error_type' => 'invalid', 'error_field_value' => $_POST['mgm_postpurchase_field']['coupon']);
                    $redirect = add_query_arg($q_arg, $_POST['form_action']);
                    mgm_redirect($redirect);
                    exit;
                }
            }
        }
        // post id
        $post_id = $_POST['post_id'];
        // gete mgm data
        $post_obj = mgm_get_post($post_id);
        $cost = mgm_convert_to_currency($post_obj->purchase_cost);
        $product = $post_obj->product;
        $allowed_modules = $post_obj->allowed_modules;
        // post data
        $post = get_post($post_id);
        $title = $post->post_title;
        // item name -issue #1380
        $item_name = apply_filters('mgm_post_purchase_itemname', sprintf(__('Purchase Post - %s', 'mgm'), $title));
        // set pack
        $pack = array('duration' => 1, 'item_name' => $item_name, 'buypost' => 1, 'cost' => $cost, 'title' => $title, 'product' => $product, 'post_id' => $post_id, 'allowed_modules' => $allowed_modules);
    } else {
        if (isset($_POST['postpack_id'])) {
            // post pack purchase
            //issue #1250
            if (isset($_POST['mgm_postpurchase_field']['coupon']) && !empty($_POST['mgm_postpurchase_field']['coupon'])) {
                //issue #1250 - Coupon validation
                if (!empty($_POST['form_action'])) {
                    // check if its a valid coupon
                    if (!($coupon = mgm_get_coupon_data($_POST['mgm_postpurchase_field']['coupon']))) {
                        //redirect back to the form
                        $q_arg = array('error_field' => 'Coupon', 'error_type' => 'invalid', 'error_field_value' => $_POST['mgm_postpurchase_field']['coupon']);
                        $redirect = add_query_arg($q_arg, $_POST['form_action']);
                        mgm_redirect($redirect);
                        exit;
                    }
                }
            }
            // post pack purchase
            $postpack_id = $_POST['postpack_id'];
            // pcak id
            $postpack_post_id = $_POST['postpack_post_id'];
            // post id where pack is listed, redirect here
            // get pack
            $postpack = mgm_get_postpack($postpack_id);
            $cost = mgm_convert_to_currency($postpack->cost);
            $product = json_decode($postpack->product, true);
            $modules = json_decode($postpack->modules, true);
            //mgm_pr($postpack);
            // item name -issue #1380
            $item_name = apply_filters('mgm_postpack_purchase_itemname', sprintf(__('Purchase Post Pack - %s', 'mgm'), $postpack->name));
            // post id
            $post_id = mgm_get_postpack_posts_csv($postpack_id);
            // set pack
            $pack = array('duration' => 1, 'item_name' => $item_name, 'buypost' => 1, 'cost' => $cost, 'title' => $postpack->name, 'product' => $product, 'post_id' => $post_id, 'postpack_id' => $postpack_id, 'postpack_post_id' => $postpack_post_id, 'allowed_modules' => $modules);
        }
    }
    // check
    if (!$pack) {
        return __('Error in Payment! No data available ');
        exit;
    }
    // guest token	-issue #1421
    if (isset($_POST['guest_purchase']) && $_POST['guest_purchase'] == TRUE && $user->ID <= 0) {
        $pack['guest_token'] = sanitize_title_for_query(mgm_create_token());
    }
    // addon options
    if (isset($addon_options) && !empty($addon_options)) {
        $pack['addon_options'] = $addon_options;
    }
    // get coupon
    $post_purchase_coupon = mgm_save_partial_fields(array('on_postpurchase' => true), 'mgm_postpurchase_field', $pack['cost'], false, 'postpurchase');
    // alter
    mgm_get_post_purchase_coupon_pack($post_purchase_coupon, $pack);
    // Eg: $_POST['mgm_payment_gateways'] = mgm_paypal
    $cf_payment_gateways = isset($_POST['mgm_payment_gateways']) && !empty($_POST['mgm_payment_gateways']) ? $_POST['mgm_payment_gateways'] : null;
    // bypass step2 if payment gateway is submitted: issue #: 469
    if (!is_null($cf_payment_gateways)) {
        // get pack
        // mgm_get_upgrade_coupon_pack($member, $selected_pack);
        // cost
        if ((double) $pack['cost'] > 0) {
            //get an object of the payment gateway:
            $mod_obj = mgm_get_module($cf_payment_gateways, 'payment');
            // tran options
            $tran_options = array('user_id' => $user->ID);
            // is register & purchase
            if (isset($_POST['post_id'])) {
                $tran_options['post_id'] = (int) $_POST['post_id'];
            }
            // postpack id
            if (isset($_POST['postpack_id'])) {
                $tran_options['postpack_id'] = (int) $_POST['postpack_id'];
            }
            // is register & purchase postpack
            if (isset($_POST['postpack_post_id']) && isset($_POST['postpack_id'])) {
                $tran_options['postpack_post_id'] = (int) $_POST['postpack_post_id'];
                $tran_options['postpack_id'] = (int) $_POST['postpack_id'];
            }
            // create transaction
            $tran_id = mgm_add_transaction($pack, $tran_options);
            // bypass directly to process return if manual payment:
            if ($cf_payment_gateways == 'mgm_manualpay') {
                // set
                $_POST['custom'] = $tran_id;
                // direct call to module return function:
                $mod_obj->process_return();
                // exit
                exit;
            }
            // encode id:
            $tran_id = mgm_encode_id($tran_id);
            $redirect = $mod_obj->_get_endpoint('html_redirect', true);
            $redirect = add_query_arg(array('tran_id' => $tran_id), $redirect);
            // redirect
            mgm_redirect($redirect);
            // this goes to subscribe, mgm_functions.php/mgm_get_subscription_buttons
            // exit
            exit;
        }
    }
    // get payment modules
    $a_payment_modules = mgm_get_class('system')->get_active_modules('payment');
    // init
    $payment_modules = array();
    // when active
    if ($a_payment_modules) {
        // loop
        foreach ($a_payment_modules as $payment_module) {
            // not trial
            if (in_array($payment_module, array('mgm_free', 'mgm_trial'))) {
                continue;
            }
            // store
            $payment_modules[] = $payment_module;
        }
    }
    // init
    $button = '';
    // transaction
    $tran_id = NULL;
    $button_printed = 0;
    // loop modules
    foreach ($payment_modules as $module) {
        // object
        $mod_obj = mgm_get_module($module, 'payment');
        // check buypost support
        if (in_array('buypost', $mod_obj->supported_buttons)) {
            // create transaction
            if (!$tran_id) {
                $tran_id = mgm_add_transaction($pack);
            }
            // button code
            if (isset($pack['allowed_modules'])) {
                // Issue #1562: If no payment module is selected, display all supported modules
                if (!empty($pack['allowed_modules']) && FALSE === in_array($module, $pack['allowed_modules'])) {
                    continue;
                }
            }
            $button_code = $mod_obj->get_button_buypost(array('pack' => $pack, 'tran_id' => $tran_id), true);
            $button_printed++;
            // get button
            $button .= "<div class='mgm_custom_filed_table'>" . $button_code . "</div>";
        }
    }
    // none active
    if ($button_printed == 0) {
        $button .= sprintf('<p class="mgm-no-module"> %s </p>', __('No Payment module active for this Content Purchase.', 'mgm'));
    }
    // if Cost is zero, then process using free module.: issue#: 883
    if ($tran_id && $pack['cost'] == 0 && in_array('mgm_free', $a_payment_modules) && mgm_get_module('mgm_free')->is_enabled()) {
        // module
        $module = 'mgm_free';
        // payments url
        $payments_url = mgm_get_custom_url('transactions');
        // query_args
        $query_args = array('method' => 'payment_return', 'module' => $module, 'custom' => $tran_id);
        // redirector
        if (isset($_REQUEST['redirector'])) {
            // set
            $query_args['redirector'] = $_REQUEST['redirector'];
        }
        // redirect to module to mark the payment as complete
        $redirect = add_query_arg($query_args, $payments_url);
        // redirect
        mgm_redirect($redirect);
    }
    // html
    $return = '<div class="post_purchase_select_gateway">' . __('Please Select a Payment Gateway.', 'mgm') . '</div>' . $button;
    // return
    return $return;
}
Example #11
0
 function process_cancel()
 {
     // redirect to cancel page
     mgm_redirect(add_query_arg(array('status' => 'cancel'), $this->_get_thankyou_url()));
 }
Example #12
0
 function _buy_post()
 {
     global $wpdb;
     // get system settings
     $system_obj = mgm_get_class('system');
     $dge = bool_from_yn($system_obj->get_setting('disable_gateway_emails'));
     $dpne = bool_from_yn($system_obj->get_setting('disable_payment_notify_emails'));
     // get passthrough, stop further process if fails to parse
     $custom = $this->_get_transaction_passthrough($_POST['COMPLUS']);
     // local var
     extract($custom);
     // find user
     $user = null;
     // check
     if (isset($user_id) && (int) $user_id > 0) {
         $user = get_userdata($user_id);
     }
     // errors
     $errors = array();
     // purchase status
     $purchase_status = 'Error';
     // get status
     $payment_status = $this->_parse_payment_status($_POST['STATUS']);
     // check
     switch ($payment_status) {
         //issue#: 360
         case 'Authorized':
         case 'Payment requested':
             //status code will be 9
             // status
             $status_str = __('Last payment was successful', 'mgm');
             // purchase status
             $purchase_status = 'Success';
             // transaction id
             $transaction_id = $this->_get_transaction_id('COMPLUS');
             // hook args
             $args = array('post_id' => $post_id, 'transaction_id' => $transaction_id);
             // user purchase
             if (isset($user_id) && (int) $user_id > 0) {
                 $args['user_id'] = $user_id;
             } else {
                 // guest purchase
                 $args['guest_token'] = $guest_token;
             }
             // after succesful payment hook
             do_action('mgm_buy_post_transaction_success', $args);
             // backward compatibility
             do_action('mgm_post_purchase_payment_success', $args);
             // new organized name
             break;
         case 'Refund':
         case 'Payment refused':
         case 'Cancelled':
             // status
             $status_str = __('Last payment was refunded or denied', 'mgm');
             // purchase status
             $purchase_status = 'Failure';
             // error
             $errors[] = $status_str;
             break;
         case 'Pending':
         case 'Being processed (intermediate technical status)':
         case 'Authorization waiting':
             // status
             $status_str = sprintf(__('Last payment is pending. Reason: %s', 'mgm'), $payment_status);
             // purchase status
             $purchase_status = 'Pending';
             // error
             $errors[] = $status_str;
             break;
         default:
             // status
             $status_str = sprintf(__('Last payment status: %s', 'mgm'), $payment_status);
             // purchase status
             $purchase_status = 'Unknown';
             // error
             $errors[] = $status_str;
     }
     // do action
     do_action('mgm_return_post_purchase_payment_' . $this->module, array('post_id' => $post_id));
     // new, individual
     do_action('mgm_return_post_purchase_payment', array('post_id' => $post_id));
     // new, global
     // status
     $status = __('Failed join', 'mgm');
     //overridden on a successful payment
     // check status
     if ($purchase_status == 'Success') {
         // mark as purchased
         if (isset($user->ID)) {
             // purchased by user
             // call coupon action
             do_action('mgm_update_coupon_usage', array('user_id' => $user_id));
             // set as purchased
             $this->_set_purchased($user_id, $post_id, NULL, $alt_tran_id);
         } else {
             // purchased by guest
             if (isset($guest_token)) {
                 // issue #1421, used coupon
                 if (isset($coupon_id) && isset($coupon_code)) {
                     // call coupon action
                     do_action('mgm_update_coupon_usage', array('guest_token' => $guest_token, 'coupon_id' => $coupon_id));
                     // set as purchased
                     $this->_set_purchased(NULL, $post_id, $guest_token, $alt_tran_id, $coupon_code);
                 } else {
                     $this->_set_purchased(NULL, $post_id, $guest_token, $alt_tran_id);
                 }
             }
         }
         // status
         $status = __('The post was purchased successfully', 'mgm');
     }
     // transaction status
     mgm_update_transaction_status($_POST['COMPLUS'], $status, $status_str);
     // blog
     $blogname = get_option('blogname');
     // post being purchased
     $post = get_post($post_id);
     // notify user and admin, only if gateway emails on
     if (!$dpne) {
         // notify user
         if (isset($user->ID)) {
             // mgm post setup object
             $post_obj = mgm_get_post($post_id);
             // check
             if ($this->send_payment_email($alt_tran_id)) {
                 // check
                 if (mgm_notify_user_post_purchase($blogname, $user, $post, $purchase_status, $system_obj, $post_obj, $status_str)) {
                     // update as email sent
                     $this->update_paymentemail_sent($alt_tran_id);
                 }
             }
         }
     }
     // notify admin, only if gateway emails on
     if (!$dge) {
         // notify admin,
         mgm_notify_admin_post_purchase($blogname, $user, $post, $status);
     }
     // error condition redirect
     if (count($errors) > 0) {
         mgm_redirect(add_query_arg(array('status' => 'error', 'errors' => implode('|', $errors)), $this->_get_thankyou_url()));
     }
 }
/**
 * after login redirect
 * 
 * @param string user login
 * @param object user
 * @return object user
 */
function mgm_login_redirect($user_login, $user = NULL)
{
    // get user
    if (!$user) {
        $user = get_user_by('login', $user_login);
    }
    // if super admin
    if (is_super_admin($user->ID)) {
        // redirect
        mgm_redirect(admin_url());
        exit;
    }
    // check doing auto login from register and skip if true
    if (defined('MGM_DOING_REGISTER_AUTO_LOGIN') && MGM_DOING_REGISTER_AUTO_LOGIN == TRUE) {
        // return
        return $user;
    }
    // custom hook
    do_action('mgm_before_login_redirect', $user);
    // get setting
    $system_obj = mgm_get_class('system');
    // issue #503,allow redirecting back to post url: @depends on  "enable_post_url_redirection" in misc setting
    $enable_post_url_redirection = bool_from_yn($system_obj->get_setting('enable_post_url_redirection'));
    // check
    if ($enable_post_url_redirection) {
        // redirect_to
        if ($redirect_to = mgm_request_var('redirect_to', '', true)) {
            // flag
            $do_redirect = true;
            // loop custom pages
            foreach ($system_obj->get_custom_pages_url() as $page_url) {
                // if not same
                if (!empty($page_url) && trailingslashit($redirect_to) == trailingslashit($page_url)) {
                    // check, matched both full url or part /%postname%/ url
                    if (trailingslashit($redirect_to) == trailingslashit($page_url) || site_url($redirect_to) == trailingslashit($page_url)) {
                        // reset
                        $do_redirect = false;
                        break;
                    }
                }
            }
            // OK
            if (!empty($redirect_to) && $do_redirect) {
                mgm_redirect($redirect_to);
            }
            exit;
        }
    }
    // apply filter
    $login_redirect_url = apply_filters('mgm_login_redirect', mgm_login_redirect_url($user));
    // check
    if (!empty($login_redirect_url)) {
        mgm_redirect($login_redirect_url);
        exit;
    }
    // return
    return $user;
}
Example #14
0
 function process_cancel()
 {
     // not used for this module
     mgm_redirect(add_query_arg(array('status' => 'cancel'), $this->_get_thankyou_url()));
 }
/**
 * unsubscribe default callback
 */
function mgm_member_unsubscribe()
{
    // user_id from post
    extract($_POST);
    // system
    $system_obj = mgm_get_class('system');
    $packs_obj = mgm_get_class('subscription_packs');
    $dge = bool_from_yn($system_obj->get_setting('disable_gateway_emails'));
    // find user
    $user = get_userdata($user_id);
    $member = mgm_get_member($user_id);
    // multiple membesrhip level update:
    if (isset($_POST['membership_type']) && $member->membership_type != $_POST['membership_type']) {
        $member = mgm_get_member_another_purchase($user_id, $_POST['membership_type']);
    }
    // get pack
    if ($member->pack_id) {
        $subs_pack = $packs_obj->get_pack($member->pack_id);
    } else {
        $subs_pack = $packs_obj->validate_pack($member->amount, $member->duration, $member->duration_type, $member->membership_type);
    }
    // types
    $duration_exprs = $packs_obj->get_duration_exprs();
    // default expire date
    $expire_date = $member->expire_date;
    if ($member->duration_type == 'l') {
        $expire_date = date('Y-m-d');
    }
    // if trial on
    if ($subs_pack['trial_on'] && isset($duration_exprs[$subs_pack['trial_duration_type']])) {
        // if cancel data is before trial end, set cancel on trial expire_date
        $trial_expire_date = strtotime("+{$subs_pack['trial_duration']} {$duration_exprs[$subs_pack['trial_duration_type']]}", $member->join_date);
        // if lower
        if (time() < $trial_expire_date) {
            $expire_date = date('Y-m-d', $trial_expire_date);
        }
    }
    // old status
    $old_status = $member->status;
    // if today
    if ($expire_date == date('Y-m-d')) {
        // set new status
        $member->status = $new_status = MGM_STATUS_CANCELLED;
        // status string
        $member->status_str = __('Subscription Cancelled', 'mgm');
        $member->expire_date = date('Y-m-d');
    } else {
        // date format
        $date_format = mgm_get_date_format('date_format');
        // set new status
        $member->status = $new_status = MGM_STATUS_AWAITING_CANCEL;
        // status string
        $member->status_str = sprintf(__('Subscription awaiting cancellation on %s', 'mgm'), date($date_format, strtotime($expire_date)));
        // reset on
        $member->status_reset_on = $expire_date;
        $member->status_reset_as = MGM_STATUS_CANCELLED;
    }
    // multiple memberhip level update:
    if ($post_membership_type = mgm_post_var('membership_type') && $member->membership_type != $post_membership_type) {
        mgm_save_another_membership_fields($member, $user_id);
    } else {
        $member->save();
    }
    // status change event
    do_action('mgm_user_status_change', $user_id, $new_status, $old_status, 'member_unsubscribe', $member->pack_id);
    // send email notification to client
    $blogname = get_option('blogname');
    // email
    $subject = sprintf(__('[%s] Subscription Cancelled', 'mgm'), $blogname);
    $message = __('This is an automatic notification from %1$s to %2$s (%3$s). This is a notification to inform you that your subscription has been cancelled. For more information please contact %4$s', 'mgm');
    $message = sprintf($message, $blogname, $user->display_name, $user->user_email, $system_obj->setting['admin_email']);
    // send email notification to user
    mgm_mail($user->user_email, $subject, $message);
    // notify admin, only if gateway emails on
    if (!$dge) {
        $subject = "[{$blogname}] {$user->user_email} - {$new_status}";
        $message = "\tUser display name: {$user->display_name}\n\n<br />\r\r\n\t\t\t\tUser email: {$user->user_email}\n\n<br />\r\r\n\t\t\t\tUser ID: {$user->ID}\n\n<br />\r\r\n\t\t\t\tMembership Type: {$membership_type}\n\n<br />\r\r\n\t\t\t\tNew status: {$new_status}\n\n<br />\r\r\n\t\t\t\tStatus message: {$member->status_str}\n\n<br />\t\t\t\t\t\r\r\n\t\t\t\tPayment Mode: Cancelled\n\n<br />\r\r\n\t\t\t\tPOST Data was: \n\n<br /><br /><pre>" . print_r($_POST, true) . '</pre>';
        mgm_mail($system_obj->setting['admin_email'], $subject, $message);
    }
    // after cancellation hook
    do_action('mgm_membership_subscription_cancelled', array('user_id' => $user_id));
    // message
    $lformat = mgm_get_date_format('date_format_long');
    $message = sprintf(__("You have successfully Unsubscribed. Your account has been marked for cancellation on %s", "mgm"), $expire_date == date('Y-m-d') ? 'Today' : date($lformat, strtotime($expire_date)));
    // redirect
    //mgm_redirect('wp-admin/profile.php?page=mgm/profile&unsubscribed=true&unsubscribe_errors='.urlencode($message));
    mgm_redirect(mgm_get_custom_url('membership_details', false, array('unsubscribe_errors' => urlencode($message))));
}
/**
 * Custom user profile form
 */
function mgm_user_profile_form($user_id = NULL, $temp_edit = false, $args = array())
{
    global $wpdb;
    // get mgm_system
    $system_obj = mgm_get_class('system');
    // current user
    $current_user = $user_id ? get_userdata($user_id) : wp_get_current_user();
    // current or voew
    if ($current_user->ID) {
        // current
        $user = mgm_get_userdata($current_user->ID);
    } else {
        // query string
        $user = mgm_get_user_from_querystring();
    }
    // if no user
    if (!isset($user) || !$user->ID || is_super_admin($user->ID)) {
        return mgm_user_login_form();
        exit;
    }
    // mgm member
    $member = mgm_get_member($user->ID);
    // edit mode, on for current user
    $edit_mode = $current_user->ID == $user->ID ? true : false;
    $temp = 0;
    // form action
    $form_action = get_permalink();
    // reset
    if ($form_action == null) {
        $form_action = mgm_get_current_url();
        $form_action = str_replace(array('&updated=true', '?updated=true'), '', $form_action);
    }
    //init - issue #1573
    $show_membership_fields_arr = array();
    if (isset($args['membership']) && !empty($args['membership'])) {
        // membership
        $membership = $args['membership'];
        // get active custom fields on register
        $cf_profile_by_membership_types = mgm_get_class('member_custom_fields')->get_fields_where(array('attributes' => array('profile_by_membership_types' => true)));
        //check
        if (!empty($cf_profile_by_membership_types)) {
            //loop
            foreach ($cf_profile_by_membership_types as $cf_profile_by_membership_type) {
                //membership_type
                $membership_types_string = isset($cf_profile_by_membership_type['attributes']['profile_membership_types_field_alias']) ? $cf_profile_by_membership_type['attributes']['profile_membership_types_field_alias'] : null;
                //check
                if (preg_match('/\\b' . $membership . '\\b/', $membership_types_string) && $membership_types_string != null) {
                    $show_fields_arr[] = $cf_profile_by_membership_type['name'];
                    $show_membership_fields_arr[] = $cf_profile_by_membership_type;
                    if ($cf_profile_by_membership_type['name'] == 'password') {
                        foreach ($cf_profile_by_membership_types as $cf_profile_by_membership) {
                            if ($cf_profile_by_membership['name'] == 'password_conf') {
                                $show_membership_fields_arr[] = $cf_profile_by_membership;
                            }
                        }
                    }
                }
            }
        }
    }
    // get default fields
    $profile_fields = mgm_get_config('default_profile_fields', array());
    // get active custom fields on profile page
    $cf_profile_page = mgm_get_class('member_custom_fields')->get_fields_where(array('display' => array('on_profile' => true)));
    $cf_noton_profile = mgm_get_class('member_custom_fields')->get_fields_where(array('display' => array('on_profile' => false)));
    //merge - issue #1573
    if (isset($show_membership_fields_arr) && is_array($show_membership_fields_arr) && !empty($show_membership_fields_arr)) {
        $cf_profile_page = array_merge($cf_profile_page, $show_membership_fields_arr);
        $cf_noton_profile = array_merge($cf_noton_profile, $show_membership_fields_arr);
    }
    $error_html = '';
    //issue #867
    $css_group = mgm_get_css_group();
    if ($css_group != 'none') {
        // error_html
        $error_html .= '<link rel="stylesheet" href="' . MGM_ASSETS_URL . 'css/' . $css_group . '/mgm.messages.css' . '" type="text/css" media="all" />';
    }
    // update
    if ($edit_mode) {
        // updated
        if (isset($_POST['method']) && $_POST['method'] == 'update_user') {
            // check security before processing form
            if (!wp_verify_nonce(mgm_post_var('_mgmnonce_user_profile'), 'user_profile')) {
                mgm_security_error('user_profile');
            }
            // user lib
            if (mgm_compare_wp_version('3.1', '<')) {
                // only before 3.1
                require_once ABSPATH . WPINC . '/registration.php';
            }
            // callback
            do_action('personal_options_update', $current_user->ID);
            // not multisite, duplicate email allowed ?
            if (!is_multisite()) {
                // save
                $errors = mgm_user_profile_update($current_user->ID);
            } else {
                // multi site
                // get user
                $user = get_userdata($current_user->ID);
                // update here:
                // Update the email address, if present. duplicate check
                if ($user->user_login && isset($_POST['user_email']) && is_email($_POST['user_email']) && $wpdb->get_var($wpdb->prepare("SELECT user_login FROM {$wpdb->signups} WHERE user_login = %s", $user->user_login))) {
                    $wpdb->query($wpdb->prepare("UPDATE {$wpdb->signups} SET user_email = %s WHERE user_login = %s", $_POST['user_email'], $user->user_login));
                }
                // edit
                if (!isset($errors) || isset($errors) && is_object($errors) && false == $errors->get_error_codes()) {
                    $errors = mgm_user_profile_update($current_user->ID);
                }
            }
            // trap erros
            if (!is_wp_error($errors)) {
                // redirect
                mgm_redirect(add_query_arg(array('updated' => 'true'), $form_action));
            }
            // errors
            if (isset($errors) && !is_numeric($errors)) {
                // get error
                $error_html .= mgm_set_errors($errors, true);
            }
        }
    }
    // updated
    if ($edit_mode && isset($_GET['updated'])) {
        $error_html .= '<div class="mgm_message_success">';
        $message = apply_filters('mgm_profile_edit_message', __('User updated.', 'mgm'));
        $error_html .= '<div><strong>' . $message . '</strong></div></div>';
    }
    // 	get row row template
    $form_row_template = $system_obj->get_template('profile_form_row_template');
    // get template row filter, mgm_profile_form_row_template for edit, mgm_profile_form_row_template_view for public view
    $form_row_template = apply_filters('mgm_profile_form_row_template' . (!$edit_mode ? '_view' : ''), $form_row_template);
    $cf_order = array();
    foreach ($cf_profile_page as $fld) {
        $cf_order[] = array('field' => $fld['name']);
    }
    // auto generate form template
    // form_template
    $form_template = '';
    // captured
    $fields_captured = array();
    // get field_groups
    $field_groups = mgm_get_config('profile_field_groups', array());
    // loop groups
    foreach ($field_groups as $group => $group_fields) {
        if ($group == 'Photo') {
            $photo_exists = false;
            foreach ($cf_profile_page as $photo) {
                if ($photo['name'] == 'photo') {
                    $photo_exists = true;
                    break;
                }
            }
            if (!$photo_exists) {
                continue;
            }
        }
        $fields_with_order = array();
        //issue #1197
        $css_title = function_exists('mb_strtolower') ? @mb_strtolower($group) : strtolower($group);
        $css_title = str_replace(' ', '_', $css_title);
        // group
        // PREV CODE
        $form_template .= sprintf('<span class="profile_group_%s">%s</span>', $css_title, $group);
        // loop to create form template
        foreach ($group_fields as $group_field) {
            // skip password
            //if(!$edit_mode && $group_field == 'password') continue;
            if (!$edit_mode && in_array($group_field, array('password', 'password_conf'))) {
                continue;
            }
            // set not found
            $captured = false;
            // first check if in custom fields
            foreach ($cf_profile_page as $field) {
                // skip password in non edit mode
                if ($field['name'] == $group_field) {
                    // set found
                    $captured = true;
                    // skip password
                    //if(!$edit_mode && $field['name'] == 'password') continue;
                    if (!$edit_mode && in_array($field['name'], array('password', 'password_conf'))) {
                        continue;
                    }
                    // store for no repeat
                    $fields_captured[] = $field['name'];
                    // field wrapper
                    $wrapper_ph = sprintf('[user_field_wrapper_%s]', $field['name']);
                    // field label
                    $label_ph = sprintf('[user_field_label_%s]', $field['name']);
                    // field/html element
                    $element_ph = sprintf('[user_field_element_%s]', $field['name']);
                    // set element name
                    // PREV CODE
                    //$form_template .= str_replace(array('[user_field_wrapper]','[user_field_label]','[user_field_element]'),array($wrapper_ph,$label_ph,$element_ph),$form_row_template);
                    // Issue #1149
                    foreach ($cf_order as $index => $cfo) {
                        if ($cfo['field'] == $field['name']) {
                            $fields_with_order[$index] = str_replace(array('[user_field_wrapper]', '[user_field_label]', '[user_field_element]'), array($wrapper_ph, $label_ph, $element_ph), $form_row_template);
                            break;
                        }
                    }
                    // break;
                    break;
                }
            }
            // if not captured
            if (!$captured) {
                $continue = false;
                foreach ($cf_noton_profile as $cffield) {
                    if ($cffield['name'] == $group_field) {
                        $continue = true;
                        break;
                    }
                }
                // break;
                if ($continue) {
                    continue;
                }
                // check set
                if (!isset($profile_fields[$group_field]['name'])) {
                    continue;
                }
                // field wrapper
                $wrapper_ph = sprintf('[user_field_wrapper_%s]', $profile_fields[$group_field]['name']);
                // field label
                $label_ph = sprintf('[user_field_label_%s]', $profile_fields[$group_field]['name']);
                // field/html element
                $element_ph = sprintf('[user_field_element_%s]', $profile_fields[$group_field]['name']);
                // set element name
                // PREV CODE
                // $form_template .= str_replace(array('[user_field_wrapper]','[user_field_label]','[user_field_element]'),array($wrapper_ph,$label_ph,$element_ph),$form_row_template);
                // Issue #1149
                $field_added = false;
                foreach ($cf_order as $index => $cfo) {
                    if ($cfo['field'] == $group_field) {
                        $fields_with_order[$index] = str_replace(array('[user_field_wrapper]', '[user_field_label]', '[user_field_element]'), array($wrapper_ph, $label_ph, $element_ph), $form_row_template);
                        $field_added = true;
                        break;
                    }
                }
                if (!$field_added) {
                    /*$fields_with_order[$index+1] = str_replace(array('[user_field_wrapper]','[user_field_label]','[user_field_element]'),array($wrapper_ph,$label_ph,$element_ph),$form_row_template);*/
                    // default profile instalation fields - issue #1207
                    if (in_array($group_field, array('username', 'email', 'password', 'password', 'password_conf'))) {
                        $fields_with_order[$temp++] = str_replace(array('[user_field_wrapper]', '[user_field_label]', '[user_field_element]'), array($wrapper_ph, $label_ph, $element_ph), $form_row_template);
                    }
                }
            }
        }
        // Issue #1149
        // Process custom field form_template with order
        if (!empty($fields_with_order)) {
            // Sort by key
            ksort($fields_with_order);
            // Loop through fields and attach html
            foreach ($fields_with_order as $fworder) {
                $form_template .= $fworder;
            }
        }
    }
    // other
    $other_header = false;
    // loop to create form template
    foreach ($cf_profile_page as $field) {
        // skip password in non edit mode
        //if(!$edit_mode && $field['name'] == 'password') continue;
        if (!$edit_mode && in_array($field['name'], array('password', 'password_conf'))) {
            continue;
        }
        // skip captured
        if (in_array($field['name'], $fields_captured)) {
            continue;
        }
        // header
        if (!$other_header) {
            // rest
            $form_template .= sprintf('<span class="profile_group_others">%s</span>', __('Others', 'mgm'));
            $other_header = true;
        }
        // field wrapper
        $wrapper_ph = sprintf('[user_field_wrapper_%s]', $field['name']);
        // field label
        $label_ph = sprintf('[user_field_label_%s]', $field['name']);
        // field/html element
        $element_ph = sprintf('[user_field_element_%s]', $field['name']);
        // template for show_public_profile
        if ($field['name'] == 'show_public_profile') {
            // template
            $form_row_template_pf = $system_obj->get_template('register_form_row_autoresponder_template');
            // set element place holders
            $form_template .= str_replace(array('[user_field_wrapper]', '[user_field_label]', '[user_field_element]'), array($wrapper_ph, $label_ph, $element_ph), $form_row_template_pf);
        } else {
            // set element name
            $form_template .= str_replace(array('[user_field_wrapper]', '[user_field_label]', '[user_field_element]'), array($wrapper_ph, $label_ph, $element_ph), $form_row_template);
        }
    }
    // get template filter, mgm_profile_form_template for edit, mgm_profile_form_template_view for public view
    $form_template = apply_filters('mgm_profile_form_template' . (!$edit_mode ? '_view' : ''), $form_template);
    // now replace and create the fields
    $form_html = $form_template;
    // get mgm_form_fields generator
    $form_fields = new mgm_form_fields(array('wordpres_form' => false));
    $arr_images = array();
    // loop custom fields to replace form labels/elements
    foreach ($cf_profile_page as $field) {
        // skip password in non edit mode
        //if(!$edit_mode && $field['name'] == 'password') continue;
        if (!$edit_mode && in_array($field['name'], array('password', 'password_conf'))) {
            continue;
        }
        if ($edit_mode && $field['type'] == 'image') {
            if (!in_array($field['name'], $arr_images)) {
                $arr_images[] = $field['name'];
            }
        }
        // field wrapper
        $wrapper_ph = sprintf('[user_field_wrapper_%s]', $field['name']);
        // field label
        $label_ph = sprintf('[user_field_label_%s]', $field['name']);
        // field/html element
        $element_ph = sprintf('[user_field_element_%s]', $field['name']);
        // edit mode
        if ($edit_mode) {
            // for username
            if ($field['name'] == 'username') {
                //localazing the label  issue# 617
                $label_lcz = mgm_stripslashes_deep($field['label']);
                $label_lcz = __($label_lcz, 'mgm');
                $field['label'] = sprintf('%s (<em>%s</em>)', $label_lcz, __('Username not changeable', 'mgm'));
            } elseif ($field['name'] == 'password') {
                //localazing the label  issue# 617
                $label_lcz = mgm_stripslashes_deep($field['label']);
                $label_lcz = __($label_lcz, 'mgm');
                $field['label'] = sprintf('%s (<em>%s</em>)', $label_lcz, __('Leave blank if don\'t wish to update', 'mgm'));
            }
        } else {
            // for display_name
            if ($field['name'] == 'display_name') {
                $field['label'] = __('Display Name', 'mgm');
            }
        }
        // replace wrapper
        $form_html = str_replace($wrapper_ph, $field['name'] . '_box', $form_html);
        //localazing the label  issue# 617
        $label_lcz = mgm_stripslashes_deep($field['label']);
        $label_lcz = __($label_lcz, 'mgm');
        // replace label(hidden) - issue #1050
        $form_html = str_replace($label_ph, $field['attributes']['hide_label'] ? '' : mgm_stripslashes_deep($field['label']), $form_html);
        // replace label
        $form_html = str_replace($label_ph, $label_lcz, $form_html);
        // selected value
        if (isset($profile_fields[$field['name']]) && isset($user->{$profile_fields}[$field['name']]['name'])) {
            // wp alias'
            // value
            $value = $user->{$profile_fields}[$field['name']]['name'];
            // birthdate
            if ($field['name'] == 'birthdate') {
                // convert saved date to input field format
                $value = mgm_get_datepicker_format('date', $value);
            } elseif ($field['type'] == 'checkbox') {
                //$options = preg_split('/[;,]/', $field['options']);
                //$value  = preg_split('/[;,\s]/', $value);
                //issue #1070
                $value = @unserialize($value);
                // pass " " as value to prevent the default value getting selected, if no option is selected
                $value = empty($value) ? " " : $value;
            }
        } else {
            if (isset($member->custom_fields->{$field}['name'])) {
                // custom field
                // value
                $value = $member->custom_fields->{$field}['name'];
                // birthdate
                if ($field['name'] == 'birthdate') {
                    // convert saved date to input field format
                    $value = mgm_get_datepicker_format('date', $value);
                } elseif ($field['type'] == 'checkbox') {
                    //$options = preg_split('/[;,]/', $field['options']);
                    //$value  = preg_split('/[;,\s]/', $value);
                    //issue #1070
                    $value = @unserialize($value);
                    // pass " " as value to prevent the default value getting selected, if no option is selected
                    $value = empty($value) ? " " : $value;
                }
                //issue #1484
                if ($field['name'] == 'show_public_profile' && $field['type'] == 'checkbox') {
                    $value = $member->custom_fields->{$field}['name'];
                }
            } else {
                if (isset($user->{$field}['name'])) {
                    // object var
                    // value
                    $value = $user->{$field}['name'];
                } else {
                    // none
                    // default
                    $value = '';
                }
            }
        }
        // dont set value for password
        if (in_array($field['name'], array('password', 'password_conf'))) {
            $value = '';
        }
        // disable username
        if ($field['name'] == 'username') {
            $field['attributes']['readonly'] = true;
        }
        // nickname
        if ($field['name'] == 'nickname') {
            $field['attributes']['required'] = true;
        }
        // edit mode
        if ($edit_mode) {
            if ($field['name'] == 'show_public_profile') {
                //echo "xxx".$form_fields->get_field_element($field,'mgm_profile_field',$value);
            }
            // replace element
            $form_html = str_replace($element_ph, $form_fields->get_field_element($field, 'mgm_profile_field', $value), $form_html);
        } else {
            // view
            // country
            if ($field['name'] == 'country') {
                $value = mgm_country_from_code($value);
            } elseif ($field['name'] == 'photo' && !empty($value)) {
                $value = sprintf('<img src="%s" alt="%s" >', $value, basename($value));
            }
            // replace element
            $form_html = str_replace($element_ph, $value, $form_html);
        }
    }
    // loop default fields to replace form elements
    foreach ($profile_fields as $field_key => $field) {
        // skip password in non edit mode
        //if(!$edit_mode && $field['name'] == 'user_password') continue;
        if (!$edit_mode && in_array($field['name'], array('user_password', 'user_password_conf'))) {
            continue;
        }
        $continue = false;
        foreach ($cf_noton_profile as $cffield) {
            if ($cffield['name'] == $field['name']) {
                $continue = true;
                break;
            }
        }
        if ($continue) {
            continue;
        }
        // field wrapper
        $wrapper_ph = sprintf('[user_field_wrapper_%s]', $field['name']);
        // field label
        $label_ph = sprintf('[user_field_label_%s]', $field['name']);
        // field/html element
        $element_ph = sprintf('[user_field_element_%s]', $field['name']);
        // edit mode
        if ($edit_mode) {
            // for username
            if ($field['name'] == 'user_login') {
                //localazing the label  issue# 617
                $label_lcz = mgm_stripslashes_deep($field['label']);
                $label_lcz = __($label_lcz, 'mgm');
                $field['label'] = sprintf('%s (<em>%s</em>)', $label_lcz, __('Username not changeable', 'mgm'));
            } elseif ($field['name'] == 'user_password') {
                //localazing the label  issue# 617
                $label_lcz = mgm_stripslashes_deep($field['label']);
                $label_lcz = __($label_lcz, 'mgm');
                $field['label'] = sprintf('%s (<em>%s</em>)', $label_lcz, __('Leave blank if don\'t wish to update', 'mgm'));
            }
        } else {
            // for display_name
            if ($field['name'] == 'display_name') {
                $field['label'] = __('Display Name', 'mgm');
            }
        }
        // replace wrapper
        $form_html = str_replace($wrapper_ph, $field['name'] . '_box', $form_html);
        //localazing the label  issue# 617
        $label_lcz = mgm_stripslashes_deep($field['label']);
        $label_lcz = __($label_lcz, 'mgm');
        // replace label
        $form_html = str_replace($label_ph, $label_lcz, $form_html);
        // selected value
        if (isset($user->{$field}['name'])) {
            // wp alias
            $value = $user->{$field}['name'];
        } else {
            if (isset($member->custom_fields->{$field_key})) {
                // custom field
                $value = $member->custom_fields->{$field_key};
            } else {
                // none
                $value = '';
            }
        }
        // dont set value for password
        //if($field['name'] == 'user_password') $value = '';
        if (in_array($field['name'], array('user_password', 'user_password_conf'))) {
            $value = '';
        }
        // edit mode
        if ($edit_mode) {
            // replace element
            $form_html = str_replace($element_ph, $form_fields->get_field_element($field, 'mgm_profile_field', $value), $form_html);
        } else {
            // country
            if ($field_key == 'country') {
                $value = mgm_country_from_code($value);
            }
            // set
            $form_html = str_replace($element_ph, $value, $form_html);
        }
    }
    // attach scripts
    $form_html .= mgm_attach_scripts(true, array());
    // range
    $yearRange = mgm_get_calendar_year_range();
    // append script
    $form_html .= '<script language="javascript">jQuery(document).ready(function(){try{mgm_date_picker(".mgm_date",false,{yearRange:"' . $yearRange . '", dateFormat: "' . mgm_get_datepicker_format() . '"});}catch(x){}});</script>';
    //include scripts for image upload:
    if (!empty($arr_images)) {
        $form_html .= mgm_upload_script_js('profileform', $arr_images);
    }
    // buttun
    $button_html = '';
    // button on edit
    if ($edit_mode && !$temp_edit) {
        // default
        $button_html = '<div><input class="button mgm-profile-button" type="submit" name="wp-submit" id="wp-submit" value="' . __('Update', 'mgm') . '" /></div>';
        // apply button filter
        $button_html = apply_filters('mgm_profile_form_button', $button_html);
    }
    //profile by membership - issue #1573
    if (isset($args['membership']) && !empty($args['membership'])) {
        // hidden
        $button_html .= sprintf('<input type="hidden" name="membership" value="%s">', $args['membership']);
    }
    // hidden
    $button_html .= '<input type="hidden" name="method" value="update_user">';
    // nonce
    $button_html .= wp_nonce_field('user_profile', '_mgmnonce_user_profile', true, false);
    // temp
    if (!$temp_edit) {
        // open
        $form_open = sprintf('<form class="mgm_form" name="profileform" id="profileform" action="%s" method="post">', $form_action);
        $form_close = '</form>';
    } else {
        $form_open = $form_close = '';
    }
    // output form
    $html = sprintf('<div class="mgm_prifile_form">%s %s %s %s %s</div>', $error_html, $form_open, $form_html, $button_html, $form_close);
    //issue #1113
    $html = mgm_stripslashes_deep($html);
    // filter
    $html = apply_filters('mgm_user_profile_form_html', $html, $current_user);
    //issue #1635
    $user_profile_html = '<div class="mgm_user_profile_container">' . $html . '</div>';
    // return
    return $user_profile_html;
}