/** * Get the gateway-related classes for fields on the payment settings page. * * @param string $field The name of the field to check. * @param bool $force If true, it will rebuild the cached results. * * @since 1.8 */ function pmpro_getClassesForPaymentSettingsField($field, $force = false) { global $pmpro_gateway_options; $pmpro_gateways = pmpro_gateways(); //build array of gateways and options if (!isset($pmpro_gateway_options) || $force) { $pmpro_gateway_options = array(); foreach ($pmpro_gateways as $gateway => $label) { //get options if (class_exists('PMProGateway_' . $gateway) && method_exists('PMProGateway_' . $gateway, 'getGatewayOptions')) { $pmpro_gateway_options[$gateway] = call_user_func(array('PMProGateway_' . $gateway, 'getGatewayOptions')); } } } //now check where this field shows up $rgateways = array(); foreach ($pmpro_gateway_options as $gateway => $options) { if (in_array($field, $options)) { $rgateways[] = "gateway_" . $gateway; } } //return space separated string return implode(" ", $rgateways); }
</tr> <tr> <th scope="row" valign="top"><label for="gateway"><?php _e('Gateway', 'pmpro'); ?> :</label></th> <td> <?php if (in_array("gateway", $read_only_fields) && $order_id > 0) { echo $order->gateway; } else { ?> <select id="gateway" name="gateway" onchange="pmpro_changeGateway(jQuery(this).val());"> <?php $pmpro_gateways = pmpro_gateways(); foreach ($pmpro_gateways as $pmpro_gateway_name => $pmpro_gateway_label) { ?> <option value="<?php echo esc_attr($pmpro_gateway_name); ?> " <?php selected($order->gateway, $pmpro_gateway_name); ?> ><?php echo $pmpro_gateway_label; ?> </option> <?php }
function pmproppsc_admin_page() { ?> <div class="wrap"> <h2>PMPro Subscription Check</h2> <?php if (!empty($_REQUEST['pmpro_subscription_check']) && current_user_can("manage_options")) { global $wpdb; //get members if (!empty($_REQUEST['limit'])) { $limit = intval($_REQUEST['limit']); } else { $limit = 20; } if (!empty($_REQUEST['start'])) { $start = intval($_REQUEST['start']); } else { $start = 0; } //when using auto refresh get the last user id if (!empty($_REQUEST['autorefresh']) && empty($_REQUEST['restart'])) { $last_user_id = get_option("pmpro_subscription_check_last_user_id", 0); } else { $last_user_id = 0; } //get gateway $gateway = $_REQUEST['gateway']; if (!in_array($gateway, array_keys(pmpro_gateways()))) { wp_die('Invalid gateway selection.'); } //when using auto refresh get the last user id if (!empty($_REQUEST['autorefresh']) && empty($_REQUEST['restart'])) { $last_user_id = get_option("pmpro_stripe_subscription_check_last_user_id", 0); } else { $last_user_id = 0; } $sqlQuery = "SELECT DISTINCT(user_id) FROM {$wpdb->pmpro_membership_orders} WHERE gateway = '" . esc_sql($gateway) . "' "; if (!empty($last_user_id)) { $sqlQuery .= "AND user_id > '" . $last_user_id . "' "; } $sqlQuery .= "ORDER BY user_id LIMIT {$start}, {$limit}"; $user_ids = $wpdb->get_col($sqlQuery); $totalrows = $wpdb->get_var("SELECT COUNT(DISTINCT(user_id)) FROM {$wpdb->pmpro_membership_orders} WHERE gateway = '" . esc_sql($gateway) . "'"); if (empty($_REQUEST['autorefresh'])) { echo "Checking users for orders " . $start . " to " . min(intval($start + $limit), $totalrows) . ". "; if ($totalrows > intval($start + $limit)) { $url = "?page=pmproppsc&pmpro_subscription_check=1&start=" . ($start + $limit) . "&limit=" . $limit . "&gateway=" . $gateway; echo '<a href="' . $url . '">Next ' . $limit . ' Results</a>'; } else { echo "All done."; } echo "<hr />"; } $allmembers = ""; $requiresaction = ""; foreach ($user_ids as $user_id) { $user = get_userdata($user_id); if (empty($user)) { $s = "User #" . $user_id . " has been deleted. "; } else { $s = "User #" . $user->ID . "(" . $user->user_email . ", " . $user->first_name . " " . $user->lat_name . ") "; } $level = pmpro_getMembershipLevelForUser($user_id); if (!empty($level) && empty($user)) { $s .= " Had level #" . $level->id . ". "; $level_id = $level->id; } elseif (!empty($level)) { $s .= " Has level #" . $level->id . ". "; $level_id = $level->id; } else { $s .= " Does not have a level. "; $level_id = ""; } $order = new MemberOrder(); $order->getLastMemberOrder($user_id, ""); if (!empty($order->id)) { $s .= " Last order was #" . $order->id . ", status " . $order->status . ". "; //check status of order at gateway $details = $order->getGatewaySubscriptionStatus($order); if (empty($details)) { $s .= " Couldn't get status from gateway. "; echo "<span style='color: gray;'>" . $s . "</span>"; $allmembers .= "<span style='color: gray;'>" . $s . "</span>"; } else { if (!is_array($details)) { $details = array('STATUS' => $details); } $s .= "Gateway Status is " . $details['STATUS'] . ". "; //if gateway status is active, but local user has no level, cancel the gateway subscription if (strtolower($details['STATUS']) == 'active' && $level_id != $order->membership_id) { $s .= " But this user has level #" . $user_level_id . " and order is for #" . $order->membership_id . ". Will try to cancel at the gateway. "; if (!empty($_REQUEST['mode'])) { if ($order->cancel()) { $s .= " Order cancelled."; echo "<span style='color: green;'><strong>" . $s . "</strong></span>"; } else { $s .= " Error cancelling order."; echo "<span style='color: red;'><strong>" . $s . "</strong></span>"; } } else { echo "<span style='color: black;'><strong>" . $s . "</strong></span>"; $allmembers .= "<span style='color: black;'><strong>" . $s . "</strong></span>"; $requiresaction .= "<span style='color: black;'><strong>" . $s . "</strong></span><br />\n"; } } elseif (!empty($user) && strtolower($details['STATUS']) != 'active' && $level_id == $order->membership_id) { //if gateway status is not active, but local user has the level associated with this order, cancel the local membership $s .= "Still has a #" . $level_id . " membership here. "; if (!empty($_REQUEST['mode'])) { //check if membership has an enddate if (empty($level->enddate)) { if (pmpro_changeMembershipLevel(0, $user->ID)) { $s .= " Membership cancelled."; echo "<span style='color: green;'><strong>" . $s . "</strong></span>"; } else { $s .= " Error cancelling membership."; echo "<span style='color: red;'><strong>" . $s . "</strong></span>"; } } else { $s .= " Membership is set to end on " . date(get_option('date_format'), $level->enddate) . ". Looks good!"; echo "<span style='color: gray;'><strong>" . $s . "</strong></span>"; } } else { echo "<span style='color: black;'><strong>" . $s . "</strong></span>"; $allmembers .= "<span style='color: black;'><strong>" . $s . "</strong></span>"; $requiresaction .= "<span style='color: black;'><strong>" . $s . "</strong></span><br />\n"; } } elseif (empty($user)) { $s .= "User was deleted so has no membership. Looks good! "; echo "<span style='color: gray;'><strong>" . $s . "</strong></span>"; $allmembers .= "<span style='color: gray;'><strong>" . $s . "</strong></span>"; } else { $s .= "Order is for level #" . $order->membership_id . ". User has level #" . $level_id . ". Looks good! "; echo "<span style='color: gray;'><strong>" . $s . "</strong></span>"; $allmembers .= "<span style='color: gray;'><strong>" . $s . "</strong></span>"; } } } else { $s .= " Does not have an order. "; echo "<span style='color: gray;'><strong>" . $s . "</strong></span>"; $allmembers .= "<span style='color: gray;'><strong>" . $s . "</strong></span>"; } echo "<br />\n"; $allmembers .= "<br />\n"; $last_user_id = $user_id; } //update last user id if using auto refresh if (!empty($_REQUEST['autorefresh'])) { update_option("pmpro_subscription_check_last_user_id", $last_user_id); if (!empty($allmembers)) { //file $loghandle = fopen(dirname(__FILE__) . "/logs/allmembers.html", "a"); fwrite($loghandle, $allmembers); fclose($loghandle); } if (!empty($requiresaction)) { //file $loghandle = fopen(dirname(__FILE__) . "/logs/requiresaction.html", "a"); fwrite($loghandle, $requiresaction); fclose($loghandle); } if ($totalrows > intval($start) + intval($limit)) { echo "Continuing in 2 seconds..."; ?> <script> setTimeout(function() {location.reload();}, 2000); </script> <?php } else { echo "All done."; } } echo '<hr /><a href="?page=pmproppsc">« return to Subscription Check home</a>'; } else { ?> <form method = "get"> <p><strong>WARNING: Running this code could cancel subscriptions on the WP side or at your gateway. Use at your own risk.</strong></p> <p>Test mode will check the status of subscriptions, but won't cancel any memberships locally or cancel any subscription at the gateway. Live Mode will check the status of subscriptions and also cancel any membership locally if the gateway subscription was perviously cancelled and will cancel any gateway subscription for members that cancelled their membership in PMPro.</p> <input type="hidden" name="page" value ="pmproppsc" /> <input type="hidden" name="pmpro_subscription_check" value="1"> <input type="hidden" name="restart" value="1" /> <select name="mode"> <option value="0">Test Only</option> <option value="1">Live Mode</option> </select> <select name="gateway"> <option value="paypal">PayPal (Standard, Express, WPP Legacy)</option> <option value="stripe">Stripe</option> <option value="authorizenet">Authorize.net</option> </select> <select name="autorefresh"> <option value="0">Manual Refresh</option> <option value="1">Auto Refresh</option> </select> <select name="limit"> <option value="5">5 at a time</option> <option value="10">10 at a time</option> <option value="20" selected="selected">20 at a time</option> <option value="30">30 at a time</option> <option value="40">40 at a time</option> <option value="50">50 at a time</option> <option value="100">100 at a time</option> </select> <input type="submit" value="Start Script" /> </form> <?php } ?> </div> <?php }