Last active
October 31, 2023 12:06
-
-
Save ipokkel/327e8fac1d193f0b303ca52d2da737da to your computer and use it in GitHub Desktop.
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 | |
/** | |
* This recipe creates Member Numbers with a prefix that may be customized per level ID. | |
* | |
* Change the generate_member_number function if your member number needs to be in a certain format. | |
* Member numbers are generated when users are registered or when the membership account page | |
* is accessed for the first time. | |
* | |
* Set your default member number prefix in the $member_number_prefix variable. | |
* | |
* Set your member level prefixes in the $member_number_prefix_levels array. | |
* Format is level_id => 'prefix', e.g. 1 => 'LVL1' | |
* | |
* Note: This recipe requires that all prefixes be the same length and will trim the | |
* prefix to the same length as the shortest prefix. | |
* | |
* You can add this recipe to your site by creating a custom plugin | |
* or using the Code Snippets plugin available for free in the WordPress repository. | |
* Read this companion article for step-by-step directions on either method. | |
* https://www.paidmembershipspro.com/create-a-plugin-for-pmpro-customizations/ | |
*/ | |
//Generate member_number when a user is registered. | |
function generate_member_number( $user_id ) { | |
// Set your default member number prefix here. | |
$member_number_prefix = 'FULL'; | |
// Set your member level prefixes here. Format is level_id => 'prefix'. | |
$member_number_prefix_levels = array( | |
1 => 'ASOC', // Associate | |
2 => 'PART', // Partner | |
3 => 'AFFL', // Affiliate | |
); | |
/* That's it! You shouldn't need to edit anything below this line. */ | |
$member_number = get_user_meta( $user_id, 'member_number', true ); | |
//if no member number, create one | |
if ( empty( $member_number ) ) { | |
global $wpdb; | |
//this code gets the last member number used and increments it, adding a prefix based on level at checkout | |
while ( empty( $member_number ) ) { | |
global $pmpro_level; | |
//if no level try to get from user_id | |
if ( empty( $pmpro_level ) ) { | |
$pmpro_level = pmpro_getMembershipLevelForUser( $user_id ); | |
} | |
//if no level, we can't get their number, bail | |
if ( empty( $pmpro_level ) ) { | |
return false; | |
} | |
// set the default lowest character count for a member number prefix from counting $member_number_prefix. | |
$member_number_prefix_length_minimum = strlen( $member_number_prefix ); | |
// if $member_number_prefix_levels is set, loop through it and find the lowest character count. | |
if ( ! empty( $member_number_prefix_levels ) ) { | |
foreach ( $member_number_prefix_levels as $level_id => $prefix ) { | |
$prefix_character_count = strlen( $prefix ); | |
if ( $prefix_character_count < $member_number_prefix_length_minimum ) { | |
$member_number_prefix_length_minimum = $prefix_character_count; | |
} | |
} | |
} | |
// get level id | |
$level_id = $pmpro_level->id; | |
// if level has a prefix, set member type to that prefix, if it doesn't, set it to the default prefix. | |
if ( ! empty( $member_number_prefix_levels[ $level_id ] ) ) { | |
$member_type = $member_number_prefix_levels[ $level_id ]; | |
} else { | |
$member_type = $member_number_prefix; | |
} | |
// All prefixes should be the same length so trim the prefix to the lowest character count. | |
$member_type = substr( $member_type, 0, $member_number_prefix_length_minimum ); | |
// get the number of digits in the prefix including the hyphen | |
$member_number_pad_length = intval( $member_number_prefix_length_minimum ) + 1; // number of digits + 1 hyphen); | |
//get number | |
$r = $wpdb->get_var( "SELECT meta_value FROM $wpdb->usermeta WHERE meta_key = 'member_number' ORDER BY umeta_id DESC LIMIT 1" ); | |
if ( empty( $r ) ) { | |
$number = 1; | |
} else { | |
$number = intval( substr( $r, $member_number_pad_length ) ) + 1; //Change 5 if your character count changes. Count+1 | |
} | |
//put them together | |
$member_number = $member_type . '-' . str_pad( $number, $member_number_pad_length, '0', STR_PAD_LEFT ); | |
} | |
//save to user meta | |
update_user_meta( $user_id, 'member_number', $member_number ); | |
} | |
return $member_number; | |
} | |
add_action( 'user_register', 'generate_member_number' ); | |
//get or generate a member number | |
function get_member_number( $user_id ) { | |
return generate_member_number( $user_id ); | |
} | |
//Show it on the membership account page. | |
function pmpromn_pmpro_account_bullets_bottom() { | |
if ( is_user_logged_in() ) { | |
global $current_user; | |
$member_number = get_member_number( $current_user->ID ); | |
//show it | |
if ( ! empty( $member_number ) ) { | |
?> | |
<li><strong><?php esc_html_e( 'Member Number', 'paid-memberships-pro' ); ?>:</strong> <?php echo esc_html( $member_number ); ?></li> | |
<?php | |
} | |
} | |
} | |
add_action( 'pmpro_account_bullets_bottom', 'pmpromn_pmpro_account_bullets_bottom' ); | |
add_action( 'pmpro_invoice_bullets_bottom', 'pmpromn_pmpro_account_bullets_bottom' ); | |
//show member_number in confirmation emails | |
function pmpromn_pmpro_email_filter( $email ) { | |
global $wpdb; | |
//only update admin confirmation emails | |
if ( strpos( $email->template, 'checkout' ) !== false ) { | |
if ( ! empty( $email->data ) && ! empty( $email->data['user_login'] ) ) { | |
$user = get_user_by( 'login', $email->data['user_login'] ); | |
if ( ! empty( $user ) && ! empty( $user->ID ) ) { | |
$member_number = get_member_number( $user->ID ); | |
if ( ! empty( $member_number ) ) { | |
$email->body = str_replace( '<p>Membership Level', '<p>Member Number:' . $member_number . '</p><p>Membership Level', $email->body ); | |
} | |
} | |
} | |
} | |
return $email; | |
} | |
add_filter( 'pmpro_email_filter', 'pmpromn_pmpro_email_filter', 30, 2 ); | |
//Add 'Member Number' Column to Members List Header | |
function mn_pmpro_memberslist_extra_cols_header( $theusers ) { | |
?> | |
<th><?php _e( 'Member Number', 'paid-memberships-pro' ); ?></th> | |
<?php | |
} | |
add_action( 'pmpro_memberslist_extra_cols_header', 'mn_pmpro_memberslist_extra_cols_header' ); | |
//Add 'Member Number' Column to Members List Rows | |
function mn_pmpro_memberslist_extra_cols_body( $theuser ) { | |
?> | |
<td> | |
<?php | |
$member_number = get_member_number( $theuser->ID ) ? get_member_number( $theuser->ID ) : ''; | |
echo esc_html( $member_number ); | |
?> | |
</td> | |
<?php | |
} | |
add_action( 'pmpro_memberslist_extra_cols_body', 'mn_pmpro_memberslist_extra_cols_body' ); | |
/* | |
Add Member Number to memberslist CSV export | |
*/ | |
//add the column | |
function mn_pmpro_members_list_csv_extra_columns( $columns ) { | |
$columns['membernumber'] = 'mn_pmpro_members_list_csv_memberkey'; | |
return $columns; | |
} | |
add_filter( 'pmpro_members_list_csv_extra_columns', 'mn_pmpro_members_list_csv_extra_columns', 10 ); | |
//call back to get the member key | |
function mn_pmpro_members_list_csv_memberkey( $user ) { | |
$membernumber = get_member_number( $user->ID ); | |
return $membernumber; | |
} | |
/* | |
Add Member Number to the edit user page | |
*/ | |
function mn_user_profile( $user ) { | |
?> | |
<h3><?php _e( 'Member Number', 'mn' ); ?></h3> | |
<table class="form-table"> | |
<tr> | |
<th><label for="membernumber"><?php _e( 'Member Number', 'pmpromk' ); ?></label></th> | |
<td><?php echo esc_html( get_member_number( $user->ID ) ); ?></td> | |
</tr> | |
</table> | |
<?php | |
} | |
add_action( 'show_user_profile', 'mn_user_profile' ); | |
add_action( 'edit_user_profile', 'mn_user_profile' ); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment