Skip to content

Rename Members List to Memberships and add Orders-style filter panel - #3728

Draft
dparker1005 wants to merge 1 commit into
strangerstudios:devfrom
dparker1005:update/memberships-terminology-and-filters
Draft

Rename Members List to Memberships and add Orders-style filter panel#3728
dparker1005 wants to merge 1 commit into
strangerstudios:devfrom
dparker1005:update/memberships-terminology-and-filters

Conversation

@dparker1005

Copy link
Copy Markdown
Member

What this does

Terminology: Members List → Memberships

Now that a single user can hold multiple levels, each row in this list is a membership (user + level), not a member — the query has grouped by u.ID, mu.membership_id for a while, so the labels are catching up to the code.

  • Admin submenu, admin bar node, header nav tab, and page H1 renamed to Memberships.
  • List table singular/plural, "Memberships per page" screen option, and "No memberships found." empty state updated.
  • Person-oriented language is intentionally kept: Add New Member, Search Members, Edit Member.
  • No changes to slugs (pmpro-memberslist), capabilities, or hook names — existing links and add-ons are unaffected.

Filtering: same filter panel as Orders and Subscriptions

Replaces the single overloaded dropdown (which mixed levels with Cancelled/Expired/Old Members and could not combine them) with the pmpro-filter-panel sidebar used on the Orders and Subscriptions pages:

  • Level — any level, now combinable with status (e.g. "expired Gold memberships").
  • Status — Active (default) / Cancelled / Expired / All Ended. "All Ended" uses an explicit status list from the new filterable pmpro_get_ended_membership_statuses() (expired, cancelled, admin_cancelled, changed, admin_changed, inactive) rather than <> 'active', so incomplete-checkout statuses (token, pending, review, error) can't leak in.
  • Ended Memberships (shown only for ended statuses) — "Hide if the same level is now active" (default) or "Hide if any level is now active".

Ended-view semantics

Each row represents the current state of a user's relationship with a level, so ended views always hide a row when that same level has been re-activated (a user who expired out of Gold and re-purchased Gold is not an "expired membership"). The old behavior — only show users with no active membership at all — is the "any level" option. This fixes the long-standing quirk where a user who downgraded from Gold to Silver never appeared anywhere as an ended Gold membership.

Shared query semantics for list + export

New pmpro_sanitize_memberships_list_filters() and pmpro_memberships_list_filter_sql() helpers are used by both the list table and the members CSV export, so exported rows always match the rows on screen.

Backwards compatibility

  • Legacy l=cancelled, l=expired, and l=oldmembers URLs (dashboard, reports, admin activity email, add-ons) are mapped to the new status/excludeactive params with their original no-active-membership behavior preserved.
  • Numeric l values behave exactly as before (level + active).
  • pmpro_members_list_sql and all column/CSV hooks fire unchanged.

Bug fix along the way

column_enddate() keyed off the legacy l values, so ended views reached via the new status param rendered blank end dates; it now uses the normalized status filter.

Testing

  1. Go to Memberships > Memberships. Confirm the default view shows active memberships and the Filter Results button opens the sidebar panel.
  2. Create a user with an expired level A and an active level B. Filter Status = Expired: the expired A row shows with "Hide if the same level is now active" and hides with "Hide if any level is now active".
  3. Create a user with an expired level A who re-purchased level A. The expired row is hidden under every ended view.
  4. Visit a legacy URL like admin.php?page=pmpro-memberslist&l=expired and confirm it matches the pre-change results (only users with no active membership), with the panel reflecting Expired + "any level".
  5. Combine a Level with Status = Expired/Cancelled/All Ended and confirm results, sorting by end date, and the End Date column values.
  6. Export to CSV from a filtered view and confirm the rows match the screen.

🤖 Generated with Claude Code

- Rename user-facing "Members"/"Members List" labels to "Memberships" on the
  list page, admin menu, admin bar, and header nav. Slugs, capabilities, and
  hook names are unchanged. Person-oriented actions (Add New Member, Search
  Members, Edit Member) keep "member" language.
- Replace the overloaded level dropdown with a filter sidebar panel matching
  the Orders and Subscriptions pages: Level, Status (Active, Cancelled,
  Expired, All Ended), and an Ended Memberships selector controlling whether
  rows are hidden when the same level or any level is active again.
- Level and status filters can now be combined, and ended views always hide
  rows where the user has re-activated the same level.
- Add pmpro_sanitize_memberships_list_filters(), pmpro_memberships_list_filter_sql(),
  and pmpro_get_ended_membership_statuses() (filterable) so the list table and
  the members CSV export share one set of filter semantics.
- Legacy l=cancelled|expired|oldmembers links are mapped to the new filters
  with their original users-with-no-active-membership behavior preserved.
- Fix the End Date column rendering blank when filtering ended memberships
  with the new status parameter.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@dparker1005 dparker1005 added this to the 3.9 milestone Aug 18, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant