How can we ensure members renew as the same membership type? At initial sign-up, they can choose their type but after that, renewals should be as the same type - they should not be able to renew as a different type.

One option is to create separate contribution pages for each membership type, then have a join page that links to each of those. And then setup scheduled reminders for each type with links to the contribution page for renewal. With 13 membership types, that's a lot of setup.

So we're looker for a smarter way to do that. Any ideas or useful extensions? Drupal system so webforms are an option.

  • 1
    I hear you - we inherited a project that had a one per membership type contribution page for a professional association - I wrote an extension that loads the current membership and then disables all other membership options - very simple and effective - happy to share the essential bits of that extension with you – KarinG - Semper IT Jun 13 '19 at 2:47

With Drupal webforms I am pretty sure you can set the Membership Type to be locked so renewing folk won't be able to change from the one that loads - will only work if they are logged in or using a checksum.

  • I did not know that :-) Cool – KarinG - Semper IT Jun 13 '19 at 2:48
  • "Locked fields" seems to only be a feature of the existing contact itself. But setting membership type to 'user select' and then changing the widget type to 'hidden' seems to have a similar effect. Or did you mean something else Pete? – Aidan Jun 13 '19 at 11:49
  • I meant "changing the widget type to 'hidden'" - if that works I should change the answer – petednz - fuzion Jun 13 '19 at 19:59
  • Is there any solution for Wordpress? – Marian Zastawny Feb 6 '20 at 23:25
  • if there is it will involve Caldera Forms – petednz - fuzion Feb 7 '20 at 3:06

The key bits are:

function membershipcards_civicrm_buildForm_CRM_Contribute_Form_Contribution_Main(&$form) { 

  $currentMemberships = array_keys($form ->_currentMemberships);
  // Assuming there is only 1 current Membership - display it (first result):
  $currentMembershipID = $currentMemberships[0];
  // price_43 -> is element 24 (_label = Membership)
  // price_42 -> is element 25 (_label = Additional Contribution)
  $elementId_membership = $form->_elementIndex['price_43'];
  $elementId_latefees = $form->_elementIndex['price_42'];

  foreach ($form->_elements[$elementId_membership]->_elements as $key => $oneMembership) {
    if ($oneMembership->_attributes['membership-type'] != $currentMembershipID) {
  • KarinG - Semper IT, did you ever take this further? I've got a site where the members start as students, become candidates and then full members and in order to maintain a history, we keep all member records intact rather than just add different membership levels as they progress. By default CiviCRM would like to renew the first membership they ever had so it would be much better to just renew the current. Cheers, Andrew – Andrew Wasson Dec 3 '20 at 0:32
  • That snippet is from a live site - a professional association. Can't upgrade yourself to be a fully licensed Dental Technologist! So that loads the current Membership and then removes all non-current Membership options from the CiviCRM Contribution form. You can put this into a Drupal module or in an extension. – KarinG - Semper IT Dec 3 '20 at 1:18
  • Nice work! It's exactly what I need. I use Civi for professional associations as well: Planners, Psychologists and Architects. Thanks, – Andrew Wasson Dec 3 '20 at 2:23
  • 👍 excellent - glad this helped you out – KarinG - Semper IT Dec 3 '20 at 14:46

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.