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"> </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"), '»'); ?> </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 Current 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('← Return to Your Account', 'pmpro'); ?> </a> --> <?php } else { ?> <a href="<?php echo home_url(); ?> "><?php _e('← 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; }
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; }