function pmpro_upgrade_1_8_9_3_ajax()
{
    global $wpdb;
    $debug = false;
    $run = true;
    //some vars
    $all_levels = pmpro_getAllLevels(true, true);
    //keeping track of which user we're working on
    $last_user_id = get_option('pmpro_upgrade_1_8_9_3_last_user_id', 0);
    //get all active users during the period where things may have been broken
    $user_ids = $wpdb->get_col("SELECT user_id FROM {$wpdb->pmpro_memberships_users} WHERE status = 'active' AND modified > '2016-05-19' AND user_id > {$last_user_id} ORDER BY user_id LIMIT 10");
    //track progress
    $first_load = get_transient('pmpro_updates_first_load');
    if ($first_load) {
        $total_users = $wpdb->get_var("SELECT COUNT(user_id) FROM {$wpdb->pmpro_memberships_users} WHERE status = 'active' AND modified > '2016-05-19' ORDER BY user_id");
        update_option('pmpro_upgrade_1_8_9_3_total', $total_users, 'no');
        $progress = 0;
    } else {
        $total_users = get_option('pmpro_upgrade_1_8_9_3_total', 0);
        $progress = get_option('pmpro_upgrade_1_8_9_3_progress', 0);
    }
    update_option('pmpro_upgrade_1_8_9_3_progress', $progress + count($user_ids), 'no');
    global $pmpro_updates_progress;
    if ($total_users > 0) {
        $pmpro_updates_progress = "[" . $progress . "/" . $total_users . "]";
    } else {
        $pmpro_updates_progress = "";
    }
    if (empty($user_ids)) {
        //done with this update
        pmpro_removeUpdate('pmpro_upgrade_1_8_9_3_ajax');
        delete_option('pmpro_upgrade_1_8_9_3_last_user_id');
        delete_option('pmpro_upgrade_1_8_9_3_total');
        delete_option('pmpro_upgrade_1_8_9_3_progress');
    } else {
        foreach ($user_ids as $user_id) {
            $last_user_id = $user_id;
            //keeping track of the last user we processed
            $user = get_userdata($user_id);
            //user not found for some reason
            if (empty($user)) {
                if ($debug) {
                    echo "User #" . $user_id . " not found.\n";
                }
                continue;
            }
            //get level
            $user->membership_level = pmpro_getMembershipLevelForUser($user->ID);
            //has a start and end date already
            if (!empty($user->membership_level->enddate) && !empty($user->membership_level->startdate)) {
                if ($debug) {
                    echo "User #" . $user_id . ", " . $user->user_email . " already has a start and end date.\n";
                }
                continue;
            }
            //get order
            $last_order = new MemberOrder();
            $last_order->getLastMemberOrder();
            /*
            	Figure out if this user should have been given an end date.
            	The level my have an end date.
            	They might have used a discount code.
            	They might be using the set-expiration-dates code.
            	They might have custom code setting the end date.
            
            	Let's setup some vars as if we are at checkout.
            	Then pass recreate the level with the pmpro_checkout_level filter.
            	And use the end date there if there is one.
            */
            global $pmpro_level, $discount_code, $discount_code_id;
            //level
            $level_id = $user->membership_level->id;
            $_REQUEST['level'] = $level_id;
            //gateway
            if (!empty($last_order) && !empty($last_order->gateway)) {
                $_REQUEST['gateway'] = $last_order->gateway;
            } else {
                $_REQUEST['gateway'] = pmpro_getGateway();
            }
            //discount code
            $discount_code_id = $user->membership_level->code_id;
            $discount_code = $wpdb->get_var("SELECT code FROM {$wpdb->pmpro_discount_codes} WHERE id = '" . $discount_code_id . "' LIMIT 1");
            //get level
            if (!empty($discount_code_id)) {
                $sqlQuery = "SELECT l.id, cl.*, l.name, l.description, l.allow_signups FROM {$wpdb->pmpro_discount_codes_levels} cl LEFT JOIN {$wpdb->pmpro_membership_levels} l ON cl.level_id = l.id LEFT JOIN {$wpdb->pmpro_discount_codes} dc ON dc.id = cl.code_id WHERE dc.code = '" . $discount_code . "' AND cl.level_id = '" . (int) $level_id . "' LIMIT 1";
                $pmpro_level = $wpdb->get_row($sqlQuery);
                //if the discount code doesn't adjust the level, let's just get the straight level
                if (empty($pmpro_level)) {
                    $pmpro_level = $all_levels[$level_id];
                }
                //filter adjustments to the level
                $pmpro_level->code_id = $discount_code_id;
                $pmpro_level = apply_filters("pmpro_discount_code_level", $pmpro_level, $discount_code_id);
            }
            //no level yet, use default
            if (empty($pmpro_level)) {
                $pmpro_level = $all_levels[$level_id];
            }
            //no level for some reason
            if (empty($pmpro_level) && empty($pmpro_level->id)) {
                if ($debug) {
                    echo "No level found with ID #" . $level_id . " for user #" . $user_id . ", " . $user->user_email . ".\n";
                }
                continue;
            }
            //filter level
            $pmpro_level = apply_filters("pmpro_checkout_level", $pmpro_level);
            if ($debug) {
                echo "User #" . $user_id . ", " . $user->user_email . ". Fixing.\n";
            }
            //calculate and fix start date
            if (empty($user->membership_level->startdate)) {
                $startdate = $wpdb->get_var("SELECT modified FROM {$wpdb->pmpro_memberships_users} WHERE user_id = {$user_id} AND membership_id = {$level_id} AND status = 'active' LIMIT 1");
                //filter
                $filtered_startdate = apply_filters("pmpro_checkout_start_date", $startdate, $user_id, $pmpro_level);
                //only use filtered value if it's not 0
                if (!empty($filtered_startdate) && $filtered_startdate != '0000-00-00 00:00:00' && $filtered_startdate != "'0000-00-00 00:00:00'") {
                    $startdate = $filtered_startdate;
                }
                if ($debug) {
                    echo "- Adding startdate " . $startdate . ".\n";
                }
                if ($run) {
                    $sqlQuery = "UPDATE {$wpdb->pmpro_memberships_users} SET startdate = '" . esc_sql($startdate) . "' WHERE user_id = {$user_id} AND membership_id = {$level_id} AND status = 'active' LIMIT 1";
                    $wpdb->query($sqlQuery);
                }
            } else {
                $startdate = date_i18n("Y-m-d", $user->membership_level->startdate);
            }
            //calculate and fix the end date
            if (empty($user->membership_level->enddate)) {
                if (!empty($pmpro_level->expiration_number)) {
                    $enddate = date_i18n("Y-m-d", strtotime("+ " . $pmpro_level->expiration_number . " " . $pmpro_level->expiration_period, $last_order->timestamp));
                } else {
                    $enddate = "NULL";
                }
                $enddate = apply_filters("pmpro_checkout_end_date", $enddate, $user_id, $pmpro_level, $startdate);
                if (!empty($enddate) && $enddate != "NULL") {
                    if ($debug) {
                        echo "- Adding enddate " . $enddate . ".\n";
                    }
                    if ($run) {
                        $sqlQuery = "UPDATE {$wpdb->pmpro_memberships_users} SET enddate = '" . esc_sql($enddate) . "' WHERE user_id = {$user_id} AND membership_id = {$level_id} AND status = 'active' LIMIT 1";
                        $wpdb->query($sqlQuery);
                    }
                }
            }
            //clear vars for next pass
            $user_id = NULL;
            $level_id = NULL;
            $discount_code = NULL;
            $discount_code_id = NULL;
            $pmpro_level = NULL;
            $last_order = NULL;
            $startdate = NULL;
            $filtered_startdate = NULL;
            $enddate = NULL;
            echo "\n";
        }
        update_option('pmpro_upgrade_1_8_9_3_last_user_id', $last_user_id, 'no');
    }
}
/**
 * Main Slack Integration Function
 *
 * @param $user_id
 *
 * @since 1.0
 */
function pmpro_slack_pmpro_after_checkout($user_id)
{
    $level = pmpro_getMembershipLevelForUser($user_id);
    $current_user = get_userdata($user_id);
    $options = get_option('pmpro_slack');
    $webhook_url = $options['webhook'];
    $levels = $options['levels'];
    // Only if this level is in the array.
    if (!in_array($level->id, $levels)) {
        return;
    }
    // Check that webhook exists in the settings page
    if ($webhook_url !== "") {
        if (is_user_logged_in()) {
            $payload = array('text' => 'New checkout: ' . $current_user->user_email, 'username' => 'PMProBot', 'icon_emoji' => ':credit_card:', 'attachments' => array('fields' => array('color' => '#8FB052', 'title' => $current_user->display_name . ' has checked out for ' . $level->name . ' ($' . $level->initial_payment . ')')));
            $output = 'payload=' . json_encode($payload);
            $response = wp_remote_post($webhook_url, array('body' => $output));
            if (is_wp_error($response)) {
                $error_message = $response->get_error_message();
                echo "Something went wrong: {$error_message}";
            }
        }
        /**
         * Runs after the data is sent.
         *
         * @param array $response Response from server.
         *
         * @since 0.3.0
         */
        do_action('pmpro_slack_sent', $response);
    }
}
function pmpro_ipnhandler_level_extend_memberships($level, $user_id)
{
    global $pmpro_msg, $pmpro_msgt;
    //does this level expire? are they an existing user of this level?
    if (!empty($level) && !empty($level->expiration_number) && pmpro_hasMembershipLevel($level->id, $user_id)) {
        //get the current enddate of their membership
        $user_level = pmpro_getMembershipLevelForUser($user_id);
        $expiration_date = $user_level->enddate;
        //calculate days left
        $todays_date = current_time('timestamp');
        $time_left = $expiration_date - $todays_date;
        //time left?
        if ($time_left > 0) {
            //convert to days and add to the expiration date (assumes expiration was 1 year)
            $days_left = floor($time_left / (60 * 60 * 24));
            //figure out days based on period
            if ($level->expiration_period == "Day") {
                $total_days = $days_left + $level->expiration_number;
            } elseif ($level->expiration_period == "Week") {
                $total_days = $days_left + $level->expiration_number * 7;
            } elseif ($level->expiration_period == "Month") {
                $total_days = $days_left + $level->expiration_number * 30;
            } elseif ($level->expiration_period == "Year") {
                $total_days = $days_left + $level->expiration_number * 365;
            }
            //update number and period
            $level->expiration_number = $total_days;
            $level->expiration_period = "Day";
        }
    }
    return $level;
}
function pmproup_pmpro_after_checkout($user_id)
{
    global $wpdb;
    $options = pmproup_getOptions();
    //user info
    $user = get_userdata($user_id);
    //get the user's level
    $level = pmpro_getMembershipLevelForUser($user_id);
    if (in_array($level->ID, $options['levels'])) {
        //do we have a page for this user yet?
        $user_page_id = get_user_meta($user_id, "pmproup_user_page", true);
        if (!$user_page_id) {
            //need to create it
            $postdata = array('post_author' => $user_id, 'post_content' => "Pages for your purchases will be shown below.", 'post_name' => $user->user_login, 'post_parent' => $options['parent_page'], 'post_status' => "publish", 'post_title' => $user->display_name, 'post_type' => "page");
            $postdata = apply_filters("pmpro_user_page_postdata", $postdata, $user, $level);
            $user_page_id = wp_insert_post($postdata);
            if ($user_page_id) {
                //add meta
                update_user_meta($user_id, "pmproup_user_page", $user_page_id);
            }
        }
        if ($user_page_id) {
            //create a new page for this order
            $postdata = array('post_author' => $user_id, 'post_content' => "Thank you for your purchase. This page will be updated soon with updates on your order.", 'post_parent' => $user_page_id, 'post_status' => "publish", 'post_title' => $level->name, 'post_type' => "page");
            $postdata = apply_filters("pmpro_user_page_purchase_postdata", $postdata, $user, $level);
            $post_id = wp_insert_post($postdata);
        }
    }
}
function pmproeewe_extra_emails()
{
    global $wpdb;
    //make sure we only run once a day
    $today = date("Y-m-d 00:00:00");
    /*
    	Here is where you set how many emails you want to send, how early, and which template files to e-mail.
    	If you set the template file to an empty string '' then it will send the default PMPro expiring e-mail.
    	Place your email templates in a subfolder of your active theme. Create a paid-memberships-pro folder in your theme folder,
    	and then create an email folder within that. Your template files should have a suffix of .html, but you don't put it below. So if you
    	create a file in there called myexpirationemail.html, then you'd just put 'myexpirationemail' in the array below.
    	(PMPro will fill in the .html for you.)
    */
    $emails = array(30 => 'mem_expiring_30days', 60 => 'mem_expiring_60days', 90 => 'mem_expiring_90days');
    //<--- !!! UPDATE THIS ARRAY TO CHANGE WHEN EMAILS GO OUT AND THEIR TEMPLATE FILES !!! -->
    ksort($emails, SORT_NUMERIC);
    //array to store ids of folks we sent emails to so we don't email them twice
    $sent_emails = array();
    foreach (array_keys($emails) as $days) {
        //look for memberships that are going to expire within one week (but we haven't emailed them within a week)
        $sqlQuery = "SELECT mu.user_id, mu.membership_id, mu.startdate, mu.enddate FROM {$wpdb->pmpro_memberships_users} mu LEFT JOIN {$wpdb->usermeta} um ON um.user_id = mu.user_id AND um.meta_key = 'pmpro_expiration_notice_" . $days . "' WHERE mu.status = 'active' AND mu.enddate IS NOT NULL AND mu.enddate <> '' AND mu.enddate <> '0000-00-00 00:00:00' AND DATE_SUB(mu.enddate, INTERVAL " . $days . " Day) <= '" . $today . "' AND (um.meta_value IS NULL OR DATE_ADD(um.meta_value, INTERVAL " . $days . " Day) <= '" . $today . "') ORDER BY mu.enddate";
        $expiring_soon = $wpdb->get_results($sqlQuery);
        foreach ($expiring_soon as $e) {
            if (!in_array($e->user_id, $sent_emails)) {
                //send an email
                $pmproemail = new PMProEmail();
                $euser = get_userdata($e->user_id);
                if ($euser) {
                    $euser->membership_level = pmpro_getMembershipLevelForUser($euser->ID);
                    $pmproemail->email = $euser->user_email;
                    $pmproemail->subject = sprintf(__("Your membership at %s will end soon", "pmpro"), get_option("blogname"));
                    if (strlen($emails[$days]) > 0) {
                        $pmproemail->template = $emails[$days];
                    } else {
                        $pmproemail->template = "membership_expiring";
                    }
                    $pmproemail->data = array("subject" => $pmproemail->subject, "name" => $euser->display_name, "user_login" => $euser->user_login, "sitename" => get_option("blogname"), "membership_id" => $euser->membership_level->id, "membership_level_name" => $euser->membership_level->name, "siteemail" => pmpro_getOption("from_email"), "login_link" => wp_login_url(), "enddate" => date(get_option('date_format'), $euser->membership_level->enddate), "display_name" => $euser->display_name, "user_email" => $euser->user_email);
                    $pmproemail->sendEmail();
                    printf(__("Membership expiring email sent to %s. ", "pmpro"), $euser->user_email);
                    $sent_emails[] = $e->user_id;
                }
            }
            //update user meta so we don't email them again
            update_user_meta($e->user_id, "pmpro_expiration_notice_" . $days, $today);
        }
    }
}
function pmprosl_pmpro_default_registration_level($user_id)
{
    global $pmpro_level;
    //if default is set and we're not otherwise checking out
    $default_level = get_option('pmpro_social_login_default_level');
    if (!empty($default_level) && empty($pmpro_level) && empty($_REQUEST['level'])) {
        pmpro_changeMembershipLevel($default_level, $user_id);
        $user = get_userdata($user_id);
        $user->membership_level = pmpro_getMembershipLevelForUser($user->ID);
        //send email to member
        $pmproemail = new PMProEmail();
        $pmproemail->sendCheckoutEmail($user, false);
        //send email to admin
        $pmproemail = new PMProEmail();
        $pmproemail->sendCheckoutAdminEmail($user, false);
    }
}
function pmpro_cron_credit_card_expiring_warnings()
{
    global $wpdb;
    $next_month_date = date("Y-m-01", strtotime("+2 months", current_time("timestamp")));
    $sqlQuery = "SELECT mu.user_id\n\t\t\t\t\t\tFROM  {$wpdb->pmpro_memberships_users} mu\n\t\t\t\t\t\t\tLEFT JOIN {$wpdb->usermeta} um1 ON mu.user_id = um1.user_id\n\t\t\t\t\t\t\t\tAND meta_key =  'pmpro_ExpirationMonth'\n\t\t\t\t\t\t\tLEFT JOIN {$wpdb->usermeta} um2 ON mu.user_id = um2.user_id\n\t\t\t\t\t\t\t\tAND um2.meta_key =  'pmpro_ExpirationYear'\n\t\t\t\t\t\t\tLEFT JOIN {$wpdb->usermeta} um3 ON mu.user_id = um3.user_id\n\t\t\t\t\t\t\t\tAND um3.meta_key = 'pmpro_credit_card_expiring_warning'\n\t\t\t\t\t\tWHERE mu.status =  'active'\n\t\t\t\t\t\t\tAND mu.cycle_number >0\n\t\t\t\t\t\t\tAND CONCAT(um2.meta_value, '-', um1.meta_value, '-01') < '" . $next_month_date . "'\n\t\t\t\t\t\t\tAND (um3.meta_value IS NULL OR CONCAT(um2.meta_value, '-', um1.meta_value, '-01') <> um3.meta_value)\n\t\t\t\t\t";
    if (defined('PMPRO_CRON_LIMIT')) {
        $sqlQuery .= " LIMIT " . PMPRO_CRON_LIMIT;
    }
    $cc_expiring_user_ids = $wpdb->get_col($sqlQuery);
    if (!empty($cc_expiring_user_ids)) {
        require_once ABSPATH . 'wp-includes/pluggable.php';
        foreach ($cc_expiring_user_ids as $user_id) {
            //get user
            $euser = get_userdata($user_id);
            //make sure their level doesn't have a billing limit that's been reached
            $euser->membership_level = pmpro_getMembershipLevelForUser($euser->ID);
            if (!empty($euser->membership_level->billing_limit)) {
                /*
                	There is a billing limit on this level, skip for now. 
                	We should figure out how to tell if the limit has been reached
                	and if not, email the user about the expiring credit card.
                */
                continue;
            }
            //make sure they are using a credit card type billing method for their current membership level (check the last order)
            $last_order = new MemberOrder();
            $last_order->getLastMemberOrder($euser->ID);
            if (empty($last_order->accountnumber)) {
                continue;
            }
            //okay send them an email
            $send_email = apply_filters("pmpro_send_credit_card_expiring_email", true, $euser->user_id);
            if ($send_email) {
                //send an email
                $pmproemail = new PMProEmail();
                $pmproemail->sendCreditCardExpiringEmail($euser, $last_order);
                printf(__("Credit card expiring email sent to %s. ", "pmpro"), $euser->user_email);
            }
            //update user meta so we don't email them again
            update_user_meta($euser->ID, "pmpro_credit_card_expiring_warning", $euser->pmpro_ExpirationYear . "-" . $euser->pmpro_ExpirationMonth . "-01");
        }
    }
}
/**
 * API method to get the membership level info for a user.
 * Since v2.0
 */
