Skip to content

Instantly share code, notes, and snippets.

@ipokkel
Last active April 30, 2024 16:41
Show Gist options
  • Save ipokkel/844a6fa24608b0a3dae56453e1ad09ad to your computer and use it in GitHub Desktop.
Save ipokkel/844a6fa24608b0a3dae56453e1ad09ad to your computer and use it in GitHub Desktop.
Custom PMPro Dashboard and Memberslist pages displaying renwal dates for recurring subscriptions under the Expires column
<?php
/* Custom Dashboard page displaying renwal dates for recurring subscriptions under the Expires column
* Replace wp-content/plugins/paid-memberships-pro/adminpages/memberslist.php with this file.
* This page will be overwritten with every update of the Paid Memberships Pro core plugin
* As this is a custom override of a core file it is a "use-at-own-risk" option.
*/
/**
* The Memberships Dashboard admin page for Paid Memberships Pro
* @since 2.0
*/
/**
* Add all the meta boxes for the dashboard.
*/
add_meta_box(
'pmpro_dashboard_welcome',
__( 'Welcome to Paid Memberships Pro', 'paid-memberships-pro' ),
'pmpro_dashboard_welcome_callback',
'toplevel_page_pmpro-dashboard',
'normal'
);
add_meta_box(
'pmpro_dashboard_report_sales',
__( 'Sales and Revenue', 'paid-memberships-pro' ),
'pmpro_report_sales_widget',
'toplevel_page_pmpro-dashboard',
'advanced'
);
add_meta_box(
'pmpro_dashboard_report_membership_stats',
__( 'Membership Stats', 'paid-memberships-pro' ),
'pmpro_report_memberships_widget',
'toplevel_page_pmpro-dashboard',
'advanced'
);
add_meta_box(
'pmpro_dashboard_report_logins',
__( 'Visits, Views, and Logins', 'paid-memberships-pro' ),
'pmpro_report_login_widget',
'toplevel_page_pmpro-dashboard',
'advanced'
);
add_meta_box(
'pmpro_dashboard_report_recent_members',
__( 'Recent Members', 'paid-memberships-pro' ),
'pmpro_dashboard_report_recent_members_callback',
'toplevel_page_pmpro-dashboard',
'side'
);
add_meta_box(
'pmpro_dashboard_report_recent_orders',
__( 'Recent Orders', 'paid-memberships-pro' ),
'pmpro_dashboard_report_recent_orders_callback',
'toplevel_page_pmpro-dashboard',
'side'
);
add_meta_box(
'pmpro_dashboard_news_updates',
__( 'Paid Memberships Pro News and Updates', 'paid-memberships-pro' ),
'pmpro_dashboard_news_updates_callback',
'toplevel_page_pmpro-dashboard',
'side'
);
/**
* Load the Paid Memberships Pro dashboard-area header
*/
require_once( dirname( __FILE__ ) . '/admin_header.php' ); ?>
<form id="pmpro-dashboard-form" method="post" action="admin-post.php">
<div class="dashboard-widgets-wrap">
<div id="dashboard-widgets" class="metabox-holder">
<?php do_meta_boxes( 'toplevel_page_pmpro-dashboard', 'normal', '' ); ?>
<div id="postbox-container-1" class="postbox-container">
<?php do_meta_boxes( 'toplevel_page_pmpro-dashboard', 'advanced', '' ); ?>
</div>
<div id="postbox-container-2" class="postbox-container">
<?php do_meta_boxes( 'toplevel_page_pmpro-dashboard', 'side', '' ); ?>
</div>
<br class="clear">
</div> <!-- end dashboard-widgets -->
<?php wp_nonce_field('closedpostboxes', 'closedpostboxesnonce', false ); ?>
<?php wp_nonce_field('meta-box-order', 'meta-box-order-nonce', false ); ?>
</div> <!-- end dashboard-widgets-wrap -->
</form>
<script type="text/javascript">
//<![CDATA[
jQuery(document).ready( function($) {
// close postboxes that should be closed
$('.if-js-closed').removeClass('if-js-closed').addClass('closed');
// postboxes setup
postboxes.add_postbox_toggles('toplevel_page_pmpro-dashboard');
});
//]]>
</script>
<?php
/**
* Callback function for pmpro_dashboard_welcome meta box.
*/
function pmpro_dashboard_welcome_callback() { ?>
<div class="pmpro-dashboard-welcome-columns">
<div class="pmpro-dashboard-welcome-column">
<?php global $pmpro_level_ready, $pmpro_gateway_ready, $pmpro_pages_ready; ?>
<h3><?php echo esc_attr_e( 'Initial Setup', 'paid-memberships-pro' ); ?></h3>
<ul>
<?php if ( current_user_can( 'pmpro_membershiplevels' ) ) { ?>
<li>
<?php if ( empty( $pmpro_level_ready ) ) { ?>
<a href="<?php echo admin_url( 'admin.php?page=pmpro-membershiplevels&edit=-1' );?>"><i class="dashicons dashicons-admin-users"></i> <?php echo esc_attr_e( 'Create a Membership Level', 'paid-memberships-pro' ); ?></a>
<?php } else { ?>
<a href="<?php echo admin_url( 'admin.php?page=pmpro-membershiplevels' );?>"><i class="dashicons dashicons-admin-users"></i> <?php echo esc_attr_e( 'View Membership Levels', 'paid-memberships-pro' ); ?></a>
<?php } ?>
</li>
<?php } ?>
<?php if ( current_user_can( 'pmpro_pagesettings' ) ) { ?>
<li>
<?php if ( empty( $pmpro_pages_ready ) ) { ?>
<a href="<?php echo admin_url( 'admin.php?page=pmpro-pagesettings' );?>"><i class="dashicons dashicons-welcome-add-page"></i> <?php echo esc_attr_e( 'Generate Membership Pages', 'paid-memberships-pro' ); ?></a>
<?php } else { ?>
<a href="<?php echo admin_url( 'admin.php?page=pmpro-pagesettings' );?>"><i class="dashicons dashicons-welcome-add-page"></i> <?php echo esc_attr_e( 'Manage Membership Pages', 'paid-memberships-pro' ); ?>
<?php } ?>
</li>
<?php } ?>
<?php if ( current_user_can( 'pmpro_pagesettings' ) ) { ?>
<li>
<?php if ( empty( $pmpro_gateway_ready ) ) { ?>
<a href="<?php echo admin_url( 'admin.php?page=pmpro-paymentsettings' );?>"><i class="dashicons dashicons-cart"></i> <?php echo esc_attr_e( 'Configure Payment Settings', 'paid-memberships-pro' ); ?></a>
<?php } else { ?>
<a href="<?php echo admin_url( 'admin.php?page=pmpro-paymentsettings' );?>"><i class="dashicons dashicons-cart"></i> <?php echo esc_attr_e( 'Configure Payment Settings', 'paid-memberships-pro' ); ?></a>
<?php } ?>
</li>
<?php } ?>
</ul>
<h3><?php echo esc_attr_e( 'Other Settings', 'paid-memberships-pro' ); ?></h3>
<ul>
<?php if ( current_user_can( 'pmpro_emailsettings' ) ) { ?>
<li><a href="<?php echo admin_url( 'admin.php?page=pmpro-emailsettings' );?>"><i class="dashicons dashicons-email"></i> <?php echo esc_attr_e( 'Confirm Email Settings', 'paid-memberships-pro' );?></a></li>
<?php } ?>
<?php if ( current_user_can( 'pmpro_advancedsettings' ) ) { ?>
<li><a href="<?php echo admin_url( 'admin.php?page=pmpro-advancedsettings' );?>"><i class="dashicons dashicons-admin-settings"></i> <?php echo esc_attr_e( 'View Advanced Settings', 'paid-memberships-pro' ); ?></a></li>
<?php } ?>
<?php if ( current_user_can( 'pmpro_addons' ) ) { ?>
<li><a href="<?php echo admin_url( 'admin.php?page=pmpro-addons' );?>"><i class="dashicons dashicons-admin-plugins"></i> <?php echo esc_attr_e( 'Explore Add Ons for Additional Features', 'paid-memberships-pro' ); ?></a></li>
<?php } ?>
</ul>
<hr />
<p class="text-center">
<?php echo esc_html( __( 'For guidance as your begin these steps,', 'paid-memberships-pro' ) ); ?>
<a href="https://www.paidmembershipspro.com/documentation/initial-plugin-setup/?utm_source=plugin&utm_medium=banner&utm_campaign=welcome" target="_blank"><?php echo esc_attr_e( 'view the Initial Setup Video and Docs.', 'paid-memberships-pro' ); ?></a>
</p>
</div> <!-- end pmpro-dashboard-welcome-column -->
<div class="pmpro-dashboard-welcome-column">
<h3><?php echo esc_attr_e( 'Support License', 'paid-memberships-pro' ); ?></h3>
<?php
// Get saved license.
$key = get_option( 'pmpro_license_key', '' );
$pmpro_license_check = get_option( 'pmpro_license_check', array( 'license' => false, 'enddate' => 0 ) );
?>
<?php if ( ! pmpro_license_isValid() && empty( $key ) ) { ?>
<p class="pmpro_message pmpro_error">
<strong><?php echo esc_html_e( 'No support license key found.', 'paid-memberships-pro' ); ?></strong><br />
<?php printf(__( '<a href="%s">Enter your key here &raquo;</a>', 'paid-memberships-pro' ), admin_url( 'options-general.php?page=pmpro_license_settings' ) );?>
</p>
<?php } elseif ( ! pmpro_license_isValid() ) { ?>
<p class="pmpro_message pmpro_alert">
<strong><?php echo esc_html_e( 'Your license is invalid or expired.', 'paid-memberships-pro' ); ?></strong><br />
<?php printf(__( '<a href="%s">View your membership account</a> to verify your license key.', 'paid-memberships-pro' ), 'https://www.paidmembershipspro.com/login/?redirect_to=/membership-account/?utm_source=plugin&utm_medium=banner&utm_campaign=welcome' );?>
<?php } else { ?>
<p class="pmpro_message pmpro_success"><?php printf(__( '<strong>Thank you!</strong> A valid <strong>%s</strong> license key has been used to activate your support license on this site.', 'paid-memberships-pro' ), ucwords($pmpro_license_check['license']));?></p>
<?php } ?>
<?php if ( ! pmpro_license_isValid() ) { ?>
<p><?php esc_html_e( 'An annual support license is recommended for websites running Paid Memberships Pro.', 'paid-memberships-pro' ); ?><br /><a href="http://www.paidmembershipspro.com/pricing/?utm_source=plugin&utm_medium=banner&utm_campaign=welcome" target="_blank"><?php esc_html_e( 'View Pricing &raquo;' , 'paid-memberships-pro' ); ?></a></p>
<p><a href="https://www.paidmembershipspro.com/membership-checkout/?level=20&utm_source=plugin&utm_medium=banner&utm_campaign=welcome" target="_blank" class="button button-action button-hero"><?php esc_attr_e( 'Upgrade', 'paid-memberships-pro' ); ?></a>
<?php } ?>
<hr />
<p><?php echo wp_kses_post( sprintf( __( 'Paid Memberships Pro and our add ons are distributed under the <a target="_blank" href="%s">GPLv2 license</a>. This means, among other things, that you may use the software on this site or any other site free of charge.', 'paid-memberships-pro' ), 'http://www.gnu.org/licenses/gpl-2.0.html' ) ); ?></p>
</div> <!-- end pmpro-dashboard-welcome-column -->
<div class="pmpro-dashboard-welcome-column">
<h3><?php esc_html_e( 'Get Involved', 'paid-memberships-pro' ); ?></h3>
<p><?php esc_html_e( 'There are many ways you can help support Paid Memberships Pro.', 'paid-memberships-pro' ); ?></p>
<p><?php esc_html_e( 'Get involved with our plugin development via GitHub.', 'paid-memberships-pro' ); ?> <a href="https://github.com/strangerstudios/paid-memberships-pro" target="_blank"><?php esc_html_e( 'View on GitHub', 'paid-memberships-pro' ); ?></a></p>
<p><a href="https://twitter.com/pmproplugin" target="_blank"><i class="dashicons dashicons-twitter"></i> <?php esc_html_e( 'Follow @pmproplugin on Twitter.', 'paid-memberships-pro' ); ?></a></p>
<p><a href="https://wordpress.org/plugins/paid-memberships-pro/#reviews" target="_blank"><i class="dashicons dashicons-wordpress"></i> <?php esc_html_e( 'Share an honest review at WordPress.org.', 'paid-memberships-pro' ); ?></a></p>
<hr />
<p><?php esc_html_e( 'Help translate Paid Memberships Pro into your language.', 'paid-memberships-pro' ); ?> <a href="https://translate.wordpress.org/projects/wp-plugins/paid-memberships-pro" target="_blank"><?php esc_html_e( 'Translation Dashboard', 'paid-memberships-pro' ); ?></a></p>
</div> <!-- end pmpro-dashboard-welcome-column -->
</div> <!-- end pmpro-dashboard-welcome-columns -->
<?php
}
/*
* Callback function for pmpro_dashboard_report_recent_members meta box to show last 5 recent members and a link to the Members List.
*/
function pmpro_dashboard_report_recent_members_callback() {
global $wpdb;
$sqlQuery = "SELECT SQL_CALC_FOUND_ROWS u.ID, u.user_login, u.user_email, UNIX_TIMESTAMP(u.user_registered) as joindate, mu.membership_id, mu.initial_payment, mu.billing_amount, mu.cycle_period, mu.cycle_number, mu.billing_limit, mu.trial_amount, mu.trial_limit, UNIX_TIMESTAMP(mu.startdate) as startdate, UNIX_TIMESTAMP(mu.enddate) as enddate, m.name as membership FROM $wpdb->users u LEFT JOIN $wpdb->pmpro_memberships_users mu ON u.ID = mu.user_id LEFT JOIN $wpdb->pmpro_membership_levels m ON mu.membership_id = m.id WHERE mu.membership_id > 0 AND mu.status = 'active' GROUP BY u.ID ORDER BY u.user_registered DESC LIMIT 5";
$sqlQuery = apply_filters( 'pmpro_members_list_sql', $sqlQuery );
$theusers = $wpdb->get_results( $sqlQuery ); ?>
<span id="pmpro_report_members" class="pmpro_report-holder">
<table class="wp-list-table widefat fixed striped">
<thead>
<tr>
<th><?php _e( 'Username', 'paid-memberships-pro' );?></th>
<th><?php _e( 'Membership', 'paid-memberships-pro' );?></th>
<th><?php _e( 'Joined', 'paid-memberships-pro' );?></th>
<th><?php _e( 'Expires', 'paid-memberships-pro' ); ?></th>
</tr>
</thead>
<tbody>
<?php if ( empty( $theusers ) ) { ?>
<tr>
<td colspan="4"><p><?php _e( 'No members found.', 'paid-memberships-pro' ); ?></p></td>
</tr>
<?php } else {
foreach ( $theusers as $auser ) {
$auser = apply_filters( 'pmpro_members_list_user', $auser );
//get meta
$theuser = get_userdata( $auser->ID ); ?>
<tr>
<td class="username column-username">
<?php echo get_avatar($theuser->ID, 32)?>
<strong>
<?php
$userlink = '<a href="' . get_edit_user_link( $theuser->ID ) . '">' . esc_attr( $theuser->user_login ) . '</a>';
$userlink = apply_filters( 'pmpro_members_list_user_link', $userlink, $theuser );
echo $userlink;
?>
</strong>
</td>
<td><?php esc_attr_e( $auser->membership ); ?></td>
<td><?php echo date_i18n( get_option( 'date_format' ), strtotime( $theuser->user_registered, current_time( 'timestamp' ) ) ); ?></td>
<td>
<?php
if($auser->enddate)
echo apply_filters("pmpro_memberslist_expires_column", date_i18n(get_option('date_format'), $auser->enddate), $auser);
// show next recurring payment date if on a billing cycle
elseif( '' != $auser->cycle_period)
echo apply_filters("pmpro_memberslist_expires_column", 'Never. Renews on ' . date_i18n(get_option('date_format'), pmpro_next_payment($auser->ID)), $auser);
else
echo __(apply_filters("pmpro_memberslist_expires_column", "Never", $auser), "pmpro");
?>
</td>
</tr>
<?php
}
}
?>
</tbody>
</table>
</span>
<?php if ( ! empty( $theusers ) ) { ?>
<p class="text-center"><a class="button button-primary" href="<?php echo admin_url( 'admin.php?page=pmpro-memberslist' ); ?>"><?php esc_attr_e( 'View All Members ', 'paid-memberships-pro' ); ?></a></p>
<?php } ?>
<?php
}
/*
* Callback function for pmpro_dashboard_report_recent_orders meta box to show last 5 recent orders and a link to view all Orders.
*/
function pmpro_dashboard_report_recent_orders_callback() {
global $wpdb;
$sqlQuery = "SELECT SQL_CALC_FOUND_ROWS id FROM $wpdb->pmpro_membership_orders ORDER BY id DESC, timestamp DESC LIMIT 5";
$order_ids = $wpdb->get_col( $sqlQuery );
$totalrows = $wpdb->get_var( 'SELECT FOUND_ROWS() as found_rows' );
?>
<span id="pmpro_report_orders" class="pmpro_report-holder">
<table class="wp-list-table widefat fixed striped">
<thead>
<tr class="thead">
<th><?php _e( 'Code', 'paid-memberships-pro' ); ?></th>
<th><?php _e( 'User', 'paid-memberships-pro' ); ?></th>
<th><?php _e( 'Level', 'paid-memberships-pro' ); ?></th>
<th><?php _e( 'Total', 'paid-memberships-pro' ); ?></th>
<th><?php _e( 'Status', 'paid-memberships-pro' ); ?></th>
<th><?php _e( 'Date', 'paid-memberships-pro' ); ?></th>
</tr>
</thead>
<tbody id="orders" class="orders-list">
<?php
if ( empty( $order_ids ) ) { ?>
<tr>
<td colspan="8"><p><?php _e( 'No orders found.', 'paid-memberships-pro' ); ?></p></td>
</tr>
<?php } else {
foreach ( $order_ids as $order_id ) {
$order = new MemberOrder();
$order->nogateway = true;
$order->getMemberOrderByID( $order_id );
?>
<tr>
<td>
<a href="admin.php?page=pmpro-orders&order=<?php echo $order->id; ?>"><?php echo $order->code; ?></a>
</td>
<td class="username column-username">
<?php $order->getUser(); ?>
<?php if ( ! empty( $order->user ) ) { ?>
<a href="user-edit.php?user_id=<?php echo $order->user->ID; ?>"><?php echo $order->user->user_login; ?></a>
<?php } elseif ( $order->user_id > 0 ) { ?>
[<?php _e( 'deleted', 'paid-memberships-pro' ); ?>]
<?php } else { ?>
[<?php _e( 'none', 'paid-memberships-pro' ); ?>]
<?php } ?>
<?php if ( ! empty( $order->billing->name ) ) { ?>
<br /><?php echo $order->billing->name; ?>
<?php } ?>
</td>
<td><?php echo $order->membership_id; ?></td>
<td><?php echo pmpro_formatPrice( $order->total ); ?></td>
<td>
<?php echo $order->gateway; ?>
<?php if ( $order->gateway_environment == 'test' ) {
echo '(test)';
} ?>
<?php if ( ! empty( $order->status ) ) {
echo '<br />(' . $order->status . ')';
} ?>
</td>
<td><?php echo date_i18n( get_option( 'date_format' ), $order->timestamp ); ?></td>
</tr>
<?php
}
}
?>
</tbody>
</table>
</span>
<?php if ( ! empty( $order_ids ) ) { ?>
<p class="text-center"><a class="button button-primary" href="<?php echo admin_url( 'admin.php?page=pmpro-orders' ); ?>"><?php esc_attr_e( 'View All Orders ', 'paid-memberships-pro' ); ?></a></p>
<?php } ?>
<?php
}
/*
* Callback function for pmpro_dashboard_news_updates meta box to show RSS Feed from Paid Memberships Pro blog.
*/
function pmpro_dashboard_news_updates_callback() {
// Get RSS Feed(s)
include_once( ABSPATH . WPINC . '/feed.php' );
// Get a SimplePie feed object from the specified feed source.
$rss = fetch_feed( 'https://www.paidmembershipspro.com/feed/' );
$maxitems = 0;
if ( ! is_wp_error( $rss ) ) : // Checks that the object is created correctly
// Figure out how many total items there are, but limit it to 5.
$maxitems = $rss->get_item_quantity( 5 );
// Build an array of all the items, starting with element 0 (first element).
$rss_items = $rss->get_items( 0, $maxitems );
endif;
?>
<ul>
<?php if ( $maxitems == 0 ) : ?>
<li><?php _e( 'No news found.', 'paid-memberships-pro' ); ?></li>
<?php else : ?>
<?php // Loop through each feed item and display each item as a hyperlink. ?>
<?php foreach ( $rss_items as $item ) : ?>
<li>
<a href="<?php echo esc_url( $item->get_permalink() ); ?>"
title="<?php printf( __( 'Posted %s', 'paid-memberships-pro' ), $item->get_date( get_option( 'date_format' ) ) ); ?>">
<?php echo esc_html( $item->get_title() ); ?>
</a>
<?php echo esc_html( $item->get_date( get_option( 'date_format' ) ) ); ?>
</li>
<?php endforeach; ?>
<?php endif; ?>
</ul>
<p class="text-center"><a class="button button-primary" href="<?php echo esc_url( 'https://www.paidmembershipspro.com/blog/' ); ?>"><?php esc_attr_e( 'View More', 'paid-memberships-pro' ); ?></a></p>
<?php
}
/**
* Load the Paid Memberships Pro dashboard-area footer
*/
require_once( dirname( __FILE__ ) . '/admin_footer.php' );
<?php
/* Custom Memberlist page displaying renwal dates for recurring subscriptions under the Expires column
* Replace wp-content/plugins/paid-memberships-pro/adminpages/memberslist.php with this file.
* This page will be overwritten with every update of the Paid Memberships Pro core plugin
* As this is a custom override of a core file it is a "use-at-own-risk" option.
*/
//only admins can get this
if(!function_exists("current_user_can") || (!current_user_can("manage_options") && !current_user_can("pmpro_memberslist")))
{
die(__("You do not have permissions to perform this action.", 'paid-memberships-pro' ));
}
//vars
global $wpdb;
if(isset($_REQUEST['s']))
$s = sanitize_text_field(trim($_REQUEST['s']));
else
$s = "";
if(isset($_REQUEST['l']))
$l = sanitize_text_field($_REQUEST['l']);
else
$l = false;
require_once(dirname(__FILE__) . "/admin_header.php");
?>
<form id="posts-filter" method="get" action="">
<h2>
<?php _e('Members List', 'paid-memberships-pro' );?>
<a target="_blank" href="<?php echo admin_url('admin-ajax.php');?>?action=memberslist_csv&s=<?php echo esc_attr($s);?>&l=<?php echo $l?>" class="add-new-h2"><?php _e('Export to CSV', 'paid-memberships-pro' );?></a>
</h2>
<ul class="subsubsub">
<li>
<?php _e('Show', 'paid-memberships-pro' );?>
<select name="l" onchange="jQuery('#posts-filter').submit();">
<option value="" <?php if(!$l) { ?>selected="selected"<?php } ?>><?php _e('All Levels', 'paid-memberships-pro' );?></option>
<?php
$levels = $wpdb->get_results("SELECT id, name FROM $wpdb->pmpro_membership_levels ORDER BY name");
foreach($levels as $level)
{
?>
<option value="<?php echo $level->id?>" <?php if($l == $level->id) { ?>selected="selected"<?php } ?>><?php echo $level->name?></option>
<?php
}
?>
<option value="cancelled" <?php if($l == "cancelled") { ?>selected="selected"<?php } ?>><?php _e('Cancelled Members', 'paid-memberships-pro' );?></option>
<option value="expired" <?php if($l == "expired") { ?>selected="selected"<?php } ?>><?php _e('Expired Members', 'paid-memberships-pro' );?></option>
<option value="oldmembers" <?php if($l == "oldmembers") { ?>selected="selected"<?php } ?>><?php _e('Old Members', 'paid-memberships-pro' );?></option>
</select>
</li>
</ul>
<p class="search-box">
<label class="hidden" for="post-search-input"><?php _e('Search Members', 'paid-memberships-pro' );?>:</label>
<input type="hidden" name="page" value="pmpro-memberslist" />
<input id="post-search-input" type="text" value="<?php echo esc_attr($s);?>" name="s"/>
<input class="button" type="submit" value="<?php _e('Search Members', 'paid-memberships-pro' );?>"/>
</p>
<?php
//some vars for the search
if(isset($_REQUEST['pn']))
$pn = intval($_REQUEST['pn']);
else
$pn = 1;
if(isset($_REQUEST['limit']))
$limit = intval($_REQUEST['limit']);
else
{
/**
* Filter to set the default number of items to show per page
* on the Members List page in the admin.
*
* @since 1.8.4.5
*
* @param int $limit The number of items to show per page.
*/
$limit = apply_filters('pmpro_memberslist_per_page', 15);
}
$end = $pn * $limit;
$start = $end - $limit;
if($s)
{
$sqlQuery = "SELECT SQL_CALC_FOUND_ROWS u.ID, u.user_login, u.user_email, UNIX_TIMESTAMP(u.user_registered) as joindate, mu.membership_id, mu.initial_payment, mu.billing_amount, mu.cycle_period, mu.cycle_number, mu.billing_limit, mu.trial_amount, mu.trial_limit, UNIX_TIMESTAMP(mu.startdate) as startdate, UNIX_TIMESTAMP(mu.enddate) as enddate, m.name as membership FROM $wpdb->users u LEFT JOIN $wpdb->usermeta um ON u.ID = um.user_id LEFT JOIN $wpdb->pmpro_memberships_users mu ON u.ID = mu.user_id LEFT JOIN $wpdb->pmpro_membership_levels m ON mu.membership_id = m.id ";
if($l == "oldmembers" || $l == "expired" || $l == "cancelled")
$sqlQuery .= " LEFT JOIN $wpdb->pmpro_memberships_users mu2 ON u.ID = mu2.user_id AND mu2.status = 'active' ";
$sqlQuery .= " WHERE mu.membership_id > 0 AND (u.user_login LIKE '%" . esc_sql($s) . "%' OR u.user_email LIKE '%" . esc_sql($s) . "%' OR um.meta_value LIKE '%" . esc_sql($s) . "%' OR u.display_name LIKE '%" . esc_sql($s) . "%') ";
if($l == "oldmembers")
$sqlQuery .= " AND mu.status <> 'active' AND mu2.status IS NULL ";
elseif($l == "expired")
$sqlQuery .= " AND mu.status = 'expired' AND mu2.status IS NULL ";
elseif($l == "cancelled")
$sqlQuery .= " AND mu.status IN('cancelled', 'admin_cancelled') AND mu2.status IS NULL ";
elseif($l)
$sqlQuery .= " AND mu.status = 'active' AND mu.membership_id = '" . esc_sql($l) . "' ";
else
$sqlQuery .= " AND mu.status = 'active' ";
$sqlQuery .= "GROUP BY u.ID ";
if($l == "oldmembers" || $l == "expired" || $l == "cancelled")
$sqlQuery .= "ORDER BY enddate DESC ";
else
$sqlQuery .= "ORDER BY u.user_registered DESC ";
$sqlQuery .= "LIMIT $start, $limit";
}
else
{
$sqlQuery = "SELECT SQL_CALC_FOUND_ROWS u.ID, u.user_login, u.user_email, UNIX_TIMESTAMP(u.user_registered) as joindate, mu.membership_id, mu.initial_payment, mu.billing_amount, mu.cycle_period, mu.cycle_number, mu.billing_limit, mu.trial_amount, mu.trial_limit, UNIX_TIMESTAMP(mu.startdate) as startdate, UNIX_TIMESTAMP(mu.enddate) as enddate, m.name as membership FROM $wpdb->users u LEFT JOIN $wpdb->pmpro_memberships_users mu ON u.ID = mu.user_id LEFT JOIN $wpdb->pmpro_membership_levels m ON mu.membership_id = m.id";
if($l == "oldmembers" || $l == "expired" || $l == "cancelled")
$sqlQuery .= " LEFT JOIN $wpdb->pmpro_memberships_users mu2 ON u.ID = mu2.user_id AND mu2.status = 'active' ";
$sqlQuery .= " WHERE mu.membership_id > 0 ";
if($l == "oldmembers")
$sqlQuery .= " AND mu.status <> 'active' AND mu2.status IS NULL ";
elseif($l == "expired")
$sqlQuery .= " AND mu.status = 'expired' AND mu2.status IS NULL ";
elseif($l == "cancelled")
$sqlQuery .= " AND mu.status IN('cancelled', 'admin_cancelled') AND mu2.status IS NULL ";
elseif($l)
$sqlQuery .= " AND mu.status = 'active' AND mu.membership_id = '" . esc_sql($l) . "' ";
else
$sqlQuery .= " AND mu.status = 'active' ";
$sqlQuery .= "GROUP BY u.ID ";
if($l == "oldmembers" || $l == "expired" || $l == "cancelled")
$sqlQuery .= "ORDER BY enddate DESC ";
else
$sqlQuery .= "ORDER BY u.user_registered DESC ";
$sqlQuery .= "LIMIT $start, $limit";
}
$sqlQuery = apply_filters("pmpro_members_list_sql", $sqlQuery);
$theusers = $wpdb->get_results($sqlQuery);
$totalrows = $wpdb->get_var("SELECT FOUND_ROWS() as found_rows");
if($theusers)
{
$calculate_revenue = apply_filters("pmpro_memberslist_calculate_revenue", false);
if($calculate_revenue)
{
$initial_payments = pmpro_calculateInitialPaymentRevenue($s, $l);
$recurring_payments = pmpro_calculateRecurringRevenue($s, $l);
?>
<p class="clear"><?php echo strval($totalrows)?> members found. These members have paid <strong>$<?php echo number_format($initial_payments)?> in initial payments</strong> and will generate an estimated <strong>$<?php echo number_format($recurring_payments)?> in revenue over the next year</strong>, or <strong>$<?php echo number_format($recurring_payments/12)?>/month</strong>. <span class="pmpro_lite">(This estimate does not take into account trial periods or billing limits.)</span></p>
<?php
}
else
{
?>
<p class="clear"><?php printf(__("%d members found.", 'paid-memberships-pro' ), $totalrows);?></span></p>
<?php
}
}
?>
<table class="widefat">
<thead>
<tr class="thead">
<th><?php _e('ID', 'paid-memberships-pro' );?></th>
<th><?php _e('Username', 'paid-memberships-pro' );?></th>
<th><?php _e('First&nbsp;Name', 'paid-memberships-pro' );?></th>
<th><?php _e('Last&nbsp;Name', 'paid-memberships-pro' );?></th>
<th><?php _e('Email', 'paid-memberships-pro' );?></th>
<?php do_action("pmpro_memberslist_extra_cols_header", $theusers);?>
<th><?php _e('Billing Address', 'paid-memberships-pro' );?></th>
<th><?php _e('Membership', 'paid-memberships-pro' );?></th>
<th><?php _e('Fee', 'paid-memberships-pro' );?></th>
<th><?php _e('Joined', 'paid-memberships-pro' );?></th>
<th>
<?php
if($l == "oldmembers")
_e('Ended', 'paid-memberships-pro' );
elseif($l == "cancelled")
_e('Cancelled', 'paid-memberships-pro' );
elseif($l == "expired")
_e('Expired', 'paid-memberships-pro' );
else
_e('Expires', 'paid-memberships-pro' );
?>
</th>
</tr>
</thead>
<tbody id="users" class="list:user user-list">
<?php
$count = 0;
foreach($theusers as $auser)
{
$auser = apply_filters("pmpro_members_list_user", $auser);
//get meta
$theuser = get_userdata($auser->ID);
?>
<tr <?php if($count++ % 2 == 0) { ?>class="alternate"<?php } ?>>
<td><?php echo $theuser->ID?></td>
<td class="username column-username">
<?php echo get_avatar($theuser->ID, 32)?>
<strong>
<?php
$userlink = '<a href="user-edit.php?user_id=' . $theuser->ID . '">' . $theuser->user_login . '</a>';
$userlink = apply_filters("pmpro_members_list_user_link", $userlink, $theuser);
echo $userlink;
?>
</strong>
<br />
<?php
// Set up the hover actions for this user
$actions = apply_filters( 'pmpro_memberslist_user_row_actions', array(), $theuser );
$action_count = count( $actions );
$i = 0;
if($action_count)
{
$out = '<div class="row-actions">';
foreach ( $actions as $action => $link ) {
++$i;
( $i == $action_count ) ? $sep = '' : $sep = ' | ';
$out .= "<span class='$action'>$link$sep</span>";
}
$out .= '</div>';
echo $out;
}
?>
</td>
<td><?php echo $theuser->first_name?></td>
<td><?php echo $theuser->last_name?></td>
<td><a href="mailto:<?php echo esc_attr($theuser->user_email)?>"><?php echo $theuser->user_email?></a></td>
<?php do_action("pmpro_memberslist_extra_cols_body", $theuser);?>
<td>
<?php
echo pmpro_formatAddress(trim($theuser->pmpro_bfirstname . " " . $theuser->pmpro_blastname), $theuser->pmpro_baddress1, $theuser->pmpro_baddress2, $theuser->pmpro_bcity, $theuser->pmpro_bstate, $theuser->pmpro_bzipcode, $theuser->pmpro_bcountry, $theuser->pmpro_bphone);
?>
</td>
<td><?php echo $auser->membership?></td>
<td>
<?php if((float)$auser->initial_payment > 0) { ?>
<?php echo pmpro_formatPrice($auser->initial_payment);?>
<?php } ?>
<?php if((float)$auser->initial_payment > 0 && (float)$auser->billing_amount > 0) { ?>+<br /><?php } ?>
<?php if((float)$auser->billing_amount > 0) { ?>
<?php echo pmpro_formatPrice($auser->billing_amount);?>/<?php if($auser->cycle_number > 1) { echo $auser->cycle_number . " " . $auser->cycle_period . "s"; } else { echo $auser->cycle_period; } ?>
<?php } ?>
<?php if((float)$auser->initial_payment <= 0 && (float)$auser->billing_amount <= 0) { ?>
-
<?php } ?>
</td>
<td><?php echo date_i18n(get_option("date_format"), strtotime($theuser->user_registered, current_time("timestamp")))?></td>
<td>
<?php
if($auser->enddate)
echo apply_filters("pmpro_memberslist_expires_column", date_i18n(get_option('date_format'), $auser->enddate), $auser);
// show next recurring payment date if on a billing cycle
elseif( '' != $auser->cycle_period)
echo apply_filters("pmpro_memberslist_expires_column", 'Never. Renews on ' . date_i18n(get_option('date_format'), pmpro_next_payment($auser->ID)), $auser);
else
echo __(apply_filters("pmpro_memberslist_expires_column", "Never", $auser), "pmpro");
?>
</td>
</tr>
<?php
}
if(!$theusers)
{
?>
<tr>
<td colspan="9">
<p>
<?php _e( 'No members found.', 'paid-memberships-pro' ); ?>
<?php if ( $l ) { ?>
<a href="<?php echo esc_url( add_query_arg( array( 'page' => 'pmpro-memberslist', 's' => $s ) ) ); ?>"><?php _e( 'Search all levels', 'paid-memberships-pro' );?></a>
<?php } ?>
</p>
<hr />
<p><?php _e( 'You can also try searching:', 'paid-memberships-pro' ); ?>
<ul class="ul-disc">
<li><a href="<?php echo esc_url( add_query_arg( array( 'page' => 'pmpro-memberslist', 'l' => 'cancelled', 's' => $s ) ) ); ?>"><?php _e( 'Cancelled Members', 'paid-memberships-pro' ); ?></a></li>
<li><a href="<?php echo esc_url( add_query_arg( array( 'page' => 'pmpro-memberslist', 'l' => 'expired', 's' => $s ) ) ); ?>"><?php _e( 'Expired Members', 'paid-memberships-pro' ); ?></a></li>
<li><a href="<?php echo esc_url( add_query_arg( array( 'page' => 'pmpro-memberslist', 'l' => 'oldmembers', 's' => $s ) ) ); ?>"><?php _e( 'Old Members', 'paid-memberships-pro' ); ?></a></li>
<li><a href="<?php echo esc_url( add_query_arg( array( 's' => $s ), admin_url( 'users.php' ) ) ); ?>"><?php _e( 'All Users', 'paid-memberships-pro' ); ?></a></li>
</ul>
</td>
</tr>
<?php
}
?>
</tbody>
</table>
</form>
<?php
echo pmpro_getPaginationString($pn, $totalrows, $limit, 1, add_query_arg(array("s" => urlencode($s), "l" => $l, "limit" => $limit)));
?>
<?php
require_once(dirname(__FILE__) . "/admin_footer.php");
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment