{"id":393883,"date":"2026-11-04T03:12:01","date_gmt":"2026-11-04T03:12:01","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/slnwp-role-extension-for-paid-memberships-pro\/"},"modified":"2026-11-04T03:49:47","modified_gmt":"2026-11-04T03:49:47","slug":"slnwp-role-extension-pmpro","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/slnwp-role-extension-pmpro\/","author":15236178,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.1.11","stable_tag":"2.1.11","tested":"7.1.4","requires":"6.5","requires_php":"7.4","requires_plugins":null,"header_name":"SLNWP Role Extension for Paid Memberships Pro","header_author":"James Harvey","header_description":"Manages WordPress roles in sync with Paid Memberships Pro membership levels. Replaces the official PMPro Roles add-on which had critical bugs around role assignment, removal, and administrator role protection.","assets_banners_color":"82b9d0","last_updated":"2026-11-04 03:49:47","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/soulsong-uk\/slnwp-role-extension-pmpro","header_author_uri":"https:\/\/soulsong.co.uk","rating":0,"author_block_rating":0,"active_installs":0,"downloads":45,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"2.1.10":{"tag":"2.1.10","author":"jainanda","date":"2026-11-04 03:11:42","revision":3783018},"2.1.11":{"tag":"2.1.11","author":"jainanda","date":"2026-11-04 03:49:47","revision":3783066}},"upgrade_notice":{"2.1.10":"<p>First WordPress.org release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3783019,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3783019,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.jpg":{"filename":"banner-1544x500.jpg","revision":3783019,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.jpg":{"filename":"banner-772x250.jpg","revision":3783019,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["2.1.10","2.1.11"],"block_files":[],"assets_screenshots":{"screenshot-1.jpg":{"filename":"screenshot-1.jpg","revision":3783019,"resolution":"1","location":"assets","locale":"","width":1200,"height":697},"screenshot-2.jpg":{"filename":"screenshot-2.jpg","revision":3783019,"resolution":"2","location":"assets","locale":"","width":1200,"height":640},"screenshot-3.jpg":{"filename":"screenshot-3.jpg","revision":3783019,"resolution":"3","location":"assets","locale":"","width":1200,"height":639},"screenshot-4.jpg":{"filename":"screenshot-4.jpg","revision":3783019,"resolution":"4","location":"assets","locale":"","width":1200,"height":662}},"screenshots":{"1":"Choose the WordPress Role for a membership level, in the level's own settings.","2":"The About tab: how roles are kept in sync, and every level's configured role at a glance.","3":"The Sync tab: bring all existing members into line in one click, with the protected roles that are never removed.","4":"The Developers tab: the pmpro_protected_roles filter for adding your own protected roles."}},"plugin_section":[],"plugin_tags":[1932,17862,17864,1915,11917],"plugin_category":[58],"plugin_contributors":[279503],"plugin_business_model":[],"class_list":["post-393883","plugin","type-plugin","status-publish","hentry","plugin_tags-membership","plugin_tags-paid-memberships-pro","plugin_tags-pmpro","plugin_tags-roles","plugin_tags-user-roles","plugin_category-user-management","plugin_contributors-jainanda","plugin_committers-jainanda"],"banners":{"banner":"https:\/\/ps.w.org\/slnwp-role-extension-pmpro\/assets\/banner-772x250.jpg?rev=3783019","banner_2x":"https:\/\/ps.w.org\/slnwp-role-extension-pmpro\/assets\/banner-1544x500.jpg?rev=3783019","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/slnwp-role-extension-pmpro\/assets\/icon-128x128.png?rev=3783019","icon_2x":"https:\/\/ps.w.org\/slnwp-role-extension-pmpro\/assets\/icon-256x256.png?rev=3783019","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/slnwp-role-extension-pmpro\/assets\/screenshot-1.jpg?rev=3783019","caption":"Choose the WordPress Role for a membership level, in the level's own settings."},{"src":"https:\/\/ps.w.org\/slnwp-role-extension-pmpro\/assets\/screenshot-2.jpg?rev=3783019","caption":"The About tab: how roles are kept in sync, and every level's configured role at a glance."},{"src":"https:\/\/ps.w.org\/slnwp-role-extension-pmpro\/assets\/screenshot-3.jpg?rev=3783019","caption":"The Sync tab: bring all existing members into line in one click, with the protected roles that are never removed."},{"src":"https:\/\/ps.w.org\/slnwp-role-extension-pmpro\/assets\/screenshot-4.jpg?rev=3783019","caption":"The Developers tab: the pmpro_protected_roles filter for adding your own protected roles."}],"raw_content":"<!--section=description-->\n<p>Members get a WordPress role for each Paid Memberships Pro level, kept up to date automatically. That makes it easier to show or hide content in page builders, using the role conditions most of them already provide. A bulk re-sync brings existing members into line.<\/p>\n\n<p>Requires Paid Memberships Pro, available from paidmembershipspro.com (it is not in the WordPress.org plugin directory).<\/p>\n\n<p>It replaces the official PMPro Roles add-on and fixes these issues with it:<\/p>\n\n<ul>\n<li>Roles were not being updated when a user changed membership level<\/li>\n<li>Roles were not being removed on cancellation or expiry<\/li>\n<li>The administrator role was being removed when a membership was cancelled<\/li>\n<\/ul>\n\n<h4>What You Can Do With Roles<\/h4>\n\n<ul>\n<li><strong>Show or hide content<\/strong> in your page builder using role conditions<\/li>\n<li><strong>Cover several levels with one role<\/strong>, so monthly and annual members see the same content<\/li>\n<li><strong>Add new levels without re-editing content<\/strong>: give them an existing role<\/li>\n<li><strong>Use roles in other tools<\/strong>, such as menu visibility and role-based plugin features<\/li>\n<\/ul>\n\n<h4>Key Features<\/h4>\n\n<ul>\n<li><strong>WordPress Role dropdown<\/strong> on each membership level's settings page<\/li>\n<li><strong>Shared role slugs<\/strong> \u2014 multiple levels can map to one role (e.g. Gold Monthly, Gold Quarterly, and Gold Annual all \u2192 <code>gold<\/code>)<\/li>\n<li><strong>Protected roles<\/strong> \u2014 administrator, editor, author, contributor, customer, and subscriber are never removed under any circumstances<\/li>\n<li><strong>Admin-safe<\/strong> \u2014 users with admin roles get membership roles correctly assigned AND removed without losing their admin role<\/li>\n<li><strong>Conflict detection<\/strong> \u2014 warns if the official PMPro Roles add-on is still active<\/li>\n<li><strong>One-click bulk sync<\/strong> \u2014 a single \"Run Sync Now\" button under Memberships \u2192 Role Sync fixes all existing users immediately<\/li>\n<\/ul>\n\n<h4>How It Works<\/h4>\n\n<p>Each PMPro membership level has a \"WordPress Role\" dropdown in its settings. Choose the role you want assigned to members of that level. Multiple levels can share the same role \u2014 ideal for sites that offer the same membership tier at different payment frequencies (monthly, quarterly, annually).<\/p>\n\n<p>Roles are automatically synced when:<\/p>\n\n<ul>\n<li>A user signs up for a membership<\/li>\n<li>A user upgrades or downgrades their level<\/li>\n<li>A membership is cancelled<\/li>\n<li>A membership expires<\/li>\n<\/ul>\n\n<h4>Protected Roles<\/h4>\n\n<p>The following roles are never removed under any circumstances:<\/p>\n\n<ul>\n<li><code>administrator<\/code><\/li>\n<li><code>editor<\/code><\/li>\n<li><code>author<\/code><\/li>\n<li><code>contributor<\/code><\/li>\n<li><code>customer<\/code> (WooCommerce)<\/li>\n<li><code>subscriber<\/code><\/li>\n<\/ul>\n\n<p>Note: protecting a role only stops this plugin from <em>removing<\/em> it \u2014 a non-member is still <em>assigned<\/em> the site's default role (usually <code>subscriber<\/code>) as normal. Protection just means that role, once held, can never be stripped again afterwards.<\/p>\n\n<p>For the same reason, a protected role can't be chosen as a membership level's role: members would keep it after their membership ended. If a level already uses one, the plugin shows a warning naming that level.<\/p>\n\n<p>You can add additional protected roles via filter:<\/p>\n\n<pre><code>add_filter('pmpro_protected_roles', function($roles) {\n    $roles[] = 'shop_manager';\n    return $roles;\n});\n<\/code><\/pre>\n\n<h4>Requirements<\/h4>\n\n<ul>\n<li>WordPress 6.5+<\/li>\n<li>PHP 7.4+<\/li>\n<li>Paid Memberships Pro, from paidmembershipspro.com (not in the WordPress.org plugin directory)<\/li>\n<li>The Multiple Memberships Per User add-on is supported (a member's levels are each evaluated independently)<\/li>\n<li>The official PMPro Roles add-on must be <strong>deactivated<\/strong> to avoid conflicts<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>slnwp-role-extension-pmpro<\/code> folder to <code>\/wp-content\/plugins\/<\/code><\/li>\n<li>Activate the plugin through the Plugins screen in WordPress<\/li>\n<li>Make sure the official PMPro Roles add-on is deactivated<\/li>\n<li>Go to <strong>Memberships \u2192 Membership Levels<\/strong> and edit each level to choose its WordPress Role<\/li>\n<li>Go to <strong>Memberships \u2192 Role Sync<\/strong> and click <strong>Run Sync Now<\/strong> to fix all existing users<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20the%20official%20pmpro%20roles%20add-on%20installed%3F\"><h3>Do I need the official PMPro Roles add-on installed?<\/h3><\/dt>\n<dd><p>No \u2014 this plugin is a complete replacement. The official add-on must be <strong>deactivated<\/strong> to avoid conflicts. This plugin will show a warning in the admin if it detects the official add-on is still active.<\/p><\/dd>\n<dt id=\"can%20multiple%20membership%20levels%20share%20the%20same%20role%3F\"><h3>Can multiple membership levels share the same role?<\/h3><\/dt>\n<dd><p>Yes \u2014 this is a core feature. If you offer Gold Monthly (Level 1), Gold Quarterly (Level 2), and Gold Annual (Level 3), simply choose the <code>gold<\/code> role for all three levels. Members will be assigned the <code>gold<\/code> role regardless of which payment plan they chose.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20a%20membership%20is%20cancelled%3F\"><h3>What happens when a membership is cancelled?<\/h3><\/dt>\n<dd><p>The membership role is removed. If the user has no other active memberships, they are reset to the default WordPress role (usually <code>subscriber<\/code>). Protected roles such as <code>administrator<\/code> are never touched.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20a%20user%20has%20both%20an%20admin%20role%20and%20a%20membership%3F\"><h3>What happens if a user has both an admin role and a membership?<\/h3><\/dt>\n<dd><p>Both roles are handled correctly. The membership role is assigned and removed as normal, while the admin role is always preserved. This was a key bug in the official add-on that this plugin fixes.<\/p><\/dd>\n<dt id=\"how%20do%20i%20fix%20existing%20users%20whose%20roles%20are%20out%20of%20sync%3F\"><h3>How do I fix existing users whose roles are out of sync?<\/h3><\/dt>\n<dd><p>Go to <strong>Memberships \u2192 Role Sync<\/strong> and click <strong>Run Sync Now<\/strong>. This is safe to run at any time.<\/p><\/dd>\n<dt id=\"how%20do%20i%20add%20a%20role%20to%20the%20protected%20list%3F\"><h3>How do I add a role to the protected list?<\/h3><\/dt>\n<dd><p>Add a filter to your theme's <code>functions.php<\/code>:<\/p>\n\n<pre><code>add_filter('pmpro_protected_roles', function($roles) {\n    $roles[] = 'shop_manager';\n    return $roles;\n});\n<\/code><\/pre><\/dd>\n<dt id=\"what%20wordpress%20roles%20are%20protected%20by%20default%3F\"><h3>What WordPress roles are protected by default?<\/h3><\/dt>\n<dd><ul>\n<li><code>administrator<\/code><\/li>\n<li><code>editor<\/code><\/li>\n<li><code>author<\/code><\/li>\n<li><code>contributor<\/code><\/li>\n<li><code>customer<\/code> (WooCommerce)<\/li>\n<li><code>subscriber<\/code><\/li>\n<\/ul><\/dd>\n<dt id=\"is%20subscriber%20protected%2C%20given%20it%27s%20also%20the%20fallback%20role%20for%20non-members%3F\"><h3>Is subscriber protected, given it's also the fallback role for non-members?<\/h3><\/dt>\n<dd><p>Yes. Protection only blocks <em>removal<\/em> \u2014 a member who loses their last active membership is still reset to the site's default role (usually <code>subscriber<\/code>) exactly as before. Protecting it just means that once assigned, it can never be stripped again afterwards, the same as every other protected role.<\/p><\/dd>\n<dt id=\"does%20this%20work%20with%20woocommerce%3F\"><h3>Does this work with WooCommerce?<\/h3><\/dt>\n<dd><p>Yes \u2014 the <code>customer<\/code> role is in the protected list by default so WooCommerce customers are never affected by membership role changes.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.1.11<\/h4>\n\n<ul>\n<li>Change: Clearer description of what the plugin is for and what you can do with roles<\/li>\n<\/ul>\n\n<h4>2.1.10<\/h4>\n\n<ul>\n<li>First release on WordPress.org<\/li>\n<\/ul>","raw_excerpt":"An easier way to show or hide PMPro member content: each level provides a WordPress role, ready for your builder's role conditions. Roles stay synced.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/393883","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=393883"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/jainanda"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=393883"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=393883"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=393883"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=393883"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=393883"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=393883"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}