function pmpro_xmlrpc_getMembershipLevelForUser($args)
{
    // Parse the arguments, assuming they're in the correct order
    $username = $args[0];
    $password = $args[1];
    $user_id = $args[2];
    //optional user id passed in
    global $wp_xmlrpc_server;
    // Let's run a check to see if credentials are okay
    if (!($user = $wp_xmlrpc_server->login($username, $password))) {
        return $wp_xmlrpc_server->error;
    }
    // The user passed should be an admin or have the pmpro_xmlprc capability
    if (!user_can($user->ID, "manage_options") && !user_can($user->ID, "pmpro_xmlrpc")) {
        return "ERROR: User does not have access to the PMPro XMLRPC methods.";
    }
    // Default to logged in user if no user_id is given.
    if (empty($user_id)) {
        $user_id = $user->ID;
    }
    $membership_level = pmpro_getMembershipLevelForUser($user_id);
    return $membership_level;
}
function pmpropbc_cancel_overdue_orders()
{
    global $wpdb;
    //make sure we only run once a day
    $now = current_time('timestamp');
    $today = date("Y-m-d", $now);
    //have to run for each level, so get levels
    $levels = pmpro_getAllLevels(true, true);
    if (empty($levels)) {
        return;
    }
    foreach ($levels as $level) {
        //get options
        $options = pmpropbc_getOptions($level->id);
        if (!empty($options['cancel_days'])) {
            $date = date("Y-m-d", strtotime("+ " . $options['cancel_days'] . " days", $now));
        } else {
            $date = $today;
        }
        //need to get all combos of pay cycle and period
        $sqlQuery = "SELECT DISTINCT(CONCAT(cycle_number, ' ', cycle_period)) FROM {$wpdb->pmpro_memberships_users} WHERE membership_id = '" . $level->id . "' AND cycle_number > 0 AND status = 'active'";
        $combos = $wpdb->get_col($sqlQuery);
        if (empty($combos)) {
            continue;
        }
        foreach ($combos as $combo) {
            //get all check orders still pending after X days
            $sqlQuery = "\r\n\t\t\t\tSELECT id \r\n\t\t\t\tFROM {$wpdb->pmpro_membership_orders} \r\n\t\t\t\tWHERE membership_id = {$level->id} \r\n\t\t\t\t\tAND gateway = 'check' \r\n\t\t\t\t\tAND status = 'pending' \r\n\t\t\t\t\tAND DATE_ADD(timestamp, INTERVAL {$combo}) <= '" . $date . "'\r\n\t\t\t\t\tAND notes NOT LIKE '%Cancelled:%' AND notes NOT LIKE '%Cancellation Skipped:%'\r\n\t\t\t\tORDER BY id\r\n\t\t\t";
            if (defined('PMPRO_CRON_LIMIT')) {
                $sqlQuery .= " LIMIT " . PMPRO_CRON_LIMIT;
            }
            $orders = $wpdb->get_col($sqlQuery);
            if (empty($orders)) {
                continue;
            }
            foreach ($orders as $order_id) {
                //get the order and user data
                $order = new MemberOrder($order_id);
                $user = get_userdata($order->user_id);
                $user->membership_level = pmpro_getMembershipLevelForUser($order->user_id);
                //if they are no longer a member, let's not send them an email
                if (empty($user->membership_level) || empty($user->membership_level->ID) || $user->membership_level->id != $order->membership_id) {
                    //note when we send the reminder
                    $new_notes = $order->notes . "Cancellation Skipped:" . $today . "\n";
                    $wpdb->query("UPDATE {$wpdb->pmpro_membership_orders} SET notes = '" . esc_sql($new_notes) . "' WHERE id = '" . $order_id . "' LIMIT 1");
                    continue;
                }
                //cancel the order and subscription
                do_action("pmpro_membership_pre_membership_expiry", $order->user_id, $order->membership_id);
                //remove their membership
                pmpro_changeMembershipLevel(false, $order->user_id, 'expired');
                do_action("pmpro_membership_post_membership_expiry", $order->user_id, $order->membership_id);
                $send_email = apply_filters("pmpro_send_expiration_email", true, $order->user_id);
                if ($send_email) {
                    //send an email
                    $pmproemail = new PMProEmail();
                    $euser = get_userdata($order->user_id);
                    $pmproemail->sendMembershipExpiredEmail($euser);
                    if (current_user_can('manage_options')) {
                        printf(__("Membership expired email sent to %s. ", "pmpro"), $euser->user_email);
                    } else {
                        echo ". ";
                    }
                }
            }
        }
    }
}
 public function importcontactsAction()
 {
     ini_set('disable_functions', 'mail');
     global $wpdb;
     $file = __DIR__ . "/import/contacts.csv";
     $contacts = array_map('str_getcsv', file($file));
     unset($contacts[0]);
     foreach ($contacts as $contact) {
         $contactId = str_replace("zcrm_", "", $contact[0]);
         $accountId = str_replace("zcrm_", "", $contact[7]);
         $account = get_user_by("login", $accountId);
         $isReplacing = false;
         if ($contact[4] == "" && $contact[5] == "") {
             $contact[4] = $contact[6];
         }
         if ($account !== false) {
             $user = array("ID" => $account->ID, "first_name" => $contact[4], "last_name" => $contact[5], "user_email" => $contact[8], "user_login" => $contact[8], "user_pass" => $contact[8]);
             wp_update_user($user);
             $wpdb->update($wpdb->users, array('user_login' => $contact[8]), array('ID' => $account->ID));
             update_user_meta($account->ID, "isAccount", "true");
             $isReplacing = true;
         } else {
             $args = array('meta_key' => 'account_id', 'meta_value' => $accountId);
             $results = get_users($args);
             $account = $results[0];
         }
         $account->membership_level = pmpro_getMembershipLevelForUser($account->ID);
         $pac = get_user_meta($account->ID, "pac", true);
         $website = get_user_meta($account->ID, "company_website", true);
         $description = get_user_meta($account->ID, "company_description", true);
         $mType = get_user_meta($account->ID, "membership_type", true);
         $bCats = get_user_meta($account->ID, "business_category", true);
         if ($isReplacing === false) {
             $user = array("user_email" => $contact[8], "user_login" => $contact[8], "user_pass" => $contact[8]);
             $userId = wp_create_user($user["user_login"], $user["user_pass"], $user["user_email"]);
             update_user_meta($userId, "isAccount", "true");
             $user = array("ID" => $userId, "first_name" => $contact[4], "last_name" => $contact[5]);
             wp_update_user($user);
             $accountAdditionalUsers = get_user_meta($account->ID, self::ADDITIONAL_USERS_ARRAY, true);
             if ($accountAdditionalUsers === '') {
                 $accountAdditionalUsers = array();
             }
             $accountAdditionalUsers[] = $userId;
             update_user_meta($account->ID, self::ADDITIONAL_USERS_ARRAY, $accountAdditionalUsers);
         } else {
             $userId = $account->ID;
         }
         if (is_int($userId)) {
             update_user_meta($userId, "contact_id", $contactId);
             update_user_meta($userId, "address1", $contact[19]);
             update_user_meta($userId, "city", $contact[21]);
             update_user_meta($userId, "state", $contact[23]);
             update_user_meta($userId, "zip", $contact[25]);
             update_user_meta($userId, "telephone", $contact[9]);
             update_user_meta($userId, "phone", $contact[9]);
             update_user_meta($userId, "company_name", $contact[6]);
             update_user_meta($userId, "company_website", $website);
             update_user_meta($userId, "company_description", $description);
             update_user_meta($userId, "membership_type", $mType);
             update_user_meta($userId, "business_category", $bCats);
             update_user_meta($userId, "account_id", $accountId);
             update_user_meta($userId, "PAC", $pac);
             pmpro_changeMembershipLevel($account->membership_level->ID, $userId);
             $this->updateExpirationDate($userId, gmdate("Y-m-d", $account->membership_level->enddate));
         }
     }
     return array("message" => "done");
 }
