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 Commented Jun 13, 2019 at 2:47

2 Answers 2


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 Commented Jun 13, 2019 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
    Commented Jun 13, 2019 at 11:49
  • I meant "changing the widget type to 'hidden'" - if that works I should change the answer
    – petednz - fuzion
    Commented Jun 13, 2019 at 19:59
  • Is there any solution for Wordpress? Commented Feb 6, 2020 at 23:25
  • if there is it will involve Caldera Forms
    – petednz - fuzion
    Commented Feb 7, 2020 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 Commented Dec 3, 2020 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. Commented Dec 3, 2020 at 1:18
  • Nice work! It's exactly what I need. I use Civi for professional associations as well: Planners, Psychologists and Architects. Thanks, Commented Dec 3, 2020 at 2:23
  • 👍 excellent - glad this helped you out Commented Dec 3, 2020 at 14:46

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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