Last active
April 30, 2024 16:41
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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 »</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 »' , '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' ); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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 Name', 'paid-memberships-pro' );?></th> | |
<th><?php _e('Last 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