Skip to content

feat(providers): add MemberPressMembershipProvider (v1.5.0) - #14

Merged
raftaar1191 merged 1 commit into
mainfrom
release/v1.5.0
Jun 17, 2026
Merged

raftaar1191 merged 1 commit into
mainfrom
release/v1.5.0

Conversation

@raftaar1191

Copy link
Copy Markdown
Contributor

Summary

  • Adds a fifth built-in provider, MemberPressMembershipProvider (mepr_membership), so the React UI's Who can access dropdown can gate a resource by one or more MemberPress memberships
  • Discovers options from the memberpressproduct CPT via get_posts() (canonical IDs/titles) — no MemberPress autoloader trip is required for the listing
  • Access is granted when MeprUser::active_product_subscriptions() intersects any selected membership ID (IDs coerced to strings for the strict intersect)
  • Two new filters: wpb_access_control_mepr_membership_options and wpb_access_control_mepr_membership_has_access

MemberPress-inactive safety

Every code path guards behind is_available() (defined('MEPR_VERSION') && class_exists('MeprUser')). When MemberPress is inactive:

  • REST /providers payload reports available: false → the React ProviderDropdown hides the entry automatically
  • get_options() short-circuits to [] — get_posts() is never called
  • user_has_access() denies — MeprUser is never instantiated

Changes

  • src/MemberPressMembershipProvider.php — new provider class
  • src/AccessControlManager.php — registered alongside wp_role / wp_user / wp_capability / bb_profile_type
  • js/components/RoleOptionsPanel.js — UI subtitle for mepr_membership
  • tests/Unit/MemberPressMembershipProviderTest.php — 20 new tests
  • tests/bootstrap.php — minimal \MeprUser stub + MEPR_VERSION so tests run without MemberPress installed
  • assets/build/index.js — rebuilt via wp-scripts build
  • README.md / CHANGELOG.md — documented

Test plan

  • composer test — 158 tests / 216 assertions, all green
  • npm run build — wp-scripts compiles cleanly
  • Smoke test with MemberPress active: dropdown shows MemberPress Membership, save a rule, verify access flips for subscribed/unsubscribed users
  • Smoke test with MemberPress inactive: option hidden from dropdown, REST /providers reports available: false, existing mepr_membership rules deny
  • CI matrix passes on PHP 8.1 – 8.5

🤖 Generated with Claude Code

Gates resources by one or more MemberPress memberships. Options are sourced
from the memberpressproduct CPT via get_posts() and labels from
post_title (synthetic "Membership #N" fallback). Access is granted when
MeprUser::active_product_subscriptions() intersects any selected
membership ID — subscription IDs are coerced to strings for a strict
intersect against the stored option list.

The provider depends on MemberPress. Every method guards its API calls
behind is_available() (defined(MEPR_VERSION) && class_exists(MeprUser)),
so when MemberPress is inactive:

- The REST /providers payload reports available: false — ProviderDropdown
  hides the entry automatically.
- get_options() short-circuits to [] (get_posts is never called).
- user_has_access() denies (MeprUser is never instantiated).

Files:
- src/MemberPressMembershipProvider.php — new provider class with two
  filters (wpb_access_control_mepr_membership_options,
   wpb_access_control_mepr_membership_has_access).
- src/AccessControlManager.php — registered as a default provider.
- js/components/RoleOptionsPanel.js — description string for
  mepr_membership; existing checkbox panel renders the new options.
- tests/Unit/MemberPressMembershipProviderTest.php — 20 new tests covering
  identity, is_available, get_options (unavailability guard, post→option
  mapping, title fallback, missing-ID skip, filter override) and
  user_has_access (unavailability guard, empty options, no
  subscriptions, intersect match, int→string coercion, filter override).
- tests/bootstrap.php — adds MEPR_VERSION constant and a minimal global
  \MeprUser stub class so the test suite can run without MemberPress
  installed.
- README.md / CHANGELOG.md — documented new provider and filters.

PHPUnit: 158 tests / 216 assertions all green. JS assets rebuilt via
wp-scripts.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@raftaar1191
raftaar1191 merged commit 1ef4906 into main Jun 17, 2026
5 checks passed
@raftaar1191
raftaar1191 deleted the release/v1.5.0 branch June 17, 2026 18:05
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