1. The club’s membership ends on a set date, regardless of when a member joins. Can s2 allow for a defined membership end date?
s2Member makes it possible to change the term of the membership, which makes this possible. However you have to make your own system to handle telling s2Member what the subscription term is if you want to do this. There are examples of how you can accomplish this in these threads from the old s2Member forums:
http://www.primothemes.com/forums/viewtopic.php?f=4&t=15619&p=48791#p48791
http://www.primothemes.com/forums/viewtopic.php?f=4&t=6437&p=15261#p15139
2. Members need to be auto-assigned to BuddyPress groups based on their self-selected pace groups. Can s2 auto-assign users to BuddyPress groups?
s2Member doesn’t have a way to do this automatically. I’m not familiar with the procedure for this but I know that Users in the past have achieved this.
3. The club gives discounts when families join the club together. I’m open to suggestions, but my immediate solution would be to use coupon codes to allow subsequent family members to register at a discount. Only thing is that, to prevent abuse, the coupon codes need to be either unique or somehow linked to a full-price member. Does s2 have a way to link memberships?
No s2Member does not offer the capability to link multiple accounts, but you can have multiple pricing options with Pro Forms.
4. This is more for me than for them, but after suffering through a crap database design, I need to be sure s2 stores all member data (in addition to name, address, email, and phone, there’s stuff like t-shirt size, emergency contact information, pace group, etc.) in something resembling a normalized database. I know I’ll have to build custom queries for some other features outside the membership plugin’s scope, and I need to know that I’ll be working with a sane database design.
s2Member stores all of these values in a single Usermeta value in a serialized array in your usermeta table in your database. While this is not ideal for your uses, it is pretty simple to access. You can get all of the information as an array like this:
$custom_fields = get_user_option('s2member_custom_fields');
Updating a custom field value would look like this:
$custom_fields = get_user_option('s2member_custom_fields');
$custom_fields['country'] = $newcountry;
update_user_option($user->ID, 's2member_custom_fields', $custom_fields);