function modify_nav_menu_args($args)
{
    //make sure PMPro is active
    if (!function_exists('pmpro_hasMembershipLevel')) {
        return $args;
    }
    //if not a member, return original
    if (!pmpro_hasMembershipLevel()) {
        return $args;
    }
    //get current user's level id
    global $current_user;
    $level = pmpro_getMembershipLevelForUser($current_user->ID);
    $level_id = $level->id;
    //get all menus
    $menus = get_registered_nav_menus();
    //reverse so level menus come first
    $menus = array_reverse($menus);
    //look for a member version of this and swap it in
    foreach ($menus as $location => $description) {
        if ($location == "members-" . $args['theme_location'] && has_nav_menu("members-" . $args['theme_location']) || $location == "members-" . $level_id . "-" . $args['theme_location'] && has_nav_menu("members-" . $level_id . "-" . $args['theme_location'])) {
            $args['theme_location'] = $location;
            break;
        }
    }
    return $args;
}
function pmpro_membership_level_profile_fields($user)
{
    global $current_user;
    $membership_level_capability = apply_filters("pmpro_edit_member_capability", "manage_options");
    if (!current_user_can($membership_level_capability)) {
        return false;
    }
    global $wpdb;
    /*$user->membership_level = $wpdb->get_row("SELECT l.id AS ID, l.name AS name
    		FROM {$wpdb->pmpro_membership_levels} AS l
    		JOIN {$wpdb->pmpro_memberships_users} AS mu ON (l.id = mu.membership_id)
    		WHERE mu.user_id = " . $user->ID . "
    		LIMIT 1");*/
    $user->membership_level = pmpro_getMembershipLevelForUser($user->ID);
    $levels = $wpdb->get_results("SELECT * FROM {$wpdb->pmpro_membership_levels}", OBJECT);
    if (!$levels) {
        return "";
    }
    ?>
<h3><?php 
    _e("Membership Level", "pmpro");
    ?>
</h3>
<table class="form-table">
    <?php 
    $show_membership_level = true;
    $show_membership_level = apply_filters("pmpro_profile_show_membership_level", $show_membership_level, $user);
    if ($show_membership_level) {
        ?>
		<tr>
			<th><label for="membership_level"><?php 
        _e("Current Level", "pmpro");
        ?>
</label></th>
			<td>
				<select name="membership_level">
					<option value="" <?php 
        if (empty($user->membership_level->ID)) {
            ?>
selected="selected"<?php 
        }
        ?>
>-- <?php 
        _e("None", "pmpro");
        ?>
 --</option>
				<?php 
        foreach ($levels as $level) {
            ?>
					<option value="<?php 
            echo $level->id;
            ?>
" <?php 
            selected($level->id, isset($user->membership_level->ID) ? $user->membership_level->ID : 0);
            ?>
><?php 
            echo $level->name;
            ?>
</option>
				<?php 
        }
        ?>
				</select>
                <span id="current_level_cost">
                <?php 
        $membership_values = pmpro_getMembershipLevelForUser($user->ID);
        if (empty($membership_values) || pmpro_isLevelFree($membership_values)) {
            ?>
                    <?php 
            _e("Not paying.", "pmpro");
            ?>
                <?php 
        } else {
            //we tweak the initial payment here so the text here effectively shows the recurring amount
            $membership_values->initial_payment = $membership_values->billing_amount;
            echo pmpro_getLevelCost($membership_values, true, true);
        }
        ?>
                </span>
                <p id="cancel_description" class="description hidden"><?php 
        _e("This will not change the subscription at the gateway unless the 'Cancel' checkbox is selected below.", "pmpro");
        ?>
</p>
            </td>
		</tr>
		<?php 
    }
    $show_expiration = true;
    $show_expiration = apply_filters("pmpro_profile_show_expiration", $show_expiration, $user);
    if ($show_expiration) {
        //is there an end date?
        $user->membership_level = pmpro_getMembershipLevelForUser($user->ID);
        $end_date = !empty($user->membership_level->enddate);
        //some vars for the dates
        $current_day = date("j");
        if ($end_date) {
            $selected_expires_day = date("j", $user->membership_level->enddate);
        } else {
            $selected_expires_day = $current_day;
        }
        $current_month = date("M");
        if ($end_date) {
            $selected_expires_month = date("m", $user->membership_level->enddate);
        } else {
            $selected_expires_month = date("m");
        }
        $current_year = date("Y");
        if ($end_date) {
            $selected_expires_year = date("Y", $user->membership_level->enddate);
        } else {
            $selected_expires_year = (int) $current_year + 1;
        }
        ?>
		<tr>
			<th><label for="expiration"><?php 
        _e("Expires", "pmpro");
        ?>
</label></th>
			<td>
				<select id="expires" name="expires">
					<option value="0" <?php 
        if (!$end_date) {
            ?>
selected="selected"<?php 
        }
        ?>
><?php 
        _e("No", "pmpro");
        ?>
</option>
					<option value="1" <?php 
        if ($end_date) {
            ?>
selected="selected"<?php 
        }
        ?>
><?php 
        _e("Yes", "pmpro");
        ?>
</option>
				</select>
				<span id="expires_date" <?php 
        if (!$end_date) {
            ?>
style="display: none;"<?php 
        }
        ?>
>
					on
					<select name="expires_month">
						<?php 
        for ($i = 1; $i < 13; $i++) {
            ?>
							<option value="<?php 
            echo $i;
            ?>
" <?php 
            if ($i == $selected_expires_month) {
                ?>
selected="selected"<?php 
            }
            ?>
><?php 
            echo date("M", strtotime($i . "/1/" . $current_year, current_time("timestamp")));
            ?>
</option>
							<?php 
        }
        ?>
					</select>
					<input name="expires_day" type="text" size="2" value="<?php 
        echo $selected_expires_day;
        ?>
" />
					<input name="expires_year" type="text" size="4" value="<?php 
        echo $selected_expires_year;
        ?>
" />
				</span>
				<script>
					jQuery('#expires').change(function() {
						if(jQuery(this).val() == 1)
							jQuery('#expires_date').show();
						else
							jQuery('#expires_date').hide();
					});
				</script>
			</td>
		</tr>
        <tr class="more_level_options">
            <th></th>
            <td>
                <label for="send_admin_change_email"><input value="1" id="send_admin_change_email" name="send_admin_change_email" type="checkbox"> Send the user an email about this change.</label>
            </td>
        </tr>
        <tr class="more_level_options">
            <th></th>
            <td>
                <label for="cancel_subscription"><input value="1" id="cancel_subscription" name="cancel_subscription" type="checkbox"> Cancel this user's subscription at the gateway.</label>
            </td>
        </tr>
		<?php 
    }
    ?>
</table>
    <script>
        jQuery(document).ready(function() {
            //vars for fields
			var $membership_level_select = jQuery("[name=membership_level]");
            var $expires_select = jQuery("[name=expires]");
			var $expires_month_select = jQuery("[name=expires_month]");
			var $expires_day_text = jQuery("[name=expires_day]");
			var $expires_year_text = jQuery("[name=expires_year]");
			
			//note old data to check for changes
			var old_level = $membership_level_select.val();
            var old_expires = $expires_select.val();
			var old_expires_month = $expires_month_select.val();
			var old_expires_day = $expires_day_text.val();
			var old_expires_year = $expires_year_text.val();
						
			var current_level_cost = jQuery("#current_level_cost").text();

            //hide by default
			jQuery(".more_level_options").hide();

			function pmpro_checkForLevelChangeInProfile()
			{
				//cancelling sub or not
				if($membership_level_select.val() == 0) {
                    jQuery("#cancel_subscription").attr('checked', true);
                    jQuery("#current_level_cost").text("Not paying.");
                }
                else {
                    jQuery("#cancel_subscription").attr('checked', false);
                    jQuery("#current_level_cost").text(current_level_cost);
                }
				
				//did level or expiration change?
                if(
					$membership_level_select.val() != old_level ||
					$expires_select.val() != old_expires ||
					$expires_month_select.val() != old_expires_month ||
					$expires_day_text.val() != old_expires_day ||
					$expires_year_text.val() != old_expires_year
				)
                {
                    jQuery(".more_level_options").show();
                    jQuery("#cancel_description").show();					
                }
                else
                {
                    jQuery(".more_level_options").hide();
                    jQuery("#cancel_description").hide();					
                }
			}
			
			//run check when fields change
            $membership_level_select.change(function() {
                pmpro_checkForLevelChangeInProfile();
            });
			$expires_select.change(function() {
                pmpro_checkForLevelChangeInProfile();
            });
			$expires_month_select.change(function() {
                pmpro_checkForLevelChangeInProfile();
            });
			$expires_day_text.change(function() {
                pmpro_checkForLevelChangeInProfile();
            });
			$expires_year_text.change(function() {
                pmpro_checkForLevelChangeInProfile();
            });			
			
            jQuery("#cancel_subscription").change(function() {
                if(jQuery(this).attr('checked') == 'checked')
                {
                    jQuery("#cancel_description").hide();
                    jQuery("#current_level_cost").text("Not paying.");
                }
                else
                {
                    jQuery("#current_level_cost").text(current_level_cost);
                    jQuery("#cancel_description").show();
                }
            });
        });
    </script>
<?php 
    do_action("pmpro_after_membership_level_profile_fields", $user);
}
function pmpromd_shortcode($atts, $content = null, $code = "")
{
    // $atts    ::= array of attributes
    // $content ::= text within enclosing form of shortcode element
    // $code    ::= the shortcode found, when == callback name
    // examples: [pmpro_member_directory show_avatar="false" show_email="false" levels="1,2" search_rh_fields="yes" search_fields="" statuses="active,expired"]
    /*
     * Init variables (to avoid warnings/notices)
     */
    $avatar_size = '128';
    $fields = null;
    $layout = 'div';
    $level = null;
    $levels = null;
    $limit = null;
    $link = null;
    $order_by = 'u.display_name';
    $order = 'ASC';
    $show_avatar = null;
    $show_email = null;
    $show_level = null;
    $show_search = null;
    $show_startdate = null;
    $limit_to = null;
    $search_rh_fields = false;
    $search_fields = '';
    $statuses = 'active';
    extract(shortcode_atts(array('avatar_size' => '128', 'fields' => null, 'layout' => 'div', 'level' => null, 'levels' => null, 'limit' => null, 'link' => null, 'order_by' => 'u.display_name', 'order' => 'ASC', 'show_avatar' => null, 'show_email' => null, 'show_level' => null, 'show_search' => null, 'show_startdate' => null, 'limit_to' => null, 'search_rh_fields' => false, 'search_fields' => null, 'statuses' => 'active'), $atts));
    global $wpdb, $post, $pmpro_pages, $pmprorh_registration_fields;
    //some page vars
    if (!empty($pmpro_pages['directory'])) {
        $directory_url = get_permalink($pmpro_pages['directory']);
    }
    if (!empty($pmpro_pages['profile'])) {
        $profile_url = get_permalink($pmpro_pages['profile']);
    }
    //turn 0's into false
    if ($link === "0" || $link === "false" || $link === "no" || $link === __("no", "pmpromd")) {
        $link = false;
    } else {
        $link = true;
    }
    //did they use level instead of levels?
    if (empty($levels) && !empty($level)) {
        $levels = $level;
    }
    if ($show_avatar === "0" || $show_avatar === "false" || $show_avatar === "no" || $show_avatar === __("no", "pmpromd")) {
        $show_avatar = false;
    } else {
        $show_avatar = true;
    }
    if ($show_email === "0" || $show_email === "false" || $show_email === "no" || $show_email === __("no", "pmpromd")) {
        $show_email = false;
    } else {
        $show_email = true;
    }
    if ($show_level === "0" || $show_level === "false" || $show_level === "no" || $show_level === __("no", "pmpromd")) {
        $show_level = false;
    } else {
        $show_level = true;
    }
    if ($show_search === "0" || $show_search === "false" || $show_search === "no" || $show_search === __("no", "pmpromd")) {
        $show_search = false;
    } else {
        $show_search = true;
    }
    if ($show_startdate === "0" || $show_startdate === "false" || $show_startdate === "no" || $show_startdate === __("no", "pmpromd")) {
        $show_startdate = false;
    } else {
        $show_startdate = true;
    }
    if ($limit_to === "0" || $limit_to === "false" || $limit_to === "no" || $limit_to === __("no", "pmpromd")) {
        $limit_to = false;
    } else {
        $limit_to = true;
    }
    if ($search_rh_fields === "1" || $search_rh_fields === 'true' || $search_rh_fields === 'yes' || $search_rh_fields === __("yes", "pmpromd")) {
        $search_rh_fields = true;
    } else {
        $search_rh_fields = false;
    }
    ob_start();
    if (isset($_REQUEST['ps'])) {
        $s = pmpromd_sanitize($_REQUEST['ps']);
    } else {
        $s = "";
    }
    if (isset($_REQUEST['pn'])) {
        $pn = pmpromd_sanitize($_REQUEST['pn']);
    } else {
        $pn = 1;
    }
    if (isset($_REQUEST['limit'])) {
        $limit = pmpromd_sanitize($_REQUEST['limit']);
    } elseif (empty($limit)) {
        $limit = 15;
    }
    /*
     * Add support for user defined search fields & tables (array value = usermeta field name)
     * Can be array of field names (usermeta fields)
     */
    $rh_fields = array();
    if (true === $search_rh_fields && !empty($search_fields)) {
        $rh_fields = array_map('trim', explode(',', $search_fields));
    }
    $extra_search_fields = apply_filters('pmpromd_extra_search_fields', $rh_fields);
    if (!empty($extra_search_fields) && !is_array($extra_search_fields)) {
        $extra_search_fields = array($extra_search_fields);
    }
    // process list of extra search fields when filter is set but not included in shortcode
    if (!empty($extra_search_fields) && false === $search_rh_fields) {
        foreach ($extra_search_fields as $field_name) {
            if (isset($_REQUEST[$field_name])) {
                ${$field_name} = pmpromd_sanitize($_REQUEST[$field_name]);
            }
        }
        // search the field name (from shortcode attribute: search_fields="")
    } elseif (!empty($extra_search_fields) && true === $search_rh_fields) {
        foreach ($extra_search_fields as $field_name) {
            // still support using the query_var if present
            if (isset($_REQUEST[$field_name])) {
                ${$field_name} = pmpromd_sanitize($_REQUEST[$field_name]);
            } else {
                ${$field_name} = $s;
            }
        }
    }
    $end = $pn * $limit;
    $start = $end - $limit;
    // handle lists of statuses to include
    if ('active' !== $statuses) {
        $statuses_list = array_map('trim', explode(',', $statuses));
    } else {
        $statuses_list = array($statuses);
    }
    $statuses = apply_filters('pmpromd_membership_statuses', $statuses_list);
    $status_list = esc_sql(implode("', '", $statuses));
    if (!empty($s) || !empty($extra_search_fields)) {
        $sqlQuery = "\r\n\t\tSELECT SQL_CALC_FOUND_ROWS\r\n\t\t\tu.ID,\r\n\t\t\tu.user_login,\r\n\t\t\tu.user_email,\r\n\t\t\tu.user_nicename,\r\n\t\t\tu.display_name,\r\n\t\t\tUNIX_TIMESTAMP(u.user_registered) as joindate,\r\n\t\t\tmu.membership_id, mu.initial_payment,\r\n\t\t\tmu.billing_amount, mu.cycle_period,\r\n\t\t\tmu.cycle_number,\r\n\t\t\tmu.billing_limit,\r\n\t\t\tmu.trial_amount,\r\n\t\t\tmu.trial_limit,\r\n\t\t\tUNIX_TIMESTAMP(mu.startdate) as startdate,\r\n\t\t\tUNIX_TIMESTAMP(mu.enddate) as enddate,\r\n\t\t\tm.name as membership,\r\n\t\t\tumf.meta_value as first_name,\r\n\t\t\tuml.meta_value as last_name\r\n\t\tFROM {$wpdb->users} u\r\n\t\tLEFT JOIN {$wpdb->usermeta} umh ON umh.meta_key = 'pmpromd_hide_directory' AND u.ID = umh.user_id\r\n\t\tLEFT JOIN {$wpdb->usermeta} umf ON umf.meta_key = 'first_name' AND u.ID = umf.user_id\r\n\t\tLEFT JOIN {$wpdb->usermeta} uml ON uml.meta_key = 'last_name' AND u.ID = uml.user_id\r\n\t\tLEFT JOIN {$wpdb->usermeta} um ON u.ID = um.user_id\r\n\t\tLEFT JOIN {$wpdb->pmpro_memberships_users} mu ON u.ID = mu.user_id\r\n\t\tLEFT JOIN {$wpdb->pmpro_membership_levels} m ON mu.membership_id = m.id\r\n\t\t";
        if (!empty($extra_search_fields)) {
            $cnt = 1;
            foreach ($extra_search_fields as $f) {
                if (!empty(${$f})) {
                    $sqlQuery .= "LEFT JOIN {$wpdb->usermeta} umrh_{$cnt} ON umrh_{$cnt}.meta_key = '{$f}' AND u.ID = umrh_{$cnt}.user_id\r\n\t\t\t\t\t";
                }
                ++$cnt;
            }
        }
        $sqlQuery .= " WHERE mu.status IN ('{$status_list}')\r\n\t\t\tAND (umh.meta_value IS NULL\r\n\t\t\t\tOR umh.meta_value <> '1')\r\n\t\t\t\t";
        if (!empty($s)) {
            $sqlQuery .= " AND (u.user_login LIKE '%" . esc_sql($s) . "%'\r\n\t\t\t\tOR u.user_email LIKE '%" . esc_sql($s) . "%'\r\n\t\t\t\tOR u.display_name LIKE '%" . esc_sql($s) . "%'\r\n\t\t\t\tOR um.meta_value LIKE '%" . esc_sql($s) . "%') ";
        }
        // process any additional/extra/RH related search fields
        if (!empty($extra_search_fields)) {
            $cnt = 1;
            foreach ($extra_search_fields as $f) {
                if (is_array(${$f}) && !empty(${$f})) {
                    $sqlQuery .= " AND (";
                    $max_v = count(${$f}) - 1;
                    $i = 0;
                    foreach (${$f} as $v) {
                        $sqlQuery .= " umrh_{$cnt}.meta_value LIKE '%{$v}%' ";
                        if ($max_v > $i) {
                            $sqlQuery .= " OR ";
                            ++$i;
                        }
                    }
                    $sqlQuery .= ")\r\n\t\t\t\t\t";
                } elseif (!empty(${$f})) {
                    $sqlQuery .= " AND (";
                    $sqlQuery .= " umrh_{$cnt}.meta_value LIKE '%{${$f}}%' ";
                    $sqlQuery .= " )\r\n\t\t\t\t\t";
                }
                ++$cnt;
            }
        }
        // allow users to specify a status other than 'active'
        if (count($statuses) == 1 && in_array('active', $statuses)) {
            $sqlQuery .= " AND mu.membership_id > 0";
        } else {
            $sqlQuery .= " AND mu.membership_id >= 0";
        }
        if ($levels) {
            $sqlQuery .= " AND mu.membership_id IN(" . esc_sql($levels) . ") ";
        }
        $sqlQuery .= " GROUP BY u.ID ORDER BY " . esc_sql($order_by) . " " . $order;
    } else {
        $sqlQuery = "\r\n\t\tSELECT SQL_CALC_FOUND_ROWS\r\n\t\t\tDISTINCT u.ID,\r\n\t\t\tu.user_login,\r\n\t\t\tu.user_email,\r\n\t\t\tu.user_nicename,\r\n\t\t\tu.display_name,\r\n\t\t\tUNIX_TIMESTAMP(u.user_registered) as joindate,\r\n\t\t\tmu.membership_id,\r\n\t\t\tmu.initial_payment,\r\n\t\t\tmu.billing_amount,\r\n\t\t\tmu.cycle_period,\r\n\t\t\tmu.cycle_number,\r\n\t\t\tmu.billing_limit,\r\n\t\t\tmu.trial_amount,\r\n\t\t\tmu.trial_limit,\r\n\t\t\tUNIX_TIMESTAMP(mu.startdate) as startdate,\r\n\t\t\tUNIX_TIMESTAMP(mu.enddate) as enddate,\r\n\t\t\tm.name as membership,\r\n\t\t\tumf.meta_value as first_name,\r\n\t\t\tuml.meta_value as last_name\r\n\t\tFROM {$wpdb->users} u\r\n\t\tLEFT JOIN {$wpdb->usermeta} umh ON umh.meta_key = 'pmpromd_hide_directory' AND u.ID = umh.user_id\r\n\t\tLEFT JOIN {$wpdb->usermeta} umf ON umf.meta_key = 'first_name' AND u.ID = umf.user_id\r\n\t\tLEFT JOIN {$wpdb->usermeta} uml ON uml.meta_key = 'last_name' AND u.ID = uml.user_id\r\n\t\tLEFT JOIN {$wpdb->pmpro_memberships_users} mu ON u.ID = mu.user_id\r\n\t\tLEFT JOIN {$wpdb->pmpro_membership_levels} m ON mu.membership_id = m.id\r\n\t\tWHERE mu.status IN ('{$status_list}')\r\n\t\t\tAND (umh.meta_value IS NULL OR umh.meta_value <> '1')\r\n\t\t\t";
        if (count($statuses) == 1 && in_array('active', $statuses)) {
            $sqlQuery .= " AND mu.membership_id > 0";
        } else {
            $sqlQuery .= " AND mu.membership_id >= 0";
        }
        if ($levels) {
            $sqlQuery .= " AND mu.membership_id IN(" . esc_sql($levels) . ") ";
        }
        $sqlQuery .= " ORDER BY " . esc_sql($order_by) . " " . esc_sql($order);
    }
    $sqlQuery .= " LIMIT {$start}, {$limit}";
    $sqlQuery = apply_filters("pmpro_member_directory_sql", $sqlQuery, $levels, $s, $pn, $limit, $start, $end);
    if (WP_DEBUG) {
        error_log("Query for Directory search: " . $sqlQuery);
    }
    $theusers = $wpdb->get_results($sqlQuery);
    $totalrows = $wpdb->get_var("SELECT FOUND_ROWS() AS found_rows");
    if (WP_DEBUG) {
        error_log("Rows returned: " . $totalrows);
    }
    //update end to match totalrows if total rows is small
    if ($totalrows < $end) {
        $end = $totalrows;
    }
    $layout_cols = preg_replace('/[^0-9]/', '', $layout);
    if (!empty($layout_cols)) {
        $theusers_chunks = array_chunk($theusers, $layout_cols);
    } else {
        $theusers_chunks = array_chunk($theusers, 1);
    }
    ob_start();
    ?>
	<?php 
    if (!empty($show_search)) {
        ?>
		<form role="search" class="pmpro_member_directory_search search-form">
			<div class="pmpromd_main_search_field">
				<label>
					<span class="screen-reader-text"><?php 
        _e('Search for:', 'label');
        ?>
</span>
					<input type="search" class="search-field" placeholder="<?php 
        _e("Search Members", "pmpromd");
        ?>
"
					       name="ps"
					       value="<?php 
        if (!empty($_REQUEST['ps'])) {
            echo esc_attr($_REQUEST['ps']);
        }
        ?>
" title="<?php 
        _e("Search Members", "pmprmd");
        ?>
"/>
					<input type="hidden" name="limit" value="<?php 
        echo esc_attr($limit);
        ?>
"/>
				</label>
			</div>
			<?php 
        $field_array = apply_filters('pmpro_member_directory_extra_search_input', array());
        foreach ($field_array as $field) {
            echo $field;
        }
        ?>
			<div class="search-button clear">
				<input type="submit" class="search-submit" value="<?php 
        _e("Search Members", "pmpromd");
        ?>
">
			</div>
		</form>
	<?php 
    }
    ?>

	<h3 id="pmpro_member_directory_subheading">
		<?php 
    if (!empty($s)) {
        ?>
			<?php 
        printf(__('Profiles Within <em>%s</em>.', 'pmpromd'), ucwords(esc_html($s)));
        ?>
		<?php 
    } else {
        ?>
			<?php 
        _e('Viewing All Profiles.', 'pmpromd');
        ?>
		<?php 
    }
    ?>
		<?php 
    if ($totalrows > 0) {
        ?>
			<small class="muted">
				(<?php 
        if ($totalrows == 1) {
            printf(__('Showing 1 Result', 'pmpromd'), $start + 1, $end, $totalrows);
        } else {
            printf(__('Showing %s-%s of %s Results', 'pmpromd'), $start + 1, $end, $totalrows);
        }
        ?>
)
			</small>
		<?php 
    }
    ?>
	</h3>
	<?php 
    if (!empty($theusers)) {
        if (!empty($fields)) {
            $fields_array = explode(";", $fields);
            if (!empty($fields_array)) {
                for ($i = 0; $i < count($fields_array); $i++) {
                    $fields_array[$i] = explode(",", trim($fields_array[$i]));
                }
            }
        } else {
            $fields_array = false;
        }
        // Get Register Helper field options
        $rh_fields = array();
        if (!empty($pmprorh_registration_fields)) {
            foreach ($pmprorh_registration_fields as $location) {
                foreach ($location as $field) {
                    if (!empty($field->options)) {
                        $rh_fields[$field->name] = $field->options;
                    }
                }
            }
        }
        ?>
		<div class="pmpro_member_directory">
			<hr class="clear"/>
			<?php 
        if ($layout == "table") {
            ?>
				<table width="100%" cellpadding="0" cellspacing="0" border="0">
					<thead>
					<?php 
            if (!empty($show_avatar)) {
                ?>
						<th class="pmpro_member_directory_avatar">
							<?php 
                _e('Avatar', 'pmpro');
                ?>
						</th>
					<?php 
            }
            ?>
					<th class="pmpro_member_directory_display-name">
						<?php 
            _e('Member', 'pmpro');
            ?>
					</th>
					<?php 
            if (!empty($show_email)) {
                ?>
						<th class="pmpro_member_directory_email">
							<?php 
                _e('Email Address', 'pmpro');
                ?>
						</th>
					<?php 
            }
            ?>
					<?php 
            if (!empty($fields_array)) {
                ?>
						<th class="pmpro_member_directory_additional">
							<?php 
                _e('More Information', 'pmpro');
                ?>
						</th>
					<?php 
            }
            ?>
					<?php 
            if (!empty($show_level)) {
                ?>
						<th class="pmpro_member_directory_level">
							<?php 
                _e('Level', 'pmpro');
                ?>
						</th>
					<?php 
            }
            ?>
					<?php 
            if (!empty($show_startdate)) {
                ?>
						<th class="pmpro_member_directory_date">
							<?php 
                _e('Start Date', 'pmpro');
                ?>
						</th>
					<?php 
            }
            ?>
					<?php 
            if (!empty($link) && !empty($profile_url)) {
                ?>
						<th class="pmpro_member_directory_link">&nbsp;</th>
					<?php 
            }
            ?>
					</thead>
					<tbody>
					<?php 
            $count = 0;
            foreach ($theusers as $auser) {
                $auser = get_userdata($auser->ID);
                $auser->membership_level = pmpro_getMembershipLevelForUser($auser->ID);
                $count++;
                ?>
						<tr id="pmpro_member_directory_row-<?php 
                echo $auser->ID;
                ?>
"
						    class="pmpro_member_directory_row<?php 
                if (!empty($link) && !empty($profile_url)) {
                    echo " pmpro_member_directory_linked";
                }
                ?>
">
							<?php 
                if (!empty($show_avatar)) {
                    ?>
								<td class="pmpro_member_directory_avatar">
									<?php 
                    if (!empty($link) && !empty($profile_url)) {
                        ?>
										<a href="<?php 
                        echo add_query_arg('pu', $auser->user_nicename, $profile_url);
                        ?>
"><?php 
                        echo get_avatar($auser->ID, $avatar_size);
                        ?>
</a>
									<?php 
                    } else {
                        ?>
										<?php 
                        echo get_avatar($auser->ID, $avatar_size);
                        ?>
									<?php 
                    }
                    ?>
								</td>
							<?php 
                }
                ?>
							<td>
								<h3 class="pmpro_member_directory_display-name">
									<?php 
                if (!empty($link) && !empty($profile_url)) {
                    ?>
										<a href="<?php 
                    echo add_query_arg('pu', $auser->user_nicename, $profile_url);
                    ?>
"><?php 
                    echo $auser->display_name;
                    ?>
</a>
									<?php 
                } else {
                    ?>
										<?php 
                    echo $auser->display_name;
                    ?>
									<?php 
                }
                ?>
								</h3>
							</td>
							<?php 
                if (!empty($show_email)) {
                    ?>
								<td class="pmpro_member_directory_email">
									<?php 
                    echo $auser->user_email;
                    ?>
								</td>
							<?php 
                }
                ?>
							<?php 
                if (!empty($fields_array)) {
                    ?>
								<td class="pmpro_member_directory_additional">
									<?php 
                    foreach ($fields_array as $field) {
                        $meta_field = $auser->{$field}[1];
                        if (!empty($meta_field)) {
                            ?>
											<p class="pmpro_member_directory_<?php 
                            echo $field[1];
                            ?>
">
												<?php 
                            if (is_array($meta_field) && !empty($meta_field['filename'])) {
                                //this is a file field
                                ?>
													<strong><?php 
                                echo $field[0];
                                ?>
</strong>
													<?php 
                                echo pmpromd_display_file_field($meta_field);
                                ?>
													<?php 
                            } elseif (is_array($meta_field)) {
                                //this is a general array, check for Register Helper options first
                                if (!empty($rh_fields[$field[1]])) {
                                    foreach ($meta_field as $key => $value) {
                                        $meta_field[$key] = $rh_fields[$field[1]][$value];
                                    }
                                }
                                ?>
													<strong><?php 
                                echo $field[0];
                                ?>
</strong>
													<?php 
                                echo implode(", ", $meta_field);
                                ?>
													<?php 
                            } else {
                                if ($field[1] == 'user_url') {
                                    ?>
														<a href="<?php 
                                    echo esc_url($meta_field);
                                    ?>
"
														   target="_blank"><?php 
                                    echo $field[0];
                                    ?>
</a>
														<?php 
                                } else {
                                    ?>
														<strong><?php 
                                    echo $field[0];
                                    ?>
</strong>
														<?php 
                                    $meta_field_embed = wp_oembed_get($meta_field);
                                    if (!empty($meta_field_embed)) {
                                        echo $meta_field_embed;
                                    } else {
                                        echo make_clickable($meta_field);
                                    }
                                    ?>
														<?php 
                                }
                            }
                            ?>
											</p>
											<?php 
                        }
                    }
                    ?>
								</td>
								<?php 
                }
                ?>
							<?php 
                if (!empty($show_level)) {
                    ?>
								<td class="pmpro_member_directory_level">
									<?php 
                    echo $auser->membership_level->name;
                    ?>
								</td>
							<?php 
                }
                ?>
							<?php 
                if (!empty($show_startdate)) {
                    ?>
								<td class="pmpro_member_directory_date">
									<?php 
                    echo date(get_option("date_format"), $auser->membership_level->startdate);
                    ?>
								</td>
							<?php 
                }
                ?>
							<?php 
                if (!empty($link) && !empty($profile_url)) {
                    ?>
								<td class="pmpro_member_directory_link">
									<a href="<?php 
                    echo add_query_arg('pu', $auser->user_nicename, $profile_url);
                    ?>
"><?php 
                    _e('View Profile', 'pmpromd');
                    ?>
</a>
								</td>
							<?php 
                }
                ?>
						</tr>
						<?php 
            }
            ?>
					</tbody>
				</table>
				<?php 
        } else {
            $count = 0;
            foreach ($theusers_chunks as $row) {
                ?>
					<div class="row">
						<?php 
                foreach ($row as $auser) {
                    $count++;
                    $auser = get_userdata($auser->ID);
                    $auser->membership_level = pmpro_getMembershipLevelForUser($auser->ID);
                    ?>
							<div class="medium-<?php 
                    if ($layout == '2col') {
                        $avatar_align = "alignright";
                        echo '6 ';
                    } elseif ($layout == '3col') {
                        $avatar_align = "aligncenter";
                        echo '4 text-center ';
                    } elseif ($layout == '4col') {
                        $avatar_align = "aligncenter";
                        echo '3 text-center ';
                    } else {
                        $avatar_align = "alignright";
                        echo '12 ';
                    }
                    if ($count == $end) {
                        echo 'end ';
                    }
                    ?>
								columns">
								<div id="pmpro_member-<?php 
                    echo $auser->ID;
                    ?>
">
									<?php 
                    if (!empty($show_avatar)) {
                        ?>
										<div class="pmpro_member_directory_avatar">
											<?php 
                        if (!empty($link) && !empty($profile_url)) {
                            ?>
												<a class="<?php 
                            echo $avatar_align;
                            ?>
"
												   href="<?php 
                            echo add_query_arg('pu', $auser->user_nicename, $profile_url);
                            ?>
"><?php 
                            echo get_avatar($auser->ID, $avatar_size, null, $auser->display_name);
                            ?>
</a>
											<?php 
                        } else {
                            ?>
												<span
													class="<?php 
                            echo $avatar_align;
                            ?>
"><?php 
                            echo get_avatar($auser->ID, $avatar_size, null, $auser->display_name);
                            ?>
</span>
											<?php 
                        }
                        ?>
										</div>
									<?php 
                    }
                    ?>
									<h3 class="pmpro_member_directory_display-name">
										<?php 
                    if (!empty($link) && !empty($profile_url)) {
                        ?>
											<a href="<?php 
                        echo add_query_arg('pu', $auser->user_nicename, $profile_url);
                        ?>
"><?php 
                        echo $auser->display_name;
                        ?>
</a>
										<?php 
                    } else {
                        ?>
											<?php 
                        echo $auser->display_name;
                        ?>
										<?php 
                    }
                    ?>
									</h3>
									<?php 
                    if (!empty($show_email)) {
                        ?>
										<p class="pmpro_member_directory_email">
											<strong><?php 
                        _e('Email Address', 'pmpro');
                        ?>
</strong>
											<?php 
                        echo $auser->user_email;
                        ?>
										</p>
									<?php 
                    }
                    ?>
									<?php 
                    if (!empty($show_level)) {
                        ?>
										<p class="pmpro_member_directory_level">
											<strong><?php 
                        _e('Level', 'pmpro');
                        ?>
</strong>
											<?php 
                        echo $auser->membership_level->name;
                        ?>
										</p>
									<?php 
                    }
                    ?>
									<?php 
                    if (!empty($show_startdate)) {
                        ?>
										<p class="pmpro_member_directory_date">
											<strong><?php 
                        _e('Start Date', 'pmpro');
                        ?>
</strong>
											<?php 
                        echo date(get_option("date_format"), $auser->membership_level->startdate);
                        ?>
										</p>
									<?php 
                    }
                    ?>
									<?php 
                    if (!empty($fields_array)) {
                        foreach ($fields_array as $field) {
                            $meta_field = $auser->{$field}[1];
                            if (!empty($meta_field)) {
                                ?>
												<p class="pmpro_member_directory_<?php 
                                echo $field[1];
                                ?>
">
													<?php 
                                if (is_array($meta_field) && !empty($meta_field['filename'])) {
                                    //this is a file field
                                    ?>
														<strong><?php 
                                    echo $field[0];
                                    ?>
</strong>
														<?php 
                                    echo pmpromd_display_file_field($meta_field);
                                    ?>
														<?php 
                                } elseif (is_array($meta_field)) {
                                    //this is a general array, check for Register Helper options first
                                    if (!empty($rh_fields[$field[1]])) {
                                        foreach ($meta_field as $key => $value) {
                                            $meta_field[$key] = $rh_fields[$field[1]][$value];
                                        }
                                    }
                                    ?>
														<strong><?php 
                                    echo $field[0];
                                    ?>
</strong>
														<?php 
                                    echo implode(", ", $meta_field);
                                    ?>
														<?php 
                                } elseif ($field[1] == 'user_url') {
                                    ?>
														<a href="<?php 
                                    echo $auser->{$field}[1];
                                    ?>
"
														   target="_blank"><?php 
                                    echo $field[0];
                                    ?>
</a>
														<?php 
                                } else {
                                    ?>
														<strong><?php 
                                    echo $field[0];
                                    ?>
:</strong>
														<?php 
                                    echo make_clickable($auser->{$field}[1]);
                                    ?>
														<?php 
                                }
                                ?>
												</p>
												<?php 
                            }
                        }
                    }
                    ?>
									<?php 
                    if (!empty($link) && !empty($profile_url)) {
                        ?>
										<p class="pmpro_member_directory_link">
											<a class="more-link"
											   href="<?php 
                        echo add_query_arg('pu', $auser->user_nicename, $profile_url);
                        ?>
"><?php 
                        _e('View Profile', 'pmpromd');
                        ?>
</a>
										</p>
									<?php 
                    }
                    ?>
								</div> <!-- end pmpro_addon_package-->
							</div>
							<?php 
                }
                ?>
					</div> <!-- end row -->
					<hr/>
					<?php 
            }
        }
        ?>
		</div> <!-- end pmpro_member_directory -->
		<?php 
    } else {
        ?>
		<p class="pmpro_member_directory_message pmpro_message pmpro_error">
			<?php 
        _e('No matching profiles found', 'pmpromd');
        ?>
			<?php 
        if ($s) {
            printf(__('within <em>%s</em>.', 'pmpromd'), ucwords(esc_html($s)));
            if (!empty($directory_url)) {
                ?>
					<a class="more-link"
					   href="<?php 
                echo $directory_url;
                ?>
"><?php 
                _e('View All Members', 'pmpromd');
                ?>
</a>
					<?php 
            }
        } else {
            echo ".";
        }
        ?>
		</p>
		<?php 
    }
    //prev/next
    ?>
	<div class="pmpro_pagination">
		<?php 
    //prev
    if ($pn > 1) {
        ?>
			<span class="pmpro_prev"><a href="<?php 
        echo esc_url(add_query_arg(array("ps" => $s, "pn" => $pn - 1, "limit" => $limit), get_permalink($post->ID)));
        ?>
"><?php 
        printf(__("%s Previous", "pmpromd"), '&alquo;');
        ?>
</a></span>
			<?php 
    }
    //next
    if ($totalrows > $end) {
        ?>
			<span class="pmpro_next"><a href="<?php 
        echo esc_url(add_query_arg(array("ps" => $s, "pn" => $pn + 1, "limit" => $limit), get_permalink($post->ID)));
        ?>
"><?php 
        printf(__("Next %s", "pmpromd"), '&raquo;');
        ?>
</a></span>
			<?php 
    }
    ?>
	</div>
	<?php 
    ?>
	<?php 
    $temp_content = ob_get_contents();
    ob_end_clean();
    return $temp_content;
}
function pmpro_membership_level_profile_fields($user)
{
    global $current_user, $pmpro_currency_symbol;
    if (!current_user_can("administrator")) {
        return false;
    }
    global $wpdb;
    /*$user->membership_level = $wpdb->get_row("SELECT l.id AS ID, l.name AS name
    		FROM {$wpdb->pmpro_membership_levels} AS l
    		JOIN {$wpdb->pmpro_memberships_users} AS mu ON (l.id = mu.membership_id)
    		WHERE mu.user_id = " . $user->ID . "
    		LIMIT 1");*/
    $user->membership_level = pmpro_getMembershipLevelForUser($user->ID);
    $levels = $wpdb->get_results("SELECT * FROM {$wpdb->pmpro_membership_levels}", OBJECT);
    if (!$levels) {
        return "";
    }
    ?>
<h3><?php 
    _e("Membership Level", "pmpro");
    ?>
</h3>
<table class="form-table">
    <?php 
    $show_membership_level = true;
    $show_membership_level = apply_filters("pmpro_profile_show_membership_level", $show_membership_level, $user);
    if ($show_membership_level) {
        ?>
		<tr>
			<th><label for="membership_level"><?php 
        _e("Current Level", "pmpro");
        ?>
</label></th>
			<td>
				<select name="membership_level" onchange="pmpro_mchange_warning();">
					<option value="" <?php 
        if (empty($user->membership_level->ID)) {
            ?>
selected="selected"<?php 
        }
        ?>
>-- <?php 
        _e("None", "pmpro");
        ?>
 --</option>
				<?php 
        foreach ($levels as $level) {
            $current_level = $user->membership_level->ID == $level->id;
            ?>
					<option value="<?php 
            echo $level->id;
            ?>
" <?php 
            if ($current_level) {
                ?>
selected="selected"<?php 
            }
            ?>
><?php 
            echo $level->name;
            ?>
</option>
				<?php 
        }
        ?>
				</select>
				<script>
					var pmpro_mchange_once = 0;
					function pmpro_mchange_warning()
					{
						if(pmpro_mchange_once == 0)
						{
							alert('Warning: The existing membership will be cancelled, and the new membership will be free.');
							pmpro_mchange_once = 1;
						}
					}
				</script>
				<?php 
        $membership_values = $wpdb->get_row("SELECT * FROM {$wpdb->pmpro_memberships_users} WHERE status = 'active' AND user_id = '" . $user->ID . "' LIMIT 1");
        if (!empty($membership_values->billing_amount) || !empty($membership_values->trial_amount)) {
            ?>
						<?php 
            if ($membership_values->billing_amount > 0) {
                ?>
							at <?php 
                echo $pmpro_currency_symbol;
                echo $membership_values->billing_amount;
                ?>
							<?php 
                if ($membership_values->cycle_number > 1) {
                    ?>
								per <?php 
                    echo $membership_values->cycle_number;
                    ?>
 <?php 
                    echo sornot($membership_values->cycle_period, $membership_values->cycle_number);
                    ?>
							<?php 
                } elseif ($membership_values->cycle_number == 1) {
                    ?>
								per <?php 
                    echo $membership_values->cycle_period;
                    ?>
							<?php 
                }
                ?>
						<?php 
            }
            ?>

						<?php 
            if ($membership_values->billing_limit) {
                ?>
 for <?php 
                echo $membership_values->billing_limit . ' ' . sornot($membership_values->cycle_period, $membership_values->billing_limit);
            }
            ?>
.

						<?php 
            if ($membership_values->trial_limit) {
                ?>
							The first <?php 
                echo $membership_values->trial_limit;
                ?>
 <?php 
                echo sornot("payments", $membership_values->trial_limit);
                ?>
 will cost <?php 
                echo $pmpro_currency_symbol;
                echo $membership_values->trial_amount;
                ?>
.
						<?php 
            }
            ?>
					<?php 
        } else {
            _e("User is not paying.", "pmpro");
        }
        ?>
			</td>
		</tr>
		<?php 
    }
    $show_expiration = true;
    $show_expiration = apply_filters("pmpro_profile_show_expiration", $show_expiration, $user);
    if ($show_expiration) {
        //is there an end date?
        $user->membership_level = pmpro_getMembershipLevelForUser($user->ID);
        $end_date = !empty($user->membership_level->enddate);
        //some vars for the dates
        $current_day = date("j");
        if ($end_date) {
            $selected_expires_day = date("j", $user->membership_level->enddate);
        } else {
            $selected_expires_day = $current_day;
        }
        $current_month = date("M");
        if ($end_date) {
            $selected_expires_month = date("m", $user->membership_level->enddate);
        } else {
            $selected_expires_month = date("m");
        }
        $current_year = date("Y");
        if ($end_date) {
            $selected_expires_year = date("Y", $user->membership_level->enddate);
        } else {
            $selected_expires_year = (int) $current_year + 1;
        }
        ?>
		<tr>
			<th><label for="expiration"><?php 
        _e("Expires", "pmpro");
        ?>
</label></th>
			<td>
				<select id="expires" name="expires">
					<option value="0" <?php 
        if (!$end_date) {
            ?>
selected="selected"<?php 
        }
        ?>
><?php 
        _e("No", "pmpro");
        ?>
</option>
					<option value="1" <?php 
        if ($end_date) {
            ?>
selected="selected"<?php 
        }
        ?>
><?php 
        _e("Yes", "pmpro");
        ?>
</option>
				</select>
				<span id="expires_date" <?php 
        if (!$end_date) {
            ?>
style="display: none;"<?php 
        }
        ?>
>
					on
					<select name="expires_month">
						<?php 
        for ($i = 1; $i < 13; $i++) {
            ?>
							<option value="<?php 
            echo $i;
            ?>
" <?php 
            if ($i == $selected_expires_month) {
                ?>
selected="selected"<?php 
            }
            ?>
><?php 
            echo date("M", strtotime($i . "/1/" . $current_year));
            ?>
</option>
							<?php 
        }
        ?>
					</select>
					<input name="expires_day" type="text" size="2" value="<?php 
        echo $selected_expires_day;
        ?>
" />
					<input name="expires_year" type="text" size="4" value="<?php 
        echo $selected_expires_year;
        ?>
" />
				</span>
				<script>
					jQuery('#expires').change(function() {
						if(jQuery(this).val() == 1)
							jQuery('#expires_date').show();
						else
							jQuery('#expires_date').hide();
					});
				</script>
			</td>
		</tr>
		<?php 
    }
    ?>
</table>
<?php 
}
if (!empty($event->id)) {
    //check what kind of event it is
    if ($event->type == "charge.succeeded") {
        //do we have this order yet? (check status too)
        $order = getOrderFromInvoiceEvent($event);
        //no? create it
        if (empty($order->id)) {
            //last order for this subscription
            $old_order = getOldOrderFromInvoiceEvent($event);
            if (empty($old_order)) {
                $logstr .= "Couldn't find the original subscription.";
                pmpro_stripeWebhookExit();
            }
            $user_id = $old_order->user_id;
            $user = get_userdata($user_id);
            $user->membership_level = pmpro_getMembershipLevelForUser($user_id);
            if (empty($user)) {
                $logstr .= "Couldn't find the old order's user. Order ID = " . $old_order->id . ".";
                pmpro_stripeWebhookExit();
            }
            $invoice = $event->data->object;
            //alright. create a new order/invoice
            $morder = new MemberOrder();
            $morder->user_id = $old_order->user_id;
            $morder->membership_id = $old_order->membership_id;
            $morder->InitialPayment = $invoice->amount / 100;
            //not the initial payment, but the class is expecting that
            $morder->PaymentAmount = $invoice->amount / 100;
            $morder->payment_transaction_id = $invoice->id;
            $morder->subscription_transaction_id = $invoice->customer;
            $morder->gateway = $old_order->gateway;
<?php

global $current_user;
if ($current_user->ID) {
    $current_user->membership_level = pmpro_getMembershipLevelForUser($current_user->ID);
}
//is there a default level to redirect to?
if (defined("PMPRO_DEFAULT_LEVEL")) {
    $default_level = intval(PMPRO_DEFAULT_LEVEL);
} else {
    $default_level = false;
}
if ($default_level) {
    wp_redirect(pmpro_url("checkout", "?level=" . $default_level));
    exit;
}
global $wpdb, $pmpro_msg, $pmpro_msgt;
if (isset($_REQUEST['msg'])) {
    if ($_REQUEST['msg'] == 1) {
        $pmpro_msg = __('Your membership status has been updated - Thank you!', 'pmpro');
    } else {
        $pmpro_msg = __('Sorry, your request could not be completed - please try again in a few moments.', 'pmpro');
        $pmpro_msgt = "pmpro_error";
    }
} else {
    $pmpro_msg = false;
}
global $pmpro_levels;
$pmpro_levels = pmpro_getAllLevels(false, true);
$pmpro_levels = apply_filters("pmpro_levels_array", $pmpro_levels);
function pmproues_wp_ajax()
{
    //make sure the user is an admin
    if (!current_user_can('manage_options')) {
        exit;
    }
    //get values
    $gateway = $_REQUEST['gateway'];
    $level = $_REQUEST['level'];
    $billing_amount = $_REQUEST['billing_amount'];
    $cycle_number = $_REQUEST['cycle_number'];
    $cycle_period = $_REQUEST['cycle_period'];
    $live = $_REQUEST['live'];
    if (empty($_REQUEST['limit'])) {
        $limit = 5;
    } else {
        $limit = intval($_REQUEST['limit']);
    }
    //continue progress?
    $hash = substr(md5($gateway . $level . $billing_amount . $cycle_number . $cycle_period . $live), 0, 16);
    $last_user = get_transient('pmproues_update_last_row_' . $hash);
    if (empty($last_user)) {
        $last_user = 0;
    }
    //find members
    global $wpdb;
    $sqlQuery = "SELECT user_id FROM {$wpdb->pmpro_memberships_users} WHERE user_id > {$last_user} AND membership_id = '" . intval($level) . "' AND status = 'active' ORDER BY user_id LIMIT {$limit}";
    $member_ids = $wpdb->get_col($sqlQuery);
    if (empty($member_ids)) {
        delete_transient('pmproues_update_last_row_' . $hash);
        echo "done";
        exit;
    } else {
        //update subs
        foreach ($member_ids as $member_id) {
            $last_user = $member_id;
            echo "\n----\nMember ID #" . $member_id . ". ";
            //get user
            $user = get_userdata($member_id);
            //no user?
            if (empty($user) || empty($user->ID)) {
                echo "Could not find user. ";
                continue;
            } else {
                echo "User found. (" . $user->user_email . ") ";
            }
            //get order
            $order = new MemberOrder();
            $order->getLastMemberOrder($user->ID);
            //no order?
            if (empty($order->id)) {
                echo "Could not find order. ";
                continue;
            } else {
                echo "Order found. (" . $order->code . ") ";
            }
            //different gateway?
            if ($order->gateway != $gateway) {
                echo "Different gateway. ";
                continue;
            } else {
                echo "Gateway matches. ";
            }
            //okay find the sub
            if (empty($order->subscription_transaction_id)) {
                echo "No subscription transaction ID. ";
                continue;
            } else {
                echo "Subscription ID found. ";
            }
            if (empty($live)) {
                echo "Would have updated the subscription here, but we're just testing. ";
                continue;
            }
            //let's do it live!
            if ($gateway == "stripe") {
                /*
                	Note: This code is copied and modified from the user_profile_fields_save method.
                */
                //get level for user
                $user_level = pmpro_getMembershipLevelForUser($user->ID);
                //get current plan at Stripe to get payment date
                $order->Gateway->getCustomer($order);
                $subscription = $order->Gateway->getSubscription($order);
                if (!empty($subscription)) {
                    $end_timestamp = $subscription->current_period_end;
                    //cancel the old subscription
                    if (!$order->Gateway->cancelSubscriptionAtGateway($subscription)) {
                        echo "Could not cancel the old subscription. Skipping. ";
                        continue;
                    }
                }
                //if we didn't get an end date, let's set one one cycle out
                if (empty($end_timestamp)) {
                    $end_timestamp = strtotime("+" . $cycle_number . " " . $cycle_period, current_time('timestamp'));
                }
                //build order object
                $update_order = new MemberOrder();
                $update_order->setGateway('stripe');
                $update_order->user_id = $user->ID;
                $update_order->Email = $user->user_email;
                $update_order->membership_id = $user_level->id;
                $update_order->membership_name = $user_level->name;
                $update_order->InitialPayment = 0;
                $update_order->PaymentAmount = $billing_amount;
                $update_order->ProfileStartDate = date("Y-m-d", $end_timestamp);
                $update_order->BillingPeriod = $cycle_period;
                $update_order->BillingFrequency = $cycle_number;
                //need filter to reset ProfileStartDate
                add_filter('pmpro_profile_start_date', create_function('$startdate, $order', 'return "' . $update_order->ProfileStartDate . 'T0:0:0";'), 10, 2);
                //update subscription
                $update_order->Gateway->subscribe($update_order, false);
                //update membership
                $sqlQuery = "UPDATE {$wpdb->pmpro_memberships_users}\r\n\t\t\t\t\t\t\t\tSET billing_amount = '" . esc_sql($billing_amount) . "',\r\n\t\t\t\t\t\t\t\t\tcycle_number = '" . esc_sql($cycle_number) . "',\r\n\t\t\t\t\t\t\t\t\tcycle_period = '" . esc_sql($cycle_period) . "',\r\n\t\t\t\t\t\t\t\t\ttrial_amount = '',\r\n\t\t\t\t\t\t\t\t\ttrial_limit = ''\r\n\t\t\t\t\t\t\t\tWHERE user_id = '" . esc_sql($user->ID) . "'\r\n\t\t\t\t\t\t\t\t\tAND membership_id = '" . esc_sql($order->membership_id) . "'\r\n\t\t\t\t\t\t\t\t\tAND status = 'active'\r\n\t\t\t\t\t\t\t\tLIMIT 1";
                $wpdb->query($sqlQuery);
                //save order so we know which plan to look for at stripe (order code = plan id)
                $update_order->status = "success";
                $update_order->saveOrder();
                echo "ORDER UPDATED!";
            }
        }
    }
    set_transient('pmproues_update_last_row_' . $hash, $last_user, 60 * 60 * 24);
    exit;
}
		function sendAdminChangeAdminEmail($user = NULL)
		{
			global $current_user, $wpdb;
			if(!$user)
				$user = $current_user;
			
			if(!$user)
				return false;
			
			//check settings
			$send = pmpro_getOption("email_admin_changes");
			if(empty($send))
				return true;	//didn't send, but we also don't want to indicate failure because the settings say to not send
			
			//make sure we have the current membership level data
			$user->membership_level = pmpro_getMembershipLevelForUser($user->ID);
						
			$this->email = get_bloginfo("admin_email");
			$this->subject = "Membership for " . $user->user_login . " at " . get_option("blogname") . " has been changed";
			$this->template = "admin_change_admin";
			$this->data = array("subject" => $this->subject, "name" => $user->display_name, "user_login" => $user->user_login, "sitename" => get_option("blogname"), "membership_level_name" => $user->membership_level->name, "siteemail" => get_bloginfo("admin_email"), "login_link" => wp_login_url());
			if($user->membership_level->ID)
				$this->data["membership_change"] = "The new level is " . $user->membership_level->name . ". This membership is free";
			else
				$this->data["membership_change"] = "membership has been canceled";
			
			if(!empty($user->membership_level->enddate))
			{
					$this->data["membership_change"] .= ". This membership will expire on " . date(get_option('date_format'), $user->membership_level->enddate);
			}
			elseif(!empty($this->expiration_changed))
			{
				$this->data["membership_change"] .= ". This membership does not expire";
			}
			
			return $this->sendEmail();
		}
function getLevels()
{
    global $current_user;
    if ($current_user->ID) {
        $current_user->membership_level = pmpro_getMembershipLevelForUser($current_user->ID);
    }
    //is there a default level to redirect to?
    if (defined("PMPRO_DEFAULT_LEVEL")) {
        $default_level = intval(PMPRO_DEFAULT_LEVEL);
    } else {
        $default_level = false;
    }
    if ($default_level) {
        wp_redirect(pmpro_url("checkout", "?level=" . $default_level));
        exit;
    }
    global $wpdb, $pmpro_msg, $pmpro_msgt;
    if (isset($_REQUEST['msg'])) {
        if ($_REQUEST['msg'] == 1) {
            $pmpro_msg = __('Your membership status has been updated - Thank you!', 'pmpro');
        } else {
            $pmpro_msg = __('Sorry, your request could not be completed - please try again in a few moments.', 'pmpro');
            $pmpro_msgt = "pmpro_error";
        }
    } else {
        $pmpro_msg = false;
    }
    global $pmpro_levels;
    $pmpro_levels = pmpro_getAllLevels(false, true);
    $pmpro_levels = apply_filters("pmpro_levels_array", $pmpro_levels);
    if ($pmpro_msg) {
        ?>
        <div class="pmpro_message <?php 
        echo $pmpro_msgt;
        ?>
"><?php 
        echo $pmpro_msg;
        ?>
</div>
        <?php 
    }
    ?>

    <div id="main" class="site-main clr">
        <div id="membership-wrapper"> 
            <?php 
    $count = 0;
    $count_levels = count($pmpro_levels);
    $tmp = 0;
    foreach ($pmpro_levels as $level) {
        if (isset($current_user->membership_level->ID)) {
            $current_level = $current_user->membership_level->ID == $level->id;
        } else {
            $current_level = false;
        }
        ?>

                <?php 
        $last = $count_levels - $tmp;
        ?>
  
                <?php 
        $tmp = $tmp + 1;
        ?>

                <div class="box-level <?php 
        if ($count++ % 2 == 0) {
            ?>
odd<?php 
        } else {
            ?>
 even<?php 
        }
        if ($current_level == $level) {
            ?>
 active<?php 
        }
        if ($last == 2 || $last == 1) {
            ?>
 last-box<?php 
        }
        ?>
">
                    <h1><?php 
        echo $current_level ? "<strong>{$level->name}</strong>" : $level->name;
        ?>
</h1>
                    <div class="copy">
                        <?php 
        if (pmpro_isLevelFree($level)) {
            $cost_text = "<strong>Free</strong>";
        } else {
            $cost_text = pmpro_getLevelCost($level, true, true);
        }
        $expiration_text = pmpro_getLevelExpiration($level);
        if (!empty($cost_text) && !empty($expiration_text)) {
            echo $cost_text . "<br />" . $expiration_text;
        } elseif (!empty($cost_text)) {
            echo $cost_text;
        } elseif (!empty($expiration_text)) {
            echo $expiration_text;
        }
        ?>
                    </div>
                    <div class="links">
                        <?php 
        if (empty($current_user->membership_level->ID)) {
            ?>
                            <a class="pmpro_btn pmpro_btn-select sign-up" href="<?php 
            echo pmpro_url("checkout", "?level=" . $level->id, "https");
            ?>
"><?php 
            _e('Sign Up', 'pmpro');
            ?>
</a>
                        <?php 
        } elseif (!$current_level) {
            ?>
     
                            <!--
                            <a class="pmpro_btn pmpro_btn-select" href="<?php 
            //echo pmpro_url("checkout", "?level=" . $level->id, "https")
            ?>
"><?php 
            //_e('Change Subscription', 'pmpro');
            ?>
</a>
                            -->
                            <a class="pmpro_btn pmpro_btn-select change-subscription" href="<?php 
            echo "/billing/subscription-checkout?level=" . $level->id;
            ?>
"><?php 
            _e('Change Subscription', 'pmpro');
            ?>
</a>
                        <?php 
        } elseif ($current_level) {
            ?>
      
                            <?php 
            //if it's a one-time-payment level, offer a link to renew
            if (!pmpro_isLevelRecurring($current_user->membership_level) && !empty($current_user->membership_level->enddate)) {
                ?>
                                <a class="pmpro_btn pmpro_btn-select renew" href="<?php 
                echo pmpro_url("checkout", "?level=" . $level->id, "https");
                ?>
"><?php 
                _e('Renew', 'pmpro');
                ?>
</a>
                                <?php 
            } else {
                ?>
                                <a class="pmpro_btn disabled your-current-level" href="<?php 
                echo pmpro_url("account");
                ?>
"><?php 
                _e('Your&nbsp;Current&nbsp;Level', 'pmpro');
                ?>
</a>
                                <?php 
            }
            ?>
                        <?php 
        }
        ?>
                    </div>
                </div>
                <?php 
    }
    ?>
            <div class="clear clearfix"></div>
            <nav id="nav-below" class="navigation" role="navigation">
                <div class="nav-previous alignleft">
                    <?php 
    if (!empty($current_user->membership_level->ID)) {
        ?>
                        <!--
                            <a href="<?php 
        echo pmpro_url("account");
        ?>
"><?php 
        _e('&larr; Return to Your Account', 'pmpro');
        ?>
</a>
                        -->
                    <?php 
    } else {
        ?>
                        <a href="<?php 
        echo home_url();
        ?>
"><?php 
        _e('&larr; Return to Home', 'pmpro');
        ?>
</a>
                    <?php 
    }
    ?>
                </div>
            </nav>
        </div>
    </div>    

    <?php 
}
 function pmproap_pmpro_checkout_end_date($enddate, $user_id, $pmpro_level, $startdate)
 {
     $user_level = pmpro_getMembershipLevelForUser($user_id);
     if (!empty($user_level->enddate)) {
         return date('Y-m-d H:i:s', $user_level->enddate);
     } else {
         return $user_level->enddate;
     }
 }
 function sendAdminChangeAdminEmail($user = NULL)
 {
     global $current_user, $wpdb;
     if (!$user) {
         $user = $current_user;
     }
     if (!$user) {
         return false;
     }
     //check settings
     $send = pmpro_getOption("email_admin_changes");
     if (empty($send)) {
         return true;
     }
     //didn't send, but we also don't want to indicate failure because the settings say to not send
     //make sure we have the current membership level data
     $user->membership_level = pmpro_getMembershipLevelForUser($user->ID, true);
     $this->email = get_bloginfo("admin_email");
     $this->subject = sprintf(__("Membership for %s at %s has been changed", "pmpro"), $user->user_login, get_option("blogname"));
     $this->template = "admin_change_admin";
     $this->data = array("subject" => $this->subject, "name" => $user->display_name, "user_login" => $user->user_login, "sitename" => get_option("blogname"), "membership_level_name" => $user->membership_level->name, "siteemail" => get_bloginfo("admin_email"), "login_link" => wp_login_url());
     if ($user->membership_level->ID) {
         $this->data["membership_change"] = sprintf(__("The new level is %s", "pmpro"), $user->membership_level->name);
     } else {
         $this->data["membership_change"] = __("Membership has been cancelled", "pmpro");
     }
     if (!empty($user->membership_level->enddate)) {
         $this->data["membership_change"] .= ". " . sprintf(__("This membership will expire on %s", "pmpro"), date_i18n(get_option('date_format'), $user->membership_level->enddate));
     } elseif (!empty($this->expiration_changed)) {
         $this->data["membership_change"] .= ". " . __("This membership does not expire", "pmpro");
     }
     return $this->sendEmail();
 }
 /**
  * Cron job for subscription updates.
  *
  * @since 1.8
  */
 static function pmpro_cron_stripe_subscription_updates()
 {
     global $wpdb;
     //get all updates for today (or before today)
     $sqlQuery = "SELECT *\n\t\t\t\t\t\t FROM {$wpdb->usermeta}\n\t\t\t\t\t\t WHERE meta_key = 'pmpro_stripe_next_on_date_update'\n\t\t\t\t\t\t\tAND meta_value IS NOT NULL\n\t\t\t\t\t\t\tAND meta_value <> ''\n\t\t\t\t\t\t\tAND meta_value < '" . date("Y-m-d", strtotime("+1 day")) . "'";
     $updates = $wpdb->get_results($sqlQuery);
     if (!empty($updates)) {
         //loop through
         foreach ($updates as $update) {
             //pull values from update
             $user_id = $update->user_id;
             $user = get_userdata($user_id);
             //if user is missing, delete the update info and continue
             if (empty($user) || empty($user->ID)) {
                 delete_user_meta($user_id, "pmpro_stripe_updates");
                 delete_user_meta($user_id, "pmpro_stripe_next_on_date_update");
                 continue;
             }
             $user_updates = $user->pmpro_stripe_updates;
             $next_on_date_update = "";
             //loop through updates looking for updates happening today or earlier
             if (!empty($user_updates)) {
                 foreach ($user_updates as $key => $update) {
                     if ($update['when'] == 'date' && $update['date_year'] . "-" . $update['date_month'] . "-" . $update['date_day'] <= date("Y-m-d")) {
                         //get level for user
                         $user_level = pmpro_getMembershipLevelForUser($user_id);
                         //get current plan at Stripe to get payment date
                         $last_order = new MemberOrder();
                         $last_order->getLastMemberOrder($user_id);
                         $last_order->setGateway('stripe');
                         $last_order->Gateway->getCustomer($last_order);
                         if (!empty($last_order->Gateway->customer)) {
                             //find the first subscription
                             if (!empty($last_order->Gateway->customer->subscriptions['data'][0])) {
                                 $first_sub = $last_order->Gateway->customer->subscriptions['data'][0]->__toArray();
                                 $end_timestamp = $first_sub['current_period_end'];
                             }
                         }
                         //if we didn't get an end date, let's set one one cycle out
                         $end_timestamp = strtotime("+" . $update['cycle_number'] . " " . $update['cycle_period']);
                         //build order object
                         $update_order = new MemberOrder();
                         $update_order->setGateway('stripe');
                         $update_order->user_id = $user_id;
                         $update_order->membership_id = $user_level->id;
                         $update_order->membership_name = $user_level->name;
                         $update_order->InitialPayment = 0;
                         $update_order->PaymentAmount = $update['billing_amount'];
                         $update_order->ProfileStartDate = date("Y-m-d", $end_timestamp);
                         $update_order->BillingPeriod = $update['cycle_period'];
                         $update_order->BillingFrequency = $update['cycle_number'];
                         //update subscription
                         $update_order->Gateway->subscribe($update_order, false);
                         //update membership
                         $sqlQuery = "UPDATE {$wpdb->pmpro_memberships_users}\n\t\t\t\t\t\t\t\t\t\t\t\tSET billing_amount = '" . esc_sql($update['billing_amount']) . "',\n\t\t\t\t\t\t\t\t\t\t\t\t\tcycle_number = '" . esc_sql($update['cycle_number']) . "',\n\t\t\t\t\t\t\t\t\t\t\t\t\tcycle_period = '" . esc_sql($update['cycle_period']) . "'\n\t\t\t\t\t\t\t\t\t\t\t\tWHERE user_id = '" . esc_sql($user_id) . "'\n\t\t\t\t\t\t\t\t\t\t\t\t\tAND membership_id = '" . esc_sql($last_order->membership_id) . "'\n\t\t\t\t\t\t\t\t\t\t\t\t\tAND status = 'active'\n\t\t\t\t\t\t\t\t\t\t\t\tLIMIT 1";
                         $wpdb->query($sqlQuery);
                         //save order
                         $update_order->status = "success";
                         $update_order->save();
                         //remove update from list
                         unset($user_updates[$key]);
                     } elseif ($update['when'] == 'date') {
                         //this is an on date update for the future, update the next on date update
                         if (!empty($next_on_date_update)) {
                             $next_on_date_update = min($next_on_date_update, $update['date_year'] . "-" . $update['date_month'] . "-" . $update['date_day']);
                         } else {
                             $next_on_date_update = $update['date_year'] . "-" . $update['date_month'] . "-" . $update['date_day'];
                         }
                     }
                 }
             }
             //save updates in case we removed some
             update_user_meta($user_id, "pmpro_stripe_updates", $user_updates);
             //save date of next on-date update to make it easier to query for these in cron job
             update_user_meta($user_id, "pmpro_stripe_next_on_date_update", $next_on_date_update);
         }
     }
 }
function pmpromd_profile_shortcode($atts, $content = null, $code = "")
{
    // $atts    ::= array of attributes
    // $content ::= text within enclosing form of shortcode element
    // $code    ::= the shortcode found, when == callback name
    // examples: [pmpro_member_profile avatar="false" email="false"]
    extract(shortcode_atts(array('avatar_size' => '128', 'fields' => NULL, 'show_avatar' => NULL, 'show_bio' => NULL, 'show_billing' => NULL, 'show_email' => NULL, 'show_level' => NULL, 'show_name' => NULL, 'show_phone' => NULL, 'show_search' => NULL, 'show_startdate' => NULL, 'user_id' => NULL), $atts));
    global $current_user, $display_name, $wpdb, $pmpro_pages, $pmprorh_registration_fields;
    //some page vars
    if (!empty($pmpro_pages['directory'])) {
        $directory_url = get_permalink($pmpro_pages['directory']);
    } else {
        $directory_url = "";
    }
    if (!empty($pmpro_pages['profile'])) {
        $profile_url = get_permalink($pmpro_pages['profile']);
    }
    //turn 0's into falses
    if ($show_avatar === "0" || $show_avatar === "false" || $show_avatar === "no") {
        $show_avatar = false;
    } else {
        $show_avatar = true;
    }
    if ($show_billing === "0" || $show_billing === "false" || $show_billing === "no") {
        $show_billing = false;
    } else {
        $show_billing = true;
    }
    if ($show_bio === "0" || $show_bio === "false" || $show_bio === "no") {
        $show_bio = false;
    } else {
        $show_bio = true;
    }
    if ($show_email === "0" || $show_email === "false" || $show_email === "no") {
        $show_email = false;
    } else {
        $show_email = true;
    }
    if ($show_level === "0" || $show_level === "false" || $show_level === "no") {
        $show_level = false;
    } else {
        $show_level = true;
    }
    if ($show_name === "0" || $show_name === "false" || $show_name === "no") {
        $show_name = false;
    } else {
        $show_name = true;
    }
    if ($show_phone === "0" || $show_phone === "false" || $show_phone === "no") {
        $show_phone = false;
    } else {
        $show_phone = true;
    }
    if ($show_search === "0" || $show_search === "false" || $show_search === "no") {
        $show_search = false;
    } else {
        $show_search = true;
    }
    if ($show_startdate === "0" || $show_startdate === "false" || $show_startdate === "no") {
        $show_startdate = false;
    } else {
        $show_startdate = true;
    }
    if (isset($_REQUEST['limit'])) {
        $limit = intval($_REQUEST['limit']);
    } elseif (empty($limit)) {
        $limit = 15;
    }
    if (empty($user_id) && !empty($_REQUEST['pu'])) {
        //Get the profile user
        if (is_numeric($_REQUEST['pu'])) {
            $pu = get_user_by('id', $_REQUEST['pu']);
        } else {
            $pu = get_user_by('slug', $_REQUEST['pu']);
        }
        $user_id = $pu->ID;
    }
    if (!empty($user_id)) {
        $pu = get_userdata($user_id);
    } elseif (empty($_REQUEST['pu'])) {
        $pu = get_userdata($current_user->ID);
    }
    if (!empty($pu)) {
        $pu->membership_level = pmpro_getMembershipLevelForUser($pu->ID);
    }
    ob_start();
    ?>
	<?php 
    if (!empty($show_search)) {
        ?>
	
	<form action="<?php 
        echo $directory_url;
        ?>
" method="post" role="search" class="pmpro_member_directory_search search-form">
		<label>
			<span class="screen-reader-text"><?php 
        _e('Search for:', 'label');
        ?>
</span>
			<input type="search" class="search-field" placeholder="Search Members" name="ps" value="<?php 
        if (!empty($_REQUEST['ps'])) {
            echo esc_attr($_REQUEST['ps']);
        }
        ?>
" title="Search Members" />
			<input type="hidden" name="limit" value="<?php 
        echo esc_attr($limit);
        ?>
" />
		</label>
		<input type="submit" class="search-submit" value="Search Members">
	</form>
	<?php 
    }
    ?>
	<?php 
    if (!empty($pu)) {
        if (!empty($fields)) {
            $fields_array = explode(";", $fields);
            if (!empty($fields_array)) {
                for ($i = 0; $i < count($fields_array); $i++) {
                    $fields_array[$i] = explode(",", $fields_array[$i]);
                }
            }
        } else {
            $fields_array = false;
        }
        // Get Register Helper field options
        $rh_fields = array();
        if (!empty($pmprorh_registration_fields)) {
            foreach ($pmprorh_registration_fields as $location) {
                foreach ($location as $field) {
                    if (!empty($field->options)) {
                        $rh_fields[$field->name] = $field->options;
                    }
                }
            }
        }
        ?>
			<div id="pmpro_member_profile-<?php 
        echo $pu->ID;
        ?>
" class="pmpro_member_profile">
				<?php 
        if (!empty($show_avatar)) {
            ?>
										
					<p class="pmpro_member_directory_avatar">
						<?php 
            echo get_avatar($pu->ID, $avatar_size, NULL, $pu->display_name, array("class" => "alignright"));
            ?>
					</p>
				<?php 
        }
        ?>
				<?php 
        if (!empty($show_name) && !empty($pu->display_name)) {
            ?>
										
					<h2 class="pmpro_member_directory_name">
						<?php 
            echo $pu->display_name;
            ?>
					</h2>
				<?php 
        }
        ?>
				<?php 
        if (!empty($show_bio) && !empty($pu->description)) {
            ?>
										
					<p class="pmpro_member_directory_bio">
						<strong><?php 
            _e('Biographical Info', 'wp');
            ?>
</strong>
						<?php 
            echo $pu->description;
            ?>
					</p>
				<?php 
        }
        ?>
				<?php 
        if (!empty($show_email)) {
            ?>
										
					<p class="pmpro_member_directory_email">
						<strong><?php 
            _e('Email Address', 'pmpro');
            ?>
</strong>
						<?php 
            echo $pu->user_email;
            ?>
					</p>
				<?php 
        }
        ?>
				<?php 
        if (!empty($show_level)) {
            ?>
										
					<p class="pmpro_member_directory_level">
						<strong><?php 
            _e('Level', 'pmpro');
            ?>
</strong>
						<?php 
            echo $pu->membership_level->name;
            ?>
					</p>
				<?php 
        }
        ?>
				<?php 
        if (!empty($show_startdate)) {
            ?>
										
					<p class="pmpro_member_directory_date">
						<strong><?php 
            _e('Start Date', 'pmpro');
            ?>
</strong>
						<?php 
            echo date(get_option("date_format"), $pu->membership_level->startdate);
            ?>
					</p>
				<?php 
        }
        ?>
				<?php 
        if (!empty($show_billing) && !empty($pu->pmpro_baddress1)) {
            ?>
										
					<p class="pmpro_member_directory_baddress">
						<strong><?php 
            _e('Address', 'pmpro');
            ?>
</strong>
						<?php 
            echo $pu->pmpro_baddress1;
            ?>
<br />
						<?php 
            if (!empty($pu->pmpro_baddress2)) {
                echo $pu->pmpro_baddress2 . "<br />";
            }
            ?>
						<?php 
            if ($pu->pmpro_bcity && $pu->pmpro_bstate) {
                ?>
							<?php 
                echo $pu->pmpro_bcity;
                ?>
, <?php 
                echo $pu->pmpro_bstate;
                ?>
 <?php 
                echo $pu->pmpro_bzipcode;
                ?>
<br />
							<?php 
                echo $pu->pmpro_bcountry;
                ?>
<br />
						<?php 
            }
            ?>
					</p>
				<?php 
        }
        ?>
				<?php 
        if (!empty($show_phone) && !empty($pu->pmpro_bphone)) {
            ?>
					<p class="pmpro_member_directory_phone">
						<strong><?php 
            _e('Phone Number', 'pmpro');
            ?>
</strong>
						<?php 
            echo formatPhone($pu->pmpro_bphone);
            ?>
					</p>
				<?php 
        }
        ?>
				<?php 
        //filter the fields
        $fields_array = apply_filters('pmpro_member_profile_fields', $fields_array, $pu);
        if (!empty($fields_array)) {
            foreach ($fields_array as $field) {
                if (empty($field[0])) {
                    break;
                }
                $meta_field = $pu->{$field}[1];
                if (!empty($meta_field)) {
                    ?>
								<p class="pmpro_member_directory_<?php 
                    echo esc_attr($field[1]);
                    ?>
">
								<?php 
                    if (is_array($meta_field) && !empty($meta_field['filename'])) {
                        //this is a file field
                        ?>
										<strong><?php 
                        echo $field[0];
                        ?>
</strong>
										<?php 
                        echo pmpromd_display_file_field($meta_field);
                        ?>
										<?php 
                    } elseif (is_array($meta_field)) {
                        //this is a general array, check for Register Helper options first
                        if (!empty($rh_fields[$field[1]])) {
                            foreach ($meta_field as $key => $value) {
                                $meta_field[$key] = $rh_fields[$field[1]][$value];
                            }
                        }
                        ?>
										<strong><?php 
                        echo $field[0];
                        ?>
</strong>
										<?php 
                        echo implode(", ", $meta_field);
                        ?>
										<?php 
                    } else {
                        if ($field[1] == 'user_url') {
                            ?>
											<a href="<?php 
                            echo esc_url($meta_field);
                            ?>
" target="_blank"><?php 
                            echo $field[0];
                            ?>
</a>
											<?php 
                        } else {
                            ?>
											<strong><?php 
                            echo $field[0];
                            ?>
</strong>
											<?php 
                            $meta_field_embed = wp_oembed_get($meta_field);
                            if (!empty($meta_field_embed)) {
                                echo $meta_field_embed;
                            } else {
                                echo make_clickable($meta_field);
                            }
                            ?>
											<?php 
                        }
                    }
                    ?>
								</p>
								<?php 
                }
            }
        }
        ?>
				<div class="pmpro_clear"></div>
			</div>
			<hr />
			<?php 
        if (!empty($directory_url)) {
            ?>
				<div align="center"><a class="more-link" href="<?php 
            echo $directory_url;
            ?>
">View All Members</a></div>
			<?php 
        }
        ?>
			<?php 
    }
    ?>
	<?php 
    $temp_content = ob_get_contents();
    ob_end_clean();
    return $temp_content;
}
function pmpro_has_membership_access($post_id = NULL, $user_id = NULL, $return_membership_levels = false)
{
    global $post, $wpdb, $current_user;
    //use globals if no values supplied
    if (!$post_id && !empty($post)) {
        $post_id = $post->ID;
    }
    if (!$user_id) {
        $user_id = $current_user->ID;
    }
    //no post, return true (changed from false in version 1.7.2)
    if (!$post_id) {
        return true;
    }
    if (!isset($post->post_type)) {
        return true;
    }
    //if no post or current_user object, set them up
    if (isset($post->ID) && !empty($post->ID) && $post_id == $post->ID) {
        $mypost = $post;
    } else {
        $mypost = get_post($post_id);
    }
    if ($user_id == $current_user->ID) {
        $myuser = $current_user;
    } else {
        $myuser = get_userdata($user_id);
    }
    //for these post types, we want to check the parent
    if (isset($mypost->post_type) && in_array($mypost->post_type, array("attachment", "revision"))) {
        $mypost = get_post($mypost->post_parent);
    }
    // Allow plugins and themes to find the protected post
    $mypost = apply_filters('pmpro_membership_access_post', $mypost, $myuser);
    if (isset($mypost->post_type) && $mypost->post_type == "post") {
        $post_categories = wp_get_post_categories($mypost->ID);
        if (!$post_categories) {
            //just check for entries in the memberships_pages table
            $sqlQuery = "SELECT m.id, m.name FROM {$wpdb->pmpro_memberships_pages} mp LEFT JOIN {$wpdb->pmpro_membership_levels} m ON mp.membership_id = m.id WHERE mp.page_id = '" . $mypost->ID . "'";
        } else {
            //are any of the post categories associated with membership levels? also check the memberships_pages table
            $sqlQuery = "(SELECT m.id, m.name FROM {$wpdb->pmpro_memberships_categories} mc LEFT JOIN {$wpdb->pmpro_membership_levels} m ON mc.membership_id = m.id WHERE mc.category_id IN(" . implode(",", $post_categories) . ") AND m.id IS NOT NULL) UNION (SELECT m.id, m.name FROM {$wpdb->pmpro_memberships_pages} mp LEFT JOIN {$wpdb->pmpro_membership_levels} m ON mp.membership_id = m.id WHERE mp.page_id = '" . $mypost->ID . "')";
        }
    } else {
        //are any membership levels associated with this page?
        $sqlQuery = "SELECT m.id, m.name FROM {$wpdb->pmpro_memberships_pages} mp LEFT JOIN {$wpdb->pmpro_membership_levels} m ON mp.membership_id = m.id WHERE mp.page_id = '" . $post_id . "'";
    }
    $post_membership_levels = $wpdb->get_results($sqlQuery);
    $post_membership_levels_ids = array();
    $post_membership_levels_names = array();
    if (!$post_membership_levels) {
        $hasaccess = true;
    } else {
        //we need to see if the user has access
        foreach ($post_membership_levels as $level) {
            $post_membership_levels_ids[] = $level->id;
            $post_membership_levels_names[] = $level->name;
        }
        //levels found. check if this is in a feed or if the current user is in at least one of those membership levels
        if (is_feed()) {
            //always block restricted feeds
            $hasaccess = false;
        } elseif (!empty($myuser->ID)) {
            $myuser->membership_level = pmpro_getMembershipLevelForUser($myuser->ID);
            if (!empty($myuser->membership_level->ID) && in_array($myuser->membership_level->ID, $post_membership_levels_ids)) {
                //the users membership id is one that will grant access
                $hasaccess = true;
            } else {
                //user isn't a member of a level with access
                $hasaccess = false;
            }
        } else {
            //user is not logged in and this content requires membership
            $hasaccess = false;
        }
    }
    /*
    	Filters
    	The generic filter is run first. Then if there is a filter for this post type, that is run.
    */
    //general filter for all posts
    $hasaccess = apply_filters("pmpro_has_membership_access_filter", $hasaccess, $mypost, $myuser, $post_membership_levels);
    //filter for this post type
    if (has_filter("pmpro_has_membership_access_filter_" . $mypost->post_type)) {
        $hasaccess = apply_filters("pmpro_has_membership_access_filter_" . $mypost->post_type, $hasaccess, $mypost, $myuser, $post_membership_levels);
    }
    //return
    if ($return_membership_levels) {
        return array($hasaccess, $post_membership_levels_ids, $post_membership_levels_names);
    } else {
        return $hasaccess;
    }
}
function pmprosm_getSponsor($user_id, $force = false)
{
    global $wpdb, $pmprosm_user_sponsors;
    if (!empty($pmprosm_user_sponsors[$user_id]) && !$force) {
        return $pmprosm_user_sponsors[$user_id];
    }
    //make sure this user has one of the sponsored levels
    $user_level = pmpro_getMembershipLevelForUser($user_id);
    if (!pmprosm_isSponsoredLevel($user_level->id)) {
        $pmprosm_user_sponsors[$user_id] = false;
        return $pmprosm_user_sponsors[$user_id];
    }
    //what code did this user_id sign up for?
    $sqlQuery = "SELECT code_id FROM {$wpdb->pmpro_discount_codes_uses} WHERE user_id = '" . $user_id . "' ORDER BY id DESC";
    $code_id = $wpdb->get_var($sqlQuery);
    //found a code?
    if (empty($code_id)) {
        $pmprosm_user_sponsors[$user_id] = false;
        return $pmprosm_user_sponsors[$user_id];
    }
    //okay find sponsor
    $sponsor_user_id = pmprosm_getUserByCodeID($code_id);
    $pmprosm_user_sponsors[$user_id] = get_userdata($sponsor_user_id);
    return $pmprosm_user_sponsors[$user_id];
}
function pmpro_next_payment($user_id = NULL, $order_status = "success")
{
    global $wpdb, $current_user;
    if (!$user_id) {
        $user_id = $current_user->ID;
    }
    if (!$user_id) {
        return false;
    }
    //get last order
    $order = new MemberOrder();
    $order->getLastMemberOrder($user_id, $order_status);
    //get current membership level
    $level = pmpro_getMembershipLevelForUser($user_id);
    if (!empty($order) && !empty($order->id) && !empty($level) && !empty($level->id) && !empty($level->cycle_number)) {
        //last payment date
        $lastdate = date("Y-m-d", $order->timestamp);
        //next payment date
        $nextdate = $wpdb->get_var("SELECT UNIX_TIMESTAMP('" . $lastdate . "' + INTERVAL " . $level->cycle_number . " " . $level->cycle_period . ")");
        return $nextdate;
    } else {
        //no order or level found, or level was not recurring
        return false;
    }
}
function pmpro_next_payment($user_id = NULL, $order_status = "success", $format = "timestamp")
{
    global $wpdb, $current_user;
    if (!$user_id) {
        $user_id = $current_user->ID;
    }
    if (!$user_id) {
        $r = false;
    } else {
        //get last order
        $order = new MemberOrder();
        $order->getLastMemberOrder($user_id, $order_status);
        //get current membership level
        $level = pmpro_getMembershipLevelForUser($user_id);
        if (!empty($order) && !empty($order->id) && !empty($level) && !empty($level->id) && !empty($level->cycle_number)) {
            //last payment date
            $lastdate = date("Y-m-d", $order->timestamp);
            //next payment date
            $nextdate = $wpdb->get_var("SELECT UNIX_TIMESTAMP('" . $lastdate . "' + INTERVAL " . $level->cycle_number . " " . $level->cycle_period . ")");
            $r = $nextdate;
        } else {
            //no order or level found, or level was not recurring
            $r = false;
        }
    }
    /**
     * Filter the next payment date.
     *
     * @since 1.8.5
     *
     * @param mixed $r false or the next payment date timestamp
     * @param int $user_id The user id to get the next payment date for
     * @param string $order_status Status or array of statuses to find the last order based on.
     */
    $r = apply_filters('pmpro_next_payment', $r, $user_id, $order_status);
    //return in desired format
    if ($r === false) {
        return false;
    } elseif ($format == "timestamp") {
        return $r;
    } elseif ($format == "date_format") {
        return date(get_option('date_format'), $r);
    } else {
        return date($format, $r);
    }
    //assume a PHP date format
}
function pmproec_pmpro_has_membership_access_filter($hasaccess, $mypost, $myuser, $post_membership_levels)
{
    //if they don't have access, ignore this
    if (!$hasaccess) {
        return $hasaccess;
    }
    //if this isn't locked by level, ignore this
    if (empty($post_membership_levels)) {
        return $hasaccess;
    }
    //does this user have a level that requires confirmation?
    $user_membership_level = pmpro_getMembershipLevelForUser($myuser->ID);
    if (pmproec_isEmailConfirmationLevel($user_membership_level->id)) {
        //if they still have a validation key, they haven't clicked on the validation link yet
        $validation_key = get_user_meta($myuser->ID, "pmpro_email_confirmation_key", true);
        if (!empty($validation_key) && $validation_key != "validated") {
            $hasaccess = false;
        }
    }
    return $hasaccess;
}
Exemple #29
0
function pmpro_set_current_user()
{
    //this code runs at the beginning of the plugin
    global $current_user, $wpdb;
    get_currentuserinfo();
    $id = intval($current_user->ID);
    if ($id) {
        $current_user->membership_level = pmpro_getMembershipLevelForUser($current_user->ID);
        if (!empty($current_user->membership_level)) {
            $current_user->membership_level->categories = pmpro_getMembershipCategories($current_user->membership_level->ID);
        }
        $current_user->membership_levels = pmpro_getMembershipLevelsForUser($current_user->ID);
    }
    //hiding ads?
    $hideads = pmpro_getOption("hideads");
    $hideadslevels = pmpro_getOption("hideadslevels");
    if (!is_array($hideadslevels)) {
        $hideadslevels = explode(",", $hideadslevels);
    }
    if ($hideads == 1 && pmpro_hasMembershipLevel() || $hideads == 2 && pmpro_hasMembershipLevel($hideadslevels)) {
        //disable ads in ezAdsense
        if (class_exists("ezAdSense")) {
            global $ezCount, $urCount;
            $ezCount = 100;
            $urCount = 100;
        }
        //disable ads in Easy Adsense (newer versions)
        if (class_exists("EzAdSense")) {
            global $ezAdSense;
            $ezAdSense->ezCount = 100;
            $ezAdSense->urCount = 100;
        }
        //set a global variable to hide ads
        global $pmpro_display_ads;
        $pmpro_display_ads = false;
    } else {
        global $pmpro_display_ads;
        $pmpro_display_ads = true;
    }
    do_action("pmpro_after_set_current_user");
}
function pmprowoo_checkout_level_extend_memberships($level_array)
{
    $level_obj = pmpro_getLevel($level_array['membership_id']);
    //does this level expire? are they an existing user of this level?
    if (!empty($level_obj) && !empty($level_obj->expiration_number) && pmpro_hasMembershipLevel($level_obj->id, $level_array['user_id'])) {
        //get the current enddate of their membership
        $user = get_userdata($level_array['user_id']);
        $user->membership_level = pmpro_getMembershipLevelForUser($user->ID);
        $expiration_date = $user->membership_level->enddate;
        //calculate days left
        $todays_date = current_time('timestamp');
        $time_left = $expiration_date - $todays_date;
        //time left?
        if ($time_left > 0) {
            //convert to days and add to the expiration date (assumes expiration was 1 year)
            $days_left = floor($time_left / (60 * 60 * 24));
            //figure out days based on period
            if ($level_obj->expiration_period == "Day") {
                $total_days = $days_left + $level_obj->expiration_number;
            } elseif ($level_obj->expiration_period == "Week") {
                $total_days = $days_left + $level_obj->expiration_number * 7;
            } elseif ($level_obj->expiration_period == "Month") {
                $total_days = $days_left + $level_obj->expiration_number * 30;
            } elseif ($level_obj->expiration_period == "Year") {
                $total_days = $days_left + $level_obj->expiration_number * 365;
            }
            //update the end date
            $level_array['enddate'] = date("Y-m-d", strtotime("+ {$total_days} Days", $todays_date));
        }
    }
    return $level_array;
}