{"id":694,"date":"2010-03-22T20:03:30","date_gmt":"2010-03-22T20:03:30","guid":{"rendered":"https:\/\/wordpress.org\/plugins-wp\/s2member\/"},"modified":"2026-08-29T03:00:21","modified_gmt":"2026-08-29T03:00:21","slug":"s2member","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/s2member\/","author":16710466,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"260829","stable_tag":"260829","tested":"7.2","requires":"4.2","requires_php":"5.6.2","requires_plugins":null,"header_name":"s2Member Framework","header_author":"WP Sharks","header_description":"","assets_banners_color":"57748c","last_updated":"2026-08-29 03:00:21","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/s2member.com\/donate\/","header_plugin_uri":"http:\/\/s2member.com\/","header_author_uri":"http:\/\/s2member.com\/","rating":4.1,"author_block_rating":0,"active_installs":8000,"downloads":1660610,"num_ratings":234,"support_threads":1,"support_threads_resolved":1,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"110604":{"tag":"110604","author":"PriMoThemes","date":"2011-06-05 05:47:17","revision":393322},"110605":{"tag":"110605","author":"PriMoThemes","date":"2011-06-05 07:27:49","revision":393331},"110606":{"tag":"110606","author":"PriMoThemes","date":"2011-06-07 01:26:56","revision":394049},"110617":{"tag":"110617","author":"PriMoThemes","date":"2011-06-17 06:48:24","revision":398270},"110620":{"tag":"110620","author":"PriMoThemes","date":"2011-06-20 07:53:48","revision":399115},"110708":{"tag":"110708","author":"PriMoThemes","date":"2011-07-08 20:07:17","revision":406934},"110709":{"tag":"110709","author":"PriMoThemes","date":"2011-07-09 04:41:47","revision":407246},"110710":{"tag":"110710","author":"PriMoThemes","date":"2011-07-10 00:26:40","revision":407663},"110731":{"tag":"110731","author":"PriMoThemes","date":"2011-08-01 03:41:00","revision":417782},"110812":{"tag":"110812","author":"PriMoThemes","date":"2011-08-12 05:07:43","revision":422502},"110815":{"tag":"110815","author":"PriMoThemes","date":"2011-08-15 17:39:40","revision":423888},"110912":{"tag":"110912","author":"PriMoThemes","date":"2011-09-13 04:57:05","revision":437159},"110913":{"tag":"110913","author":"PriMoThemes","date":"2011-09-14 05:54:09","revision":437853},"110915":{"tag":"110915","author":"PriMoThemes","date":"2011-09-15 19:13:20","revision":438685},"110926":{"tag":"110926","author":"PriMoThemes","date":"2011-09-27 01:36:16","revision":443967},"110927":{"tag":"110927","author":"PriMoThemes","date":"2011-09-27 10:04:00","revision":444134},"111002":{"tag":"111002","author":"PriMoThemes","date":"2011-10-03 08:06:56","revision":446600},"111003":{"tag":"111003","author":"PriMoThemes","date":"2011-10-03 20:12:39","revision":446896},"111011":{"tag":"111011","author":"PriMoThemes","date":"2011-10-11 19:06:43","revision":449995},"111017":{"tag":"111017","author":"PriMoThemes","date":"2011-10-17 20:48:15","revision":452196},"111029":{"tag":"111029","author":"PriMoThemes","date":"2011-10-29 23:59:46","revision":457253},"111105":{"tag":"111105","author":"PriMoThemes","date":"2011-11-06 00:11:21","revision":459787},"111206":{"tag":"111206","author":"PriMoThemes","date":"2011-12-06 12:37:48","revision":471558},"111216":{"tag":"111216","author":"PriMoThemes","date":"2011-12-19 15:37:13","revision":477524},"111220":{"tag":"111220","author":"PriMoThemes","date":"2011-12-20 14:36:08","revision":478006},"120213":{"tag":"120213","author":"PriMoThemes","date":"2012-02-16 09:36:45","revision":505812},"120219":{"tag":"120219","author":"PriMoThemes","date":"2012-02-19 18:39:24","revision":507389},"120301":{"tag":"120301","author":"PriMoThemes","date":"2012-03-01 09:16:31","revision":512813},"120304":{"tag":"120304","author":"PriMoThemes","date":"2012-03-05 03:48:37","revision":514453},"120308":{"tag":"120308","author":"PriMoThemes","date":"2012-03-08 20:19:20","revision":516439},"120309":{"tag":"120309","author":"PriMoThemes","date":"2012-03-09 18:53:05","revision":516930},"120514":{"tag":"120514","author":"PriMoThemes","date":"2012-05-15 10:53:15","revision":544427},"120517":{"tag":"120517","author":"PriMoThemes","date":"2012-05-17 23:38:26","revision":545576},"120601":{"tag":"120601","author":"PriMoThemes","date":"2012-06-01 15:33:39","revision":551879},"120608":{"tag":"120608","author":"PriMoThemes","date":"2012-06-08 21:28:25","revision":555041},"120622":{"tag":"120622","author":"PriMoThemes","date":"2012-06-22 18:37:35","revision":562594},"120703":{"tag":"120703","author":"PriMoThemes","date":"2012-07-03 21:13:28","revision":567088},"121023":{"tag":"121023","author":"PriMoThemes","date":"2012-10-24 03:17:38","revision":616664},"121201":{"tag":"121201","author":"PriMoThemes","date":"2012-12-02 08:19:39","revision":632935},"121204":{"tag":"121204","author":"PriMoThemes","date":"2012-12-05 08:37:42","revision":634321},"121213":{"tag":"121213","author":"PriMoThemes","date":"2012-12-14 07:55:47","revision":639032},"130116":{"tag":"130116","author":"PriMoThemes","date":"2013-01-17 01:19:20","revision":653976},"130121":{"tag":"130121","author":"PriMoThemes","date":"2013-01-21 10:03:20","revision":656184},"130123":{"tag":"130123","author":"PriMoThemes","date":"2013-01-24 01:32:32","revision":657712},"130203":{"tag":"130203","author":"WebSharks","date":"2013-02-04 09:46:28","revision":663085},"130207":{"tag":"130207","author":"WebSharks","date":"2013-02-07 18:03:23","revision":664859},"130213":{"tag":"130213","author":"WebSharks","date":"2013-02-13 14:24:32","revision":667414},"130214":{"tag":"130214","author":"WebSharks","date":"2013-02-14 14:13:29","revision":667957},"130220":{"tag":"130220","author":"WebSharks","date":"2013-02-20 13:19:38","revision":670760},"130221":{"tag":"130221","author":"WebSharks","date":"2013-02-21 14:25:17","revision":671213},"130404":{"tag":"130404","author":"WebSharks","date":"2013-04-05 00:05:24","revision":691874},"130406":{"tag":"130406","author":"WebSharks","date":"2013-04-07 00:58:55","revision":692947},"130510":{"tag":"130510","author":"WebSharks","date":"2013-05-11 08:02:14","revision":711278},"130513":{"tag":"130513","author":"WebSharks","date":"2013-05-13 20:53:31","revision":712579},"130617":{"tag":"130617","author":"WebSharks","date":"2013-06-17 23:52:37","revision":727713},"130731":{"tag":"130731","author":"WebSharks","date":"2013-08-01 03:04:29","revision":749046},"130801":{"tag":"130801","author":"WebSharks","date":"2013-08-01 22:36:34","revision":749524},"130802":{"tag":"130802","author":"WebSharks","date":"2013-08-02 10:00:05","revision":749882},"130816":{"tag":"130816","author":"WebSharks","date":"2013-08-16 07:15:36","revision":757020},"131025":{"tag":"131025","author":"WebSharks","date":"2013-10-25 17:40:23","revision":793728},"131026":{"tag":"131026","author":"WebSharks","date":"2013-10-26 00:06:48","revision":793873},"131109":{"tag":"131109","author":"WebSharks","date":"2013-11-09 09:35:37","revision":801469},"131126":{"tag":"131126","author":"WebSharks","date":"2013-11-26 12:13:05","revision":810758},"140105":{"tag":"140105","author":"WebSharks","date":"2014-01-09 00:06:58","revision":835201},"140328":{"tag":"140328","author":"JasWSInc","date":"2014-03-29 10:45:42","revision":884082},"140409":{"tag":"140409","author":"JasWSInc","date":"2014-04-10 04:25:12","revision":890402},"140423":{"tag":"140423","author":"JasWSInc","date":"2014-04-24 04:04:06","revision":901431},"140520":{"tag":"140520","author":"JasWSInc","date":"2014-05-21 06:28:13","revision":918450},"140603":{"tag":"140603","author":"JasWSInc","date":"2014-06-04 18:01:27","revision":926617},"140614":{"tag":"140614","author":"JasWSInc","date":"2014-06-14 16:51:03","revision":932387},"140725":{"tag":"140725","author":"JasWSInc","date":"2014-07-26 16:06:20","revision":955318},"140816":{"tag":"140816","author":"JasWSInc","date":"2014-08-16 06:06:27","revision":966787},"140909":{"tag":"140909","author":"JasWSInc","date":"2014-09-09 22:00:39","revision":985766},"140921":{"tag":"140921","author":"JasWSInc","date":"2014-09-21 10:37:26","revision":994151},"141007":{"tag":"141007","author":"JasWSInc","date":"2014-10-08 06:14:09","revision":1003616},"150102":{"tag":"150102","author":"JasWSInc","date":"2015-01-02 08:12:44","revision":1058248},"150203":{"tag":"150203","author":"JasWSInc","date":"2015-02-03 23:36:36","revision":1081909},"150225":{"tag":"150225","author":"JasWSInc","date":"2015-02-26 21:18:58","revision":1100711},"150311":{"tag":"150311","author":"JasWSInc","date":"2015-03-11 21:03:26","revision":1110610},"150722":{"tag":"150722","author":"JasWSInc","date":"2015-07-23 00:08:40","revision":1204409},"150827":{"tag":"150827","author":"JasWSInc","date":"2015-08-27 12:28:45","revision":1232042},"150925":{"tag":"150925","author":"JasWSInc","date":"2015-09-26 00:21:00","revision":1253781},"151210":{"tag":"151210","author":"JasWSInc","date":"2015-12-10 12:10:40","revision":1305246},"151218":{"tag":"151218","author":"JasWSInc","date":"2015-12-18 17:05:56","revision":1311799},"160120":{"tag":"160120","author":"JasWSInc","date":"2016-01-20 07:25:09","revision":1331904},"160303":{"tag":"160303","author":"JasWSInc","date":"2016-03-04 00:15:19","revision":1363723},"160423":{"tag":"160423","author":"JasWSInc","date":"2016-04-23 17:41:23","revision":1403006},"160424":{"tag":"160424","author":"JasWSInc","date":"2016-04-24 09:12:09","revision":1403211},"160503":{"tag":"160503","author":"JasWSInc","date":"2016-05-04 01:12:15","revision":1409975},"160801":{"tag":"160801","author":"JasWSInc","date":"2016-08-01 21:42:25","revision":1465539},"161129":{"tag":"161129","author":"raamdev","date":"2016-12-08 23:06:01","revision":1549951},"170221":{"tag":"170221","author":"raamdev","date":"2017-02-21 03:54:54","revision":1600236},"170524":{"tag":"170524","author":"raamdev","date":"2017-06-09 21:15:21","revision":1675107},"170722":{"tag":"170722","author":"clavaque","date":"2019-05-20 02:51:04","revision":2091054},"190617":{"tag":"190617","author":"clavaque","date":"2019-06-17 02:51:59","revision":2107148},"190822":{"tag":"190822","author":"clavaque","date":"2019-08-22 22:04:29","revision":2144095},"191022":{"tag":"191022","author":"clavaque","date":"2019-10-22 22:01:29","revision":2177830},"2.8.4":{"tag":"2.8.4","author":"PriMoThemes","date":"2010-04-17 04:24:06","revision":230154},"2.8.5":{"tag":"2.8.5","author":"PriMoThemes","date":"2010-04-19 06:26:57","revision":230640},"2.8.6":{"tag":"2.8.6","author":"PriMoThemes","date":"2010-04-29 14:33:36","revision":235371},"2.8.8":{"tag":"2.8.8","author":"PriMoThemes","date":"2010-05-01 12:22:53","revision":236173},"2.8.9":{"tag":"2.8.9","author":"PriMoThemes","date":"2010-05-01 15:30:40","revision":236224},"2.9":{"tag":"2.9","author":"PriMoThemes","date":"2010-05-05 14:49:57","revision":237720},"2.9.2":{"tag":"2.9.2","author":"PriMoThemes","date":"2010-05-06 23:00:10","revision":238136},"2.9.3":{"tag":"2.9.3","author":"PriMoThemes","date":"2010-05-08 05:31:13","revision":238576},"2.9.4":{"tag":"2.9.4","author":"PriMoThemes","date":"2010-05-13 04:04:12","revision":240453},"200221":{"tag":"200221","author":"clavaque","date":"2020-02-21 21:36:24","revision":2248478},"200301":{"tag":"200301","author":"clavaque","date":"2020-03-01 22:22:22","revision":2252690},"201225":{"tag":"201225","author":"clavaque","date":"2020-12-25 23:10:05","revision":2446033},"210208":{"tag":"210208","author":"clavaque","date":"2021-02-08 21:58:01","revision":2471137},"210526":{"tag":"210526","author":"clavaque","date":"2022-03-09 01:51:00","revision":2691144},"220318":{"tag":"220318","author":"clavaque","date":"2022-03-18 14:31:07","revision":2696006},"220421":{"tag":"220421","author":"clavaque","date":"2022-04-21 19:13:49","revision":2712974},"220809":{"tag":"220809","author":"clavaque","date":"2022-08-09 20:31:59","revision":2768569},"220925":{"tag":"220925","author":"clavaque","date":"2022-09-29 21:32:24","revision":2792155},"221028":{"tag":"221028","author":"clavaque","date":"2022-10-27 23:52:11","revision":2806180},"221031":{"tag":"221031","author":"clavaque","date":"2022-10-31 01:43:26","revision":2807576},"221103":{"tag":"221103","author":"clavaque","date":"2022-11-03 00:30:59","revision":2810517},"230413":{"tag":"230413","author":"clavaque","date":"2023-04-13 23:37:01","revision":2898935},"230425":{"tag":"230425","author":"clavaque","date":"2023-04-25 00:32:12","revision":2903557},"230504":{"tag":"230504","author":"clavaque","date":"2023-05-04 02:40:23","revision":2907763},"230530":{"tag":"230530","author":"clavaque","date":"2023-05-30 04:38:36","revision":2918787},"230808":{"tag":"230808","author":"clavaque","date":"2023-08-08 01:11:31","revision":2948993},"230815":{"tag":"230815","author":"clavaque","date":"2023-08-15 11:49:25","revision":2953777},"240218":{"tag":"240218","author":"clavaque","date":"2024-02-18 01:30:54","revision":3037349},"240315":{"tag":"240315","author":"clavaque","date":"2024-03-15 02:42:09","revision":3051412},"240325":{"tag":"240325","author":"clavaque","date":"2024-06-30 23:48:50","revision":3110123},"241114":{"tag":"241114","author":"clavaque","date":"2024-11-14 00:10:24","revision":3188160},"241216":{"tag":"241216","author":"clavaque","date":"2024-12-16 04:02:30","revision":3208316},"250214":{"tag":"250214","author":"clavaque","date":"2025-02-14 19:47:51","revision":3240796},"250419":{"tag":"250419","author":"clavaque","date":"2025-04-19 12:04:28","revision":3277196},"250424":{"tag":"250424","author":"clavaque","date":"2025-04-24 00:48:19","revision":3280369},"250502":{"tag":"250502","author":"clavaque","date":"2025-05-02 01:05:16","revision":3285923},"250511":{"tag":"250511","author":"clavaque","date":"2025-05-11 15:49:36","revision":3291364},"250525":{"tag":"250525","author":"clavaque","date":"2025-05-25 22:10:58","revision":3300328},"250607":{"tag":"250607","author":"clavaque","date":"2025-06-07 22:09:16","revision":3307986},"250701":{"tag":"250701","author":"clavaque","date":"2025-07-01 19:34:45","revision":3320810},"250905":{"tag":"250905","author":"clavaque","date":"2025-09-05 00:48:03","revision":3356374},"251005":{"tag":"251005","author":"clavaque","date":"2025-10-05 19:18:19","revision":3373246},"260101":{"tag":"260101","author":"clavaque","date":"2026-01-02 01:37:42","revision":3430800},"260127":{"tag":"260127","author":"clavaque","date":"2026-01-28 03:58:08","revision":3448334},"260215":{"tag":"260215","author":"clavaque","date":"2026-02-15 04:13:16","revision":3461635},"260301":{"tag":"260301","author":"clavaque","date":"2026-03-01 04:14:20","revision":3471873},"260312":{"tag":"260312","author":"clavaque","date":"2026-03-12 04:00:21","revision":3480789},"260325":{"tag":"260325","author":"clavaque","date":"2026-03-25 23:17:37","revision":3491314},"260410":{"tag":"260410","author":"clavaque","date":"2026-04-10 03:58:37","revision":3502970},"260508":{"tag":"260508","author":"clavaque","date":"2026-05-08 01:05:21","revision":3526075},"260805":{"tag":"260805","author":"clavaque","date":"2026-08-05 21:49:12","revision":3635870},"260814":{"tag":"260814","author":"clavaque","date":"2026-08-14 01:03:57","revision":3646473},"260829":{"tag":"260829","author":"clavaque","date":"2026-08-29 03:00:21","revision":3671075},"3.0":{"tag":"3.0","author":"PriMoThemes","date":"2010-05-18 11:53:18","revision":242686},"3.0.1":{"tag":"3.0.1","author":"PriMoThemes","date":"2010-05-23 13:06:06","revision":244745},"3.0.2":{"tag":"3.0.2","author":"PriMoThemes","date":"2010-05-25 18:47:36","revision":245520},"3.0.4":{"tag":"3.0.4","author":"PriMoThemes","date":"2010-06-01 07:33:21","revision":247717},"3.0.5":{"tag":"3.0.5","author":"PriMoThemes","date":"2010-06-18 20:11:08","revision":254432},"3.0.6":{"tag":"3.0.6","author":"PriMoThemes","date":"2010-06-19 19:27:06","revision":254829},"3.0.8":{"tag":"3.0.8","author":"PriMoThemes","date":"2010-06-21 00:51:56","revision":255329},"3.0.9":{"tag":"3.0.9","author":"PriMoThemes","date":"2010-06-21 08:41:40","revision":255412},"3.1":{"tag":"3.1","author":"PriMoThemes","date":"2010-06-25 19:41:57","revision":257320},"3.1.1":{"tag":"3.1.1","author":"PriMoThemes","date":"2010-06-27 06:30:01","revision":257707},"3.1.2":{"tag":"3.1.2","author":"PriMoThemes","date":"2010-06-27 08:49:04","revision":257750},"3.1.3":{"tag":"3.1.3","author":"PriMoThemes","date":"2010-07-21 13:32:15","revision":265193},"3.1.4":{"tag":"3.1.4","author":"PriMoThemes","date":"2010-07-22 06:48:00","revision":265733},"3.1.5":{"tag":"3.1.5","author":"PriMoThemes","date":"2010-07-23 02:37:24","revision":266156},"3.2":{"tag":"3.2","author":"PriMoThemes","date":"2010-08-17 08:16:19","revision":277149},"3.2.1":{"tag":"3.2.1","author":"PriMoThemes","date":"2010-08-21 07:13:35","revision":278949},"3.2.2":{"tag":"3.2.2","author":"PriMoThemes","date":"2010-08-23 12:24:16","revision":279623},"3.2.3":{"tag":"3.2.3","author":"PriMoThemes","date":"2010-08-30 01:06:50","revision":282412},"3.2.4":{"tag":"3.2.4","author":"PriMoThemes","date":"2010-08-31 22:36:56","revision":283412},"3.2.5":{"tag":"3.2.5","author":"PriMoThemes","date":"2010-09-07 18:14:14","revision":286405},"3.2.7":{"tag":"3.2.7","author":"PriMoThemes","date":"2010-09-25 00:22:28","revision":293343},"3.2.8":{"tag":"3.2.8","author":"PriMoThemes","date":"2010-10-17 21:10:56","revision":300975},"3.2.9":{"tag":"3.2.9","author":"PriMoThemes","date":"2010-10-27 04:36:03","revision":304808},"3.3":{"tag":"3.3","author":"PriMoThemes","date":"2010-12-01 06:13:48","revision":317300},"3.3.1":{"tag":"3.3.1","author":"PriMoThemes","date":"2010-12-01 07:37:21","revision":317332},"3.3.2":{"tag":"3.3.2","author":"PriMoThemes","date":"2010-12-15 09:58:34","revision":323098},"3.5":{"tag":"3.5","author":"PriMoThemes","date":"2011-02-26 15:24:16","revision":351838},"3.5.1":{"tag":"3.5.1","author":"PriMoThemes","date":"2011-02-27 01:36:13","revision":352170},"3.5.2":{"tag":"3.5.2","author":"PriMoThemes","date":"2011-03-03 13:12:37","revision":354608},"3.5.3":{"tag":"3.5.3","author":"PriMoThemes","date":"2011-03-14 23:25:09","revision":360128},"3.5.4":{"tag":"3.5.4","author":"PriMoThemes","date":"2011-03-14 23:46:46","revision":360144},"3.5.5":{"tag":"3.5.5","author":"PriMoThemes","date":"2011-03-18 22:46:32","revision":361908},"3.5.6":{"tag":"3.5.6","author":"PriMoThemes","date":"2011-03-23 09:55:35","revision":363638},"3.5.7":{"tag":"3.5.7","author":"PriMoThemes","date":"2011-03-26 03:36:32","revision":364885},"3.5.8":{"tag":"3.5.8","author":"PriMoThemes","date":"2011-04-11 04:35:18","revision":371423}},"upgrade_notice":{"v260829":"<p>(SECURITY RELEASE) UPGRADE IMMEDIATELY. v260215 included a CRITICAL VULNERABILITY fix, and you shouldn&#039;t wait any longer to update if you&#039;re behind.<\/p>"},"ratings":{"1":42,"2":7,"3":8,"4":13,"5":164},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":992354,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":980067,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-772x250.png":{"filename":"banner-772x250.png","revision":1100536,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":null,"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":801413,"resolution":"1","location":"assets","locale":"","width":1582,"height":734},"screenshot-2.png":{"filename":"screenshot-2.png","revision":801416,"resolution":"2","location":"assets","locale":"","width":1578,"height":680},"screenshot-3.png":{"filename":"screenshot-3.png","revision":801417,"resolution":"3","location":"assets","locale":"","width":1578,"height":702},"screenshot-4.png":{"filename":"screenshot-4.png","revision":801418,"resolution":"4","location":"assets","locale":"","width":1580,"height":655},"screenshot-5.png":{"filename":"screenshot-5.png","revision":801419,"resolution":"5","location":"assets","locale":"","width":1584,"height":696},"screenshot-6.png":{"filename":"screenshot-6.png","revision":801420,"resolution":"6","location":"assets","locale":"","width":1578,"height":723},"screenshot-7.png":{"filename":"screenshot-7.png","revision":801421,"resolution":"7","location":"assets","locale":"","width":1575,"height":735}},"screenshots":{"1":"s2Member Screenshot #1","2":"s2Member Screenshot #2","3":"s2Member Screenshot #3","4":"s2Member Screenshot #4","5":"s2Member Screenshot #5","6":"s2Member Screenshot #6","7":"s2Member Screenshot #7"}},"plugin_section":[],"plugin_tags":[16114,19898,1932,48391,213376],"plugin_category":[38,41,58],"plugin_contributors":[170805,196037,78282,78283,78281],"plugin_business_model":[],"class_list":["post-694","plugin","type-plugin","status-publish","hentry","plugin_tags-content-restriction","plugin_tags-members-only","plugin_tags-membership","plugin_tags-paid-access","plugin_tags-paid-subscriptions","plugin_category-authentication","plugin_category-communication","plugin_category-user-management","plugin_contributors-clavaque","plugin_contributors-eduan","plugin_contributors-jaswsinc","plugin_contributors-raamdev","plugin_contributors-websharks","plugin_committers-clavaque","plugin_committers-jaswsinc"],"banners":{"banner":"https:\/\/ps.w.org\/s2member\/assets\/banner-772x250.png?rev=1100536","banner_2x":false,"banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/s2member\/assets\/icon-128x128.png?rev=992354","icon_2x":"https:\/\/ps.w.org\/s2member\/assets\/icon-256x256.png?rev=980067","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/s2member\/assets\/screenshot-1.png?rev=801413","caption":"s2Member Screenshot #1"},{"src":"https:\/\/ps.w.org\/s2member\/assets\/screenshot-2.png?rev=801416","caption":"s2Member Screenshot #2"},{"src":"https:\/\/ps.w.org\/s2member\/assets\/screenshot-3.png?rev=801417","caption":"s2Member Screenshot #3"},{"src":"https:\/\/ps.w.org\/s2member\/assets\/screenshot-4.png?rev=801418","caption":"s2Member Screenshot #4"},{"src":"https:\/\/ps.w.org\/s2member\/assets\/screenshot-5.png?rev=801419","caption":"s2Member Screenshot #5"},{"src":"https:\/\/ps.w.org\/s2member\/assets\/screenshot-6.png?rev=801420","caption":"s2Member Screenshot #6"},{"src":"https:\/\/ps.w.org\/s2member\/assets\/screenshot-7.png?rev=801421","caption":"s2Member Screenshot #7"}],"raw_content":"<!--section=description-->\n<p>\u2764\ufe0f <strong>Excellent membership plugin!<\/strong> Over 15 years of experience, development, releases... Still going and growing!<\/p>\n\n<p><strong>Start your membership profits!<\/strong> Build your tribe, gather your followers, enroll your students, bring in your clients!<\/p>\n\n<p>\ud83d\udcb5 Enjoy the benefits of getting paid repeatedly for access to your site!<\/p>\n\n<p>\u2b50\u2b50\u2b50\u2b50\u2b50 <em><strong>Brilliant<\/strong> \"So glad I found this. It works brilliantly for our needs... love the seamless integration with PayPal. Everything we need. Thank you so much for creating this!\" -<a href=\"https:\/\/wordpress.org\/support\/topic\/brilliant-1268\/\">zarverk2000<\/a><\/em><\/p>\n\n<h4>The best way to make money from your WordPress site!<\/h4>\n\n<p>\ud83e\udd29 Sell <strong>unlimited memberships<\/strong>, turn free subscribers into members (<em>subscriber to member \u2192 s. 2 member \u2192 s2Member<\/em>), with a single payment or recurring payments subscriptions.<\/p>\n\n<p><strong>Easy and quick to use.<\/strong> Protect your membership content in a moment, and a moment later be ready to get payments for member access!<\/p>\n\n<p><strong>Easy to configure and very flexible.<\/strong> Protect the whole site, nothing, or just parts, even member files for paid downloads!<\/p>\n\n<p>\ud83d\udc49 Install s2Member now and <strong>make money!<\/strong> \ud83d\ude00<\/p>\n\n<p>https:\/\/youtu.be\/qlKn-I-0W6U<\/p>\n\n<p>\u2b50\u2b50\u2b50\u2b50\u2b50 <em><strong>So much capacity &amp; great support<\/strong> \"I\u2019m a novice and was able to quickly figure it out. When I got stuck I go to the support forum and Cristian is there with a quick answer to get me going again.\" -<a href=\"https:\/\/wordpress.org\/support\/topic\/so-much-capacity-great-support\/\">blueruck<\/a><\/em><\/p>\n\n<p>\u2b50\u2b50\u2b50\u2b50\u2b50 <em><strong>The very best plugin and support service<\/strong> \"Great plugin, neat, easy to configure, and with interesting security features.  A special mention to Cristian whose support is awesome, fast, clear even to free members like myself\" -<a href=\"https:\/\/wordpress.org\/support\/topic\/the-very-best-plugin-and-support-service\/\">aflorarte<\/a><\/em><\/p>\n\n<p><strong>Packed with features<\/strong>, but not required to use them all, just those you want. Some of them:<\/p>\n\n<p>\u27a1\ufe0f Member user levels and custom access capabilities\n\u27a1\ufe0f Membership content protection (post, page, category, tag, etc)\n\u27a1\ufe0f Protect anything served by WP (post types, URLs)\n\u27a1\ufe0f Member file protection (sell downloads)\n\u27a1\ufe0f Prevent member account sharing (limit IPs, simultaneous logins)\n\u27a1\ufe0f Protect accounts (limit failed login attempts)\n\u27a1\ufe0f Cool security\/trust badge with your domain\n\u27a1\ufe0f PayPal Standard buttons for membership payments (more in Pro)\n\u27a1\ufe0f Automatic member access demotion at end of paid access time\n\u27a1\ufe0f Tracking software integration (affiliates, etc)\n\u27a1\ufe0f Email list services (Mailchimp, etc)\n\u27a1\ufe0f Notifications (signups, payments, etc)\n\u27a1\ufe0f Integrate with bbPress, BuddyPress for member communities\n\u27a1\ufe0f Compatible with any well coded theme (Elementor, Divi, etc)\n\u27a1\ufe0f Customize the WP login\/registration look\n\u27a1\ufe0f Custom redirection after member login\n\u27a1\ufe0f Create custom profile fields for member accounts\n\u27a1\ufe0f Customize the user welcome email\n\u27a1\ufe0f And more!<\/p>\n\n<p>\ud83d\udc49 Install and start using s2Member now! \ud83e\udd29<\/p>\n\n<p>\u2b50\u2b50\u2b50\u2b50\u2b50 <em><strong>Very Powerful Membership Plugin<\/strong> \"This membership plugin does a lot and has many, many configuration options to achieve whatever you want... I received extremely quick and reliable support.\" -<a href=\"https:\/\/wordpress.org\/support\/topic\/very-powerful-membership-plugin\/\">liltrucks<\/a><\/em><\/p>\n\n<p>\u2b50\u2b50\u2b50\u2b50\u2b50 <em><strong>Simple, Compatible, Secure, and Versatile!<\/strong> \"We are seriously impressed with this plugin and we highly recommend it... We have not found ANY limitations to what we are trying to accomplish... a very smooth process... straight-forward and user-friendly!... exceeded our expectations!\" -<a href=\"https:\/\/wordpress.org\/support\/topic\/simple-compatible-secure-and-versatile\/\">tips4gamers<\/a><\/em><\/p>\n\n<p>\u2b50\u2b50\u2b50\u2b50\u2b50 <em><strong>Excellent plugin<\/strong> \"This plugin does everything it says on the box. It does it well... the functionality is absolutely spot on. The developers\/maintainers are also active and helpful. Totally recommended!\" -<a href=\"https:\/\/wordpress.org\/support\/topic\/excellent-plugin-5188\/\">richardfoley<\/a><\/em><\/p>\n\n<p>\u2b50\u2b50\u2b50\u2b50\u2b50 <em><strong>Best Membership Plugin I\u2019ve Used<\/strong> \"I switched to s2 Member around 3 years ago after trying a few plugins. I found these other plugins inflexible and difficult to configure... Well worth investigating if you want a robust membership solution.\" -<a href=\"https:\/\/wordpress.org\/support\/topic\/best-membership-plugin-ive-used\/\">rnwhalley<\/a><\/em><\/p>\n\n<p>\ud83e\udd16 Not needed to know any PHP code or be a developer. Only code needed is copy-paste wp shortcodes, like for the paypal buttons... But is also developer-friendly to customize your installation if wanted.<\/p>\n\n<h4>Some reasons to get s2Member Pro<\/h4>\n\n<p>\u2705 Membership content dripping\n\u2705 Stripe, PayPal Pro, Authorize.Net, ClickBank\n\u2705 On-site one-step checkout with pro-forms (Stripe, PayPal, Auth.Net)\n\u2705 Unlimited membership levels\n\u2705 Membership renewal reminder emails\n\u2705 Single-step member registration and payment with pro-forms\n\u2705 Custom redirection after payment\n\u2705 Coupon codes and gift\/redemption codes\n\u2705 Custom member offer redirections after login\n\u2705 Pro API for new integrations\n\u2705 Public members directory\n\u2705 Members bulk import\/update\/exporter\n\u2705 Multisite network support\n\u2705 Login and registration forms to use in pages\/posts\n\ud83d\udc49 <a href=\"https:\/\/s2member.com\/features\/\">Click here for more<\/a> \ud83d\ude42<\/p>\n\n<p>\u2b50\u2b50\u2b50\u2b50\u2b50 <em><strong>The Best Membership Plugin<\/strong> \"I have built with most Membership plugins and literally dozens using S2 Pro and I can tell you, bar none it is the best of all of them. Extremely powerful, anything you might want to do it can do... I highly recommend you try it out.\" -<a href=\"https:\/\/wordpress.org\/support\/topic\/the-best-membership-plugin-5\/\">antwoords<\/a><\/em><\/p>\n\n<p>\u2b50\u2b50\u2b50\u2b50\u2b50 <em><strong>Excellent plugin &amp; top support<\/strong> \"We\u2019ve used s2member pro on a few projects now &amp; find it has met all our membership needs. Most impressive has been the support. Excellent communication, knowledgeable, friendly and super patient \ud83d\ude42\" -<a href=\"https:\/\/wordpress.org\/support\/topic\/excellent-plugin-top-support-3\/\">aaee6<\/a><\/em><\/p>\n\n<p>\u2b50\u2b50\u2b50\u2b50\u2b50 <em><strong>Awesome Support<\/strong> \"I\u2019ve been using s2Member for 9 years... Amazing support of a high-end plugin and much appreciated. This is one of the reasons I stick with s2Member. Support has always been great!\" -<a href=\"https:\/\/wordpress.org\/support\/topic\/awesome-support-712\/\">graphichome<\/a><\/em><\/p>\n\n<p>\u2b50\u2b50\u2b50\u2b50\u2b50 <em><strong>Wonderful Support<\/strong> \"Above and beyond. I\u2019ve used this plugin for over ten years with various clients and whenever I need help, they\u2019ve helped find a solution.\" -<a href=\"https:\/\/wordpress.org\/support\/topic\/wonderful-support-68\/\">germars<\/a><\/em><\/p>\n\n<p>The free s2Member Framework integrates with PayPal Website Payments Standard (also free). Sell \"Buy Now\" or Membership access to your site. Restrict access to Roles, Capabilities, Posts, Pages, or anything else in WordPress.<\/p>\n\n<p>Protect your WordPress Posts, Pages, Tags, Categories, URIs, BuddyPress, bbPress, and even portions of content within Posts, Pages, themes, plugins. <strong>Easily configurable and highly extensible.<\/strong> You can even protect downloadable files and streaming audio\/video. Store files locally, or use s2Member's integration with Amazon S3\/CloudFront.<\/p>\n\n<p>s2Member is powered almost entirely by WordPress shortcodes, making advanced integrations quick and easy. Sell recurring (or non-recurring) subscriptions with lots of flexibility. Or sell \"Buy Now\" membership access in various ways. You can also sell specific Posts\/Pages, sell member access to file downloads, or sell members Custom Capabilities that provide highly configurable access to specific portions of your content.<\/p>\n\n<p>\ud83d\udc49 Install now s2Member and <strong>start making money!<\/strong> \ud83d\ude00<\/p>\n\n<!--section=installation-->\n<p><strong>NOTICE:<\/strong> For help with s2Member Pro, please use <a href=\"http:\/\/s2member.com\/r\/forum\/\">our forum<\/a>.<\/p>\n\n<h4>s2Member is very easy to install<\/h4>\n\n<p>Just like any other normal plugin:<\/p>\n\n<ul>\n<li>From the WP Admin's <a href=\"https:\/\/wordpress.org\/support\/article\/plugins-add-new-screen\/\">Plugins Add New Screen<\/a>. <\/li>\n<li>Or via FTP upload the <code>s2member<\/code> folder from the zip to your <code>\/wp-content\/plugins\/<\/code> directory.<\/li>\n<li>Activate it from <strong>Plugins<\/strong> page in your WordPress Admin.<\/li>\n<\/ul>\n\n<p>Here's a <a href=\"https:\/\/www.youtube.com\/watch?v=qlKn-I-0W6U\">quick-start video<\/a> for a simple basic setup to get you started.<\/p>\n\n<h4>See also<\/h4>\n\n<p><a href=\"http:\/\/s2member.com\/installation\/\">Detailed installation\/upgrade instructions<\/a>.<\/p>\n\n<h4>Is s2Member compatible with Multisite Networking?<\/h4>\n\n<p>Yes, requires s2Member Pro for Unlimited Sites. After you enable Multisite Networking, with s2Member Framework and Pro active, navigate to <code>s2Member \u2192 Multisite (Config)<\/code> in the Dashboard on your Main Site.<\/p>\n\n<!--section=faq-->\n<p><strong>NOTICE:<\/strong> For help with s2Member Pro, please use <a href=\"http:\/\/s2member.com\/r\/forum\/\">our forum<\/a>.<\/p>\n<dl>\n<dt id=\"is%20s2member%20compatible%20with%20multisite%20networking%3F\"><h3>Is s2Member compatible with Multisite Networking?<\/h3><\/dt>\n<dd><p>Yes, s2Member Pro for Unlimited Sites is compatible with Multisite Networking. After you enable Multisite Networking, with s2Member Framework and Pro enabled, navigate to <code>s2Member \u2192 Multisite (Config)<\/code> in the Dashboard on your Main Site.<\/p><\/dd>\n<dt id=\"where%20can%20i%20find%20more%20information%3F\"><h3>Where can I find more information?<\/h3><\/dt>\n<dd><ul>\n<li>s2Member FAQs: <a href=\"http:\/\/s2member.com\/faqs\/\">http:\/\/s2member.com\/faqs\/<\/a><\/li>\n<li>Knowledge Base: <a href=\"http:\/\/s2member.com\/kb\/\">http:\/\/s2member.com\/kb\/<\/a><\/li>\n<li>Video Tutorials: <a href=\"http:\/\/s2member.com\/videos\/\">http:\/\/s2member.com\/videos\/<\/a><\/li>\n<li>Community: <a href=\"http:\/\/s2member.com\/r\/forum\/\">http:\/\/s2member.com\/r\/forum\/<\/a><\/li>\n<li>Codex: <a href=\"http:\/\/s2member.com\/codex\/\">http:\/\/s2member.com\/codex\/<\/a><\/li>\n<\/ul><\/dd>\n<dt id=\"translating%20s2member\"><h3>Translating s2Member<\/h3><\/dt>\n<dd><p>Please see: <a href=\"http:\/\/s2member.com\/r\/translations\/\">http:\/\/s2member.com\/r\/translations\/<\/a><\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>v260829<\/h4>\n\n<ul>\n<li><p>(Framework) <strong>Major Improvement:<\/strong> Rebuilt the Automatic End-of-Term processing engine so membership expirations are handled more reliably and promptly when due, even on busy sites or after delays, while making the system safer to administer and easier to review and troubleshoot.<\/p>\n\n<ul>\n<li><strong>Faster, adaptive processing:<\/strong> Instead of stopping after 6 users, the new engine uses the safe processing time available in each run and adapts to current speed, allowing it to handle hundreds of users in one pass.<\/li>\n<li><strong>Rapid queue catch-up:<\/strong> s2Member processes each member as promptly as practical after their actual EOT time is reached. If work remains, it continues about a minute later instead of waiting for the next regular 10-minute check. In our stress testing, a 1,000-user queue was processed in under 2 minutes, while the old 6-user limit would take almost 28 hours.<\/li>\n<li><strong>More resilient processing:<\/strong> Overlapping runs are prevented, interrupted or stale runs recover cleanly, and unfinished work remains available for the next pass instead of being lost or unnecessarily delayed.<\/li>\n<li><strong>Safer \"Delete\" behavior and review:<\/strong> Automatic Delete now removes membership access and moves the user account to Pending Deletion instead of permanently deleting it, preserving useful payment\/subscription details for review before single\/bulk deletion. Irreversible automatic deletion can still be enabled with the <code>ws_plugin__s2member_allow_eot_user_deletion<\/code> filter. <em>WP Admin &gt; Users &gt; Pending Deletion<\/em><\/li>\n<li><strong>New End-of-Term user lists:<\/strong> Added separate Current and Previous lists with EOT Time, Last EOT, and EOT Demotion columns. Current shows users with an EOT, earliest first; Previous shows prior EOTs, most recent demotion first. Older demotion times are recovered from Administrative Notes where possible. <em>WP Admin &gt; Users &gt; End-of-Term Current \/ End-of-Term Previous<\/em><\/li>\n<li><strong>Better demotion history:<\/strong> EOT actions, including moves to Pending Deletion, now leave more useful Administrative Notes with the role change, removed Custom Capabilities, subscription details, and the EOT that triggered the action. For example: <em>2026-08-31 00:03 EDT s2Member: Demoted from Level 1 to Subscriber (removed ccaps: courses). PayPal I-ABC123. EOT 2026-08-31 00:01 EDT.<\/em><\/li>\n<li><strong>Visible health and automatic recovery:<\/strong> A new Automatic Behavior Status shows pending and overdue EOTs, recent processing activity, the next scheduled run, and the current processing runtime, making delays and other problems visible instead of silent. s2Member repairs a missing WP-Cron schedule automatically when possible, and alerts administrators when a problem persists and needs attention.<\/li>\n<\/ul><\/li>\n<li><p>(Pro) <strong>Major Improvement:<\/strong> Rebuilt the End-of-Term Reminder Email processing engine so renewal notices have a better chance of going out promptly on their intended day, even after WP-Cron delays or temporary email sending problems that could previously prevent them from being sent.<\/p>\n\n<ul>\n<li><strong>Fast, adaptive processing:<\/strong> The new engine replaces the old 6-member limit with safe runtime-based processing, prevents overlapping runs, recovers interrupted ones, and continues about a minute later when more work remains. On our test server, 1,000 reminders were handed off through WordPress's mail system in about 42 minutes, while the old engine would need almost 28 hours.<\/li>\n<li><strong>Independent reminder engine:<\/strong> Reminders based on stored End-of-Term dates now have their own schedule and processing engine, so they no longer depend on membership-expiration processing completing first and aren't held up by a large or stalled End-of-Term queue.<\/li>\n<li><strong>Forgiving timing and smart retries:<\/strong> Reminder eligibility now uses calendar days, giving s2Member opportunities throughout the intended send day plus an extra recovery day in case of delays. Failed sends are retried after about 10 minutes, 30 minutes, 1 hour, and then every 3 hours while still eligible, with each recipient tracked independently to avoid duplicate resends.<\/li>\n<li><strong>Visible health and automatic recovery:<\/strong> A new End-of-Term Reminder Status shows scheduling activity, recent successful delivery, and recipients currently being retried, with additional failure and recovery details when something goes wrong. s2Member repairs a missing reminder schedule when possible, retries failed recipients automatically, and alerts administrators when problems persist and need attention.<\/li>\n<\/ul><\/li>\n<li><p>(Framework &amp; Pro) <strong>Fix:<\/strong> Fixed the long-standing issue where the Automatic End-of-Term setting could appear blank when its WP-Cron event was missing. The saved setting now remains visible while s2Member reports and repairs the scheduling problem separately.<\/p><\/li>\n<li><p>(Pro) <strong>Fix:<\/strong> End-of-Term renewal reminders are no longer sent when membership access ended because of a refund, payment reversal, or chargeback. These payment exceptions are now distinguished from normal membership expirations so they don't trigger inappropriate renewal notices.<\/p><\/li>\n<li><p>(Pro) <strong>Enhancement:<\/strong> Modernized s2Member Pro-Forms with PayPal Checkout, using PayPal's current REST APIs and Smart Payment Buttons for off-site payments. When PayPal Checkout is enabled in s2Member, it replaces the legacy PayPal Express Checkout integration for payments completed on PayPal's site. Existing Pro-Form shortcodes work as-is (no edits required). Enable it under <em>WP Admin &gt; s2Member &gt; PayPal Options &gt; PayPal Checkout (Beta)<\/em>.<\/p><\/li>\n<li><p>(Framework) <strong>Improvement:<\/strong> Strengthened PayPal Checkout REST order validation, capture reliability, retry handling, and payment processing safeguards.<\/p><\/li>\n<li><p>(Framework) <strong>Improvement:<\/strong> Better PayPal Checkout button feedback with clearer, more visible error and status messages below the button.<\/p><\/li>\n<li><p>(Framework) <strong>Improvement:<\/strong> Better compatibility for sites using PayPal Checkout while older PayPal subscriptions remain active. Since PayPal subscriptions generally need the integration that created them, s2Member now uses the appropriate one for next payment dates, reminder emails, <code>[s2EOT]<\/code>, and cancellations.<\/p><\/li>\n<li><p>(Framework) <strong>Security:<\/strong> Strengthened PayPal Checkout return validation and payment-flow integrity.<\/p><\/li>\n<li><p>(Framework) <strong>Fix:<\/strong> Improved PayPal Checkout subscription fulfillment retry handling, preventing failed payment notifications from being incorrectly marked complete and allowing browser or webhook recovery to retry safely.<\/p><\/li>\n<li><p>(Framework) <strong>Fix:<\/strong> PayPal Checkout now registers all required webhook events. Existing configured webhooks are updated automatically after upgrading, adding notifications for subscription activation\/updates, payment refunds\/reversals, and disputes\/chargebacks.<\/p><\/li>\n<li><p>(Pro) <strong>Fix:<\/strong> Strengthened Stripe Pro-Forms against duplicate charges from concurrent or repeated submissions of the same rendered checkout. Stripe requests now use a stable per-checkout idempotency ID, simultaneous submissions are blocked while payment processing is in progress, and a failed update to an existing PaymentIntent no longer falls through to creating another one. Thanks to DrCheap for the detailed report and investigation. See <a href=\"https:\/\/f.wpsharks.com\/t\/13589\">thread 13589<\/a>.<\/p><\/li>\n<li><p>(Pro) <strong>Fix:<\/strong> Fixed a Stripe compatibility issue that could cause <code>[s2Member-Profile \/]<\/code> and Stripe billing-update forms to crash when retrieving an existing subscription with newer Stripe API responses\/SDK behavior. Thanks to Tim Hibberd for reporting it and providing a patch. See <a href=\"https:\/\/f.wpsharks.com\/t\/13575\">thread 13575<\/a>.<\/p><\/li>\n<li><p>(Pro) <strong>UI:<\/strong> Updated Stripe Webhook\/IPN setup guidance to list all seven events s2Member handles. Sites with an existing Stripe webhook configured for selected events should make sure all seven are selected, including <code>charge.dispute.created<\/code>, so disputes\/chargebacks can follow the configured Reversals\/Disputes EOT behavior.<\/p><\/li>\n<li><p>(Pro) <strong>Improvement:<\/strong> Added an optional <code>placeholder<\/code> attribute for Authorize.Net, PayPal, and Stripe Pro-Form Checkout Options. This allows a Pro-Form to start with a non-payable prompt instead of automatically selecting the first Checkout Option, requiring the customer to choose a real option before the full checkout form is shown.<\/p><\/li>\n<li><p>(Framework &amp; Pro) <strong>Fix:<\/strong> Improved shortcode attribute handling when editors replace straight quotes with smart\/curly quotes. s2Member now also normalizes literal smart quotes so values such as <code>attribute=\u201c0\u201d<\/code> are interpreted correctly. Thanks to Vincent for reporting it. See <a href=\"https:\/\/f.wpsharks.com\/t\/13572\">thread 13572<\/a>.<\/p><\/li>\n<li><p>(Framework) <strong>Enhancement:<\/strong> Added a hook after profile modifications are saved and s2Member refreshes the user data, allowing integrations to read freshly updated user and custom profile fields. Thanks to Craig for bringing attention to this use case. See <a href=\"https:\/\/f.wpsharks.com\/t\/13515\">thread 13515<\/a>.<\/p><\/li>\n<li><p>(Framework &amp; Pro) <strong>Improvement:<\/strong> Bumped PHP version compatibility up to PHP 8.5.9 after addressing the remaining deprecation notices and related compatibility issues, while maintaining support for older PHP versions.<\/p><\/li>\n<li><p>(Framework) <strong>Fix:<\/strong> Hardened PayPal recurring-payment handling for missing optional IPN fields and memberships without Custom Capabilities, preventing PHP warnings and deprecation notices.<\/p><\/li>\n<li><p>(Framework) <strong>Fix:<\/strong> Hardened gateway notification and return handlers against missing or null optional transaction fields, preventing PHP warnings and deprecation notices.<\/p><\/li>\n<li><p>(Framework) <strong>Fix:<\/strong> Prevented PHP warnings during registrations or membership updates when optional details (like Custom Capabilities or EOT) weren't used.<\/p><\/li>\n<li><p>(Framework) <strong>Fix:<\/strong> Corrected an edge case in subscription modifications where an optional EOT component could end up in the Custom Capabilities value.<\/p><\/li>\n<li><p>(Framework) <strong>Fix:<\/strong> Fixed PHP 8 compatibility issues in legacy OpenSSL\/RSA signing and the Markdown fallback that could fail in some cases.<\/p><\/li>\n<\/ul>\n\n<h4>v260814<\/h4>\n\n<ul>\n<li><p>(Framework) <strong>Improvement:<\/strong> Better s2Member Security Encryption Key handling and related guidance in the admin panel.<\/p><\/li>\n<li><p>(Framework) <strong>Improvement:<\/strong> Hardened input validation and sanitization for the <code>s2Key<\/code>, <code>s2File<\/code>, <code>s2Stream<\/code>, and <code>s2Member-PayPal-Button<\/code> shortcodes.<\/p><\/li>\n<li><p>(Framework &amp; Pro) <strong>Improvement:<\/strong> Renamed and expanded the <code>s2Get<\/code> shortcode's user-field whitelist into the shared <em>Shortcode User Fields Whitelist<\/em> setting, now used for <code>s2Get<\/code>'s <code>user_id<\/code> attribute and <code>s2Member-List<\/code>'s <code>show_fields<\/code> attribute. Administrators are warned when either shortcode attempts to display an un-whitelisted field's value that doesn't belong to the current user viewing the page.<\/p><\/li>\n<li><p>(Framework &amp; Pro) <strong>Security:<\/strong> Improved validation and hardened handling of serialized data throughout s2Member.<\/p><\/li>\n<li><p>(Pro) <strong>Improvement:<\/strong> Hardened input validation and sanitization for the <code>s2Member-Login<\/code>, <code>s2Member-Summary<\/code>, <code>s2Member-Gift-Codes<\/code>, <code>s2Member-List<\/code>, <code>s2Member-List-Search-Box<\/code>, and <code>s2Member-Pro-ClickBank-Button<\/code> shortcodes, as well as the Pro Login Widget.<\/p><\/li>\n<li><p>(Pro) <strong>Security:<\/strong> Added stricter handling for <code>s2Member-List<\/code>'s <code>show_fields<\/code> attribute. s2Member will warn administrators about detected fields that still need review. Fields not whitelisted will not be displayed. Sites using <code>show_fields<\/code> should review <em>General Options &gt; Shortcode User Fields Whitelist<\/em> and allow the fields their Member Lists are intended to display.<\/p><\/li>\n<li><p>(Pro) <strong>Security:<\/strong> Added safer handling and a whitelist for the <code>template<\/code> shortcode attribute, used by the <code>s2Member-List<\/code>, <code>s2Member-List-Search-Box<\/code>, and Stripe, PayPal, and Authorize.Net Pro-Forms shortcodes. s2Member will warn administrators about detected templates that still need review. Templates not whitelisted will not be used, and the standard template will be used instead. Sites using custom templates should review <em>General Options &gt; Pro Shortcode Templates Whitelist<\/em> and allow their custom template files.<\/p><\/li>\n<li><p>(Pro) <strong>Fix:<\/strong> Prevented the Pro updater from offering or installing a Pro release newer than the installed s2Member Framework, avoiding compatibility issues until the Framework is updated first.<\/p><\/li>\n<li><p>(Pro) <strong>Fix:<\/strong> Prevented Stripe payment processing from continuing after Pro-Form validation rejects a submission, avoiding misleading Stripe card-field errors when other required form fields are missing.<\/p><\/li>\n<li><p>(Pro) <strong>Fix:<\/strong> Updated Stripe Pro-Forms to use the shortcode's <code>validate_zipcode<\/code> attribute correctly, so it can override the default setting to collect and validate the card's postal code.<\/p><\/li>\n<\/ul>\n\n<h4>v260805<\/h4>\n\n<ul>\n<li><p>(Framework) <strong>Improvement:<\/strong> Replaced TinyURL-based shortening for generated Registration Access and Specific Post\/Page Access URLs with new built-in s2Member short links, stored temporarily with WordPress transients. Existing TinyURL settings now use the built-in shortener automatically, avoiding TinyURL\u2019s deprecated no-key API endpoint and extra third-party pages shown before the destination.<\/p><\/li>\n<li><p>(Framework) <strong>Improvement:<\/strong> Better PayPal Checkout cancellation button handling when stored IPN Signup Vars are missing. s2Member now checks PayPal subscription details via API before cancellation, uses PayPal's next billing time plus the configured EOT grace period for the EOT time, and falls back to PayPal's subscription management page when a safe local cancellation cannot be completed. See <a href=\"https:\/\/f.wpsharks.com\/t\/13462\">thread 13462<\/a>.<\/p><\/li>\n<li><p>(Framework) <strong>Security:<\/strong> Hardened the <code>[s2Stream]<\/code> shortcode against executable JavaScript injection by users with post-editing privileges. Attributes used to configure JW Player are sanitized and validated more strictly, and custom <code>player_path<\/code> values must now be explicitly whitelisted using the <code>ws_plugin__s2member_sc_get_stream_player_paths<\/code> filter.<\/p><\/li>\n<li><p>(Framework) <strong>Security:<\/strong> Improved sanitization of sensitive data in s2Member debug logs.<\/p><\/li>\n<li><p>(Framework) <strong>Fix:<\/strong> Prevented a PHP 8+ fatal error during PayPal Standard PDT\/IPN return handling when PayPal reports an invalid or unexpected charset. PayPal return data is now converted to UTF-8 defensively, with fallback handling when the reported charset is not accepted by <code>mb_convert_encoding()<\/code>.<\/p><\/li>\n<li><p>(Pro) <strong>Improvement:<\/strong> Added safer handling for rare Stripe Pro-Form subscription checkouts where the first payment or setup confirmation remains pending. s2Member now delays paid-access changes until Stripe confirms the subscription is ready, helping avoid premature access while reducing the chance of confirmed Stripe subscriptions not matching s2Member access.<\/p><\/li>\n<li><p>(Pro) <strong>Fix:<\/strong> Fixed validation of zero-like trial period values such as <code>tp=\"0.00\"<\/code>, so they are treated the same as <code>tp=\"0\"<\/code> instead of being rejected as an invalid trial period.<\/p><\/li>\n<\/ul>\n\n<h4>v260508<\/h4>\n\n<ul>\n<li><p>(Framework) <strong>Fix:<\/strong> PayPal Checkout cancellation shortcodes now keep <code>output=\"anchor\"<\/code> clickable for logged-out visitors. Only <code>output=\"button\"<\/code> requires the member to be logged in. See <a href=\"https:\/\/f.wpsharks.com\/t\/13450\">thread 13450<\/a><\/p><\/li>\n<li><p>(Framework) <strong>Fix:<\/strong> PayPal Checkout no longer aborts if the customer's IP address changes during checkout. IP mismatches are logged, but valid checkouts continue processing.<\/p><\/li>\n<li><p>(Framework) <strong>Fix:<\/strong> Prevent false Auto-EOT demotions when a stored Auto-EOT time is <code>0<\/code>, and improve logging for invalid Auto-EOT values. See <a href=\"https:\/\/f.wpsharks.com\/t\/13412\">thread 13412<\/a><\/p><\/li>\n<li><p>(Framework) <strong>Fix:<\/strong> Prevented a PHP 8.1+ deprecation notice while reading registration times when the stored value is missing or false.<\/p><\/li>\n<li><p>(Framework) <strong>Improvement:<\/strong> Improved PayPal Checkout button loading with a client-side fallback when the PayPal SDK is missing from the final page output.<\/p><\/li>\n<li><p>(Pro) <strong>Fix:<\/strong> Prevented deprecation notices on newer PHP versions, which could interfere with automatic login\/redirects after Stripe checkout.<\/p><\/li>\n<li><p>(Pro) <strong>UI:<\/strong> Improved cancellation pro-form submit button text. Cancellation forms now say \u201cCancel Subscription\u201d instead of the generic \u201cSubmit Form\u201d. See <a href=\"https:\/\/f.wpsharks.com\/t\/13438\">thread 13438<\/a><\/p><\/li>\n<\/ul>\n\n<h4>v260410<\/h4>\n\n<ul>\n<li><p>(Framework) <strong>Fix:<\/strong> Reduced the upfront requirements for processing PayPal Standard <code>subscr_cancel<\/code> IPNs so valid cancellations are not ignored when supporting values are missing, stale, or non-membership-specific.<\/p><\/li>\n<li><p>(Framework) <strong>Fix:<\/strong> Prevent incorrect s2Member notifications in some PayPal Checkout cases where several webhooks are received about the same subscription.<\/p><\/li>\n<li><p>(Framework) <strong>Fix:<\/strong> Prevent duplicate processing and notifications when PayPal sends both a webhook and an IPN for the same PayPal Checkout subscription payment.<\/p><\/li>\n<li><p>(Framework) <strong>Fix:<\/strong> Added subscription modification cancellation support to the Framework, which was previously only available in the Pro addon.<\/p><\/li>\n<li><p>(Pro) <strong>Fix:<\/strong> Made subscription modification cancellation gateway-aware, preventing orphaned active subscriptions when a member starts a replacement subscription through a different gateway.<\/p><\/li>\n<li><p>(Pro) <strong>Fix:<\/strong> Prevented rare cases where subscription modification processing could cancel the newly created subscription by mistake.<\/p><\/li>\n<li><p>(Pro) <strong>Fix:<\/strong> Improved Stripe customer lookup during checkout retries by falling back to email when the stored Stripe customer ID is missing, stale, or no longer retrievable.<\/p><\/li>\n<\/ul>\n\n<h4>v260325<\/h4>\n\n<ul>\n<li><p>(Framework) <strong>Fix:<\/strong> Improved PayPal Checkout webhook idempotency to prevent duplicate processing during repeated\/concurrent webhooks, while preserving normal behavior.<\/p><\/li>\n<li><p>(Framework) <strong>Fix:<\/strong> Resolved a PayPal IPN issue where some <code>subscr_cancel<\/code> notifications were ignored because the cancellation handler failed before it had fully identified the recurring subscription.<\/p><\/li>\n<li><p>(Framework) <strong>Improvement:<\/strong> Added IPN Signup Var lookups for missing PayPal cancellation IPN values like <code>period1<\/code>, <code>period3<\/code>, <code>item_number<\/code>, <code>item_name<\/code>, and <code>payer_email<\/code>, preventing valid <code>subscr_cancel<\/code> notifications from being ignored.<\/p><\/li>\n<li><p>(Framework) <strong>Improvement:<\/strong> Moved s2Member's translation files to <code>\/languages<\/code>, following the WordPress standard, and updated <code>.mo<\/code> loading to support that directory while continuing to support the standard and legacy WordPress locations.<\/p><\/li>\n<li><p>(Framework) <strong>Improvement:<\/strong> Hardened PayPal Standard IPN endpoint response handling and added debug logging for hosts\/security layers that incorrectly return HTTP 403 after successful processing.<\/p><\/li>\n<li><p>(Framework) <strong>Enhancement:<\/strong> Added <code>ukpostcode<\/code> as an expected-value option for Custom Registration\/Profile Fields, with matching server-side and client-side validation for UK postcode input. The validation is designed to be reasonably broad, including standard UK formats and related special cases. Thanks to Gerard Earley for contributing the patch. See <a href=\"https:\/\/f.wpsharks.com\/t\/12200\">thread 12200<\/a><\/p><\/li>\n<li><p>(Framework) <strong>Enhancement:<\/strong> Added a new <strong>General Options &gt; s2Get Shortcode<\/strong> setting to allow <code>user_id<\/code> for whitelisted user fields, defaulting to current-user. Also updated the s2Get KB article accordingly.<\/p><\/li>\n<li><p>(Pro) <strong>Fix:<\/strong> Updated Stripe card charge and PaymentIntent requests to use <code>statement_descriptor_suffix<\/code> instead of <code>statement_descriptor<\/code>, fixing card-payment errors where Stripe no longer accepts <code>statement_descriptor<\/code> for card payments.<\/p><\/li>\n<li><p>(Pro) <strong>Fix:<\/strong> Corrected Stripe subscription checkout so resumed PaymentIntent flows no longer go through the wrong intent-status handler.<\/p><\/li>\n<li><p>(Pro) <strong>Fix:<\/strong> Stripe now stops cleanly after card declines, instead of continuing into secondary intent\/payment-method errors.<\/p><\/li>\n<li><p>(Pro) <strong>Fix:<\/strong> Improved Stripe recurring-payment setup to better support future-charge authorization requirements, fixing failures in countries with stricter payment rules, including India.<\/p><\/li>\n<li><p>(Pro) <strong>Fix:<\/strong> Stripe now updates recurring default payment methods only after a successful intent result, instead of earlier in checkout.<\/p><\/li>\n<li><p>(Pro) <strong>Fix:<\/strong> Billing-update SetupIntent creation failures in Stripe now return the proper error response.<\/p><\/li>\n<li><p>(Pro) <strong>Fix:<\/strong> Prevent duplicate\/retried Stripe webhook events from being processed more than once, including near-simultaneous retries of the same Stripe event ID<\/p><\/li>\n<li><p>(Pro) <strong>Fix:<\/strong> prevent Stripe billing modification\/replacement from triggering EOT behavior for the cancelled old subscription while s2Member is still updating the member account with the new subscription.<\/p><\/li>\n<li><p>(Pro) <strong>Fix:<\/strong> Removed a trailing-comma syntax issue in Stripe subscription update code that could cause PHP compatibility errors on older supported PHP versions.<\/p><\/li>\n<li><p>(Pro) <strong>Fix:<\/strong> s2Member now cleans up incomplete subscriptions left behind by failed 3D Secure authentication attempts during Stripe checkout, and gives the customer a more clear payment failure message.<\/p><\/li>\n<li><p>(Pro) <strong>Improvement:<\/strong> Added dedicated s2 Stripe log entries for non-fatal failures while updating the default payment method after successful intent completion.<\/p><\/li>\n<\/ul>\n\n<h4>v260312<\/h4>\n\n<ul>\n<li><p>(Framework) <strong>Fix:<\/strong> Prevent a PHP 8.1+ deprecation notice from appearing above the admin Users table in some cases.<\/p><\/li>\n<li><p>(Framework) <strong>Security:<\/strong> Improved debug log sanitization.<\/p><\/li>\n<li><p>(Framework) <strong>Improvement:<\/strong> PayPal Checkout credential test and OAuth failure log entries now include client_len_hash \/ secret_len_hash values (length_hash, e.g. 80_4d9a7c1b2e8f4a21) to help compare attempted credentials during troubleshooting without exposing raw values.<\/p><\/li>\n<li><p>(Framework) <strong>Enhancement:<\/strong> Added a new <em>No-Cache Headers Behavior<\/em> option under <em>General Options &gt; Performance &amp; Caching<\/em>, making no-cache behavior configurable from the admin UI. It includes:<\/p>\n\n<ul>\n<li><code>Always<\/code> mode, the legacy safe default that prevents caching site-wide in case user-conditional output appears.<\/li>\n<li><code>Selective<\/code> mode, which was previously available only through a filter and may improve caching for guests, but can miss some runtime no-cache triggers.<\/li>\n<li>The new <code>Evaluative<\/code> beta mode, which evaluates the page with more runtime information and may allow more pages to be cached safely for guests.<\/li>\n<li>An optional debug header to help troubleshoot no-cache behavior.<\/li>\n<\/ul><\/li>\n<li><p>(Framework) <strong>UI:<\/strong> Clarified the Download Options text to explain that unique download limits are counted in the last X days (rolling window), reducing confusion about whether the limit resets on fixed calendar dates.<\/p><\/li>\n<li><p>(Framework) <strong>UI<\/strong>: Improved the PayPal Checkout credentials test failure message.<\/p><\/li>\n<li><p>(Framework) <strong>UI:<\/strong> Fixed the PayPal button encryption admin notice so that it shows only to administrators in the WP Admin area, not non-admin users.<\/p><\/li>\n<\/ul>\n\n<h4>v260301<\/h4>\n\n<ul>\n<li><p>(Framework) <strong>Bug Fix:<\/strong> Fixed mismatched <code>&lt;label for=\"\"&gt;<\/code> and <code>&lt;input id=\"\"&gt;<\/code> attributes for checkbox\/radio options in Custom Registration\/Profile Fields; this also restores proper client-side validation for required checkbox\/radio groups.<\/p><\/li>\n<li><p>(Framework) <strong>Fix:<\/strong> Hardened the Edit User Profile screen on PHP 8+ to avoid errors if a user\u2019s Auto-EOT time is stored as a date string (e.g. YYYY-MM-DD) rather than a Unix timestamp (as can happen after imports\/migrations).<\/p><\/li>\n<li><p>(Framework) <strong>Fix:<\/strong> Fixed PHP 8+ \"Undefined array key\" warnings related to membership level label constants (including guest\/non-logged-in access label handling).<\/p><\/li>\n<li><p>(Framework) <strong>Fix:<\/strong> Resolved an issue that prevented PayPal Buttons \"Generate Button Code\" from working in some installations.<\/p><\/li>\n<li><p>(Framework) <strong>Fix:<\/strong> Some PayPal Checkout log entries were missing the environment (sandbox\/live), and now include it to help with troubleshooting.<\/p><\/li>\n<li><p>(Framework) <strong>Fix:<\/strong> PayPal Checkout webhooks can continue processing existing subscriptions even if new sales are switched back to PayPal Standard.<\/p><\/li>\n<li><p>(Framework) <strong>Fix:<\/strong> PayPal Checkout webhooks now also handle refunds, reversals, and additional subscription lifecycle events, improving user EOT\/access updates and subscription state handling.<\/p><\/li>\n<li><p>(Framework) <strong>Fix:<\/strong> Improved PayPal Checkout amount decimal normalization to prevent one-time payment validation mismatches.<\/p><\/li>\n<li><p>(Framework) <strong>Fix:<\/strong> Updated PayPal Checkout webhook handling to prevent one-time payment captures from being processed as recurring payments.<\/p><\/li>\n<li><p>(Framework &amp; Pro) <strong>Fix:<\/strong> Prevent PHP 8.1+ deprecation warnings in gateway Pro-Forms and related checkout processing (Stripe, PayPal Pro, Authorize.Net), and in custom registration fields, by ensuring optional form\/template values are cast to strings before escaping\/processing.<\/p><\/li>\n<li><p>(Framework) <strong>Security:<\/strong> Improved debug log sanitization (passwords, API secrets, auth credentials) and reduced post-registration plaintext password exposure.<\/p><\/li>\n<li><p>(Framework) <strong>Improvement:<\/strong> PayPal Standard and PayPal Checkout cancellation buttons now use PayPal\u2019s subscription management page when needed.<\/p><\/li>\n<li><p>(Framework) <strong>Improvement:<\/strong> Better HTTPS detection in s2Member\u2019s PayPal Checkout setup for sites using Cloudflare (or other reverse proxies), reducing false setup failures when enabling or configuring PayPal Checkout.<\/p><\/li>\n<li><p>(Pro) <strong>Improvement:<\/strong> Hardened the Advanced Importer to normalize Auto-EOT values given as date strings (e.g. YYYY-MM-DD) into Unix timestamps when a date is used instead of the expected timestamp format.<\/p><\/li>\n<li><p>(Pro) <strong>Improvement:<\/strong> PayPal Checkout buttons now support <code>accept=\"card\"<\/code> in Pro button attributes, enabling card funding\/guest checkout where PayPal makes it available.<\/p><\/li>\n<\/ul>\n\n<h4>v260215<\/h4>\n\n<ul>\n<li><p>(Framework) <strong>Bug Fix:<\/strong> Prevent PHP fatal error when multiple PayPal Checkout buttons appear on the same page (PHP 8+).<\/p><\/li>\n<li><p>(Framework) <strong>Bug Fix:<\/strong> PayPal Checkout admin actions (Test Credentials \/ Webhook \/ Clear Cache) now submit via POST instead of redirecting (avoids \u201cheaders already sent\u201d warnings).<\/p><\/li>\n<li><p>(Framework) <strong>Bug Fix:<\/strong> PayPal cancellation notifications now backfill missing membership mapping fields (<code>item_number<\/code>, <code>item_name<\/code>, <code>period1<\/code>, <code>period3<\/code>) from stored IPN Signup Vars using the subscription ID ( <code>recurring_payment_id<\/code> \/ <code>subscr_id<\/code> ), so Auto-EOT is set correctly on cancel.<\/p><\/li>\n<li><p>(Framework) <strong>Bug Fix:<\/strong> Auto-EOT PayPal status checks now query PayPal Checkout subscriptions via PayPal\u2019s REST Subscriptions API (instead of PayPal's legacy \u201cRecurring Payments\u201d API), preventing \u201c11592\u201d errors and allowing Auto-EOT to detect inactive PayPal Checkout subscriptions.<\/p><\/li>\n<li><p>(Framework) <strong>Security:<\/strong> PayPal Checkout webhook environment inference now validates the <code>paypal-cert-url<\/code> host before using it (hardens environment inference used during verification).<\/p><\/li>\n<li><p>(Framework) <strong>Security:<\/strong> PayPal Checkout cancel redirect now validates the destination URL and safely falls back to the site home URL.<\/p><\/li>\n<li><p>(Framework) <strong>Security:<\/strong> PayPal Checkout tokens now use s2Member\u2019s hardened unserialize routine.<\/p><\/li>\n<li><p>(Framework) <strong>Security:<\/strong> Harden unserialization of stored custom capabilities metadata when loading user access rules.<\/p><\/li>\n<li><p>(Framework) <strong>Security:<\/strong> Harden the registration password handler.<\/p><\/li>\n<li><p>(Framework) <strong>Improvement:<\/strong> Harden PayPal Checkout endpoint behavior on problematic hosts; return consistent JSON errors (HTTP 500) on notify-proxy failures.<\/p><\/li>\n<li><p>(Framework) <strong>Improvement:<\/strong> Harden PayPal Checkout REST API\/webhook handling for network failures and unexpected\/non-JSON responses (avoids PHP 8+ warnings).<\/p><\/li>\n<li><p>(Framework) <strong>Improvement:<\/strong> PayPal Checkout webhook setup now treats \"no change\" updates and existing webhook URLs as success (adopts the existing webhook ID automatically).<\/p><\/li>\n<li><p>(Framework) <strong>Improvement:<\/strong> PayPal Checkout webhook signature verification now auto-detects Sandbox vs Live from inbound headers (so webhooks validate correctly even if the site\u2019s current environment setting differs).<\/p><\/li>\n<li><p>(Framework) <strong>Improvement:<\/strong> PayPal Checkout logging now includes <code>env_setting<\/code> (site setting) and <code>env_webhook<\/code> (inferred from inbound webhook headers) for clearer Sandbox\/Live environment troubleshooting.<\/p><\/li>\n<li><p>(Framework) <strong>Improvement:<\/strong> PayPal Checkout webhook idempotency cache (event\/txn transients) now retains entries for 1 year (reduces long-term option bloat while preserving replay protection).<\/p><\/li>\n<li><p>(Framework) <strong>Improvement:<\/strong> s2Member\u2019s PayPal \u201cUnsubscribe\u201d button links to PayPal\u2019s subscription management page, and with the new PayPal Checkout integration, when <code>output=\"button\"<\/code> and a PayPal subscription ID is present, s2Member will attempt to cancel the subscription directly.<\/p><\/li>\n<li><p>(Framework) <strong>UI:<\/strong> Add a description for <code>paypal-checkout.log<\/code> in the Log Viewer dropdown (so it\u2019s not \u201cNo description available\u201d).<\/p><\/li>\n<li><p>(Pro) <strong>Improvement:<\/strong> PayPal Checkout buttons now support <code>accept=\"card\"<\/code> to enable guest debit\/credit card payment in the PayPal-hosted checkout experience when available (availability depends on PayPal settings\/eligibility and browser privacy protections).<\/p><\/li>\n<\/ul>\n\n<h4>v260127<\/h4>\n\n<ul>\n<li>(Framework) <strong>PayPal Enhancement<\/strong>: Modernized s2Member\u2019s PayPal integration by adding support for PayPal Checkout with their latest REST APIs, Smart Buttons, and webhook event handling. This release introduces PayPal\u2019s current Checkout platform as an optional, reliable alternative to the legacy PayPal Standard buttons. Existing s2Member PayPal button shortcodes continue to work as-is (no edits required). See: <em>WP Admin &gt; s2Member &gt; PayPal Options &gt; PayPal Checkout (Beta)<\/em>. Thanks to the beta testers, especially Sim Architect.<\/li>\n<\/ul>\n\n<h4>v260101<\/h4>\n\n<ul>\n<li><p>(Framework) <strong>Security<\/strong>: Improved sanitization and normalization of attribute values for the s2Eot, s2Strem and s2Member-Security-Badge  shortcodes.<\/p><\/li>\n<li><p>(Framework) <strong>Security<\/strong>: Improved sanitization of replacement values for confirmation and notification emails.<\/p><\/li>\n<\/ul>\n\n<h4>v251005<\/h4>\n\n<ul>\n<li><p>(Framework) <strong>Security<\/strong>: Improved sanitization for Tracking API replacement values.<\/p><\/li>\n<li><p>(Framework) <strong>Fix<\/strong>: Use the site URL host instead of HTTP_HOST for proxy key when Skip Domain Check is enabled.<\/p><\/li>\n<li><p>(Framework) <strong>Fix<\/strong>: Ensure the Fallback IPN Signup Vars provide a valid item_number for cancellation handling.<\/p><\/li>\n<\/ul>\n\n<h4>v250905<\/h4>\n\n<ul>\n<li><p>(Framework) <strong>Security<\/strong>: Improve handling of registration fields in multisite.<\/p><\/li>\n<li><p>(Framework &amp; Pro) <strong>UI<\/strong>: Add a Help panel with contact form to all admin pages.<\/p><\/li>\n<\/ul>\n\n<h4>v250701<\/h4>\n\n<ul>\n<li>(Framework &amp; Pro) <strong>Enhancement<\/strong>: s2Member now supports sending emails in HTML format, allowing for richer, styled messages with formatting, links, and branding. You can enable this feature under <em>General Options &gt; Email Configuration &gt; Enable HTML Emails<\/em>. When disabled, emails continue to use plain text as before. This feature is currently in beta, so feedback is welcome!<\/li>\n<\/ul>\n\n<h4>v250607<\/h4>\n\n<ul>\n<li><p>(Framework &amp; Pro) <strong>Enhancement<\/strong>: Added a new option to skip the domain validation for notifications from the payment gateways. This allows continued processing of incoming notifications even if the domain in the <code>custom<\/code> value doesn't match the current site's. Useful for subscriptions originated outside of s2Member, or under a different domain. The setting is available under: <em>WP Admin &gt; s2Member &gt; PayPal Options &gt; PayPal IPN \/ Instant Payment Notifications<\/em><\/p><\/li>\n<li><p>(Pro) <strong>UI<\/strong>: Added the recent IPN Signup Vars Fallback and new Skip Domain Validation to all the gateway options pages.<\/p><\/li>\n<li><p>(Framework) <strong>Enhancement<\/strong>: Added the site's language code when loading the reCaptcha.<\/p><\/li>\n<li><p>(Pro) <strong>UI<\/strong>: Added a page refresh after the Pro Updater finishes installing the latest Pro release, to update the WP Admin interface and not show the Pro Updater again.<\/p><\/li>\n<li><p>(Pro) <strong>UI<\/strong>: Added a page refresh after the Other Gateways options are saved, to update the WP Admin left menu.<\/p><\/li>\n<\/ul>\n\n<h4>v250525<\/h4>\n\n<ul>\n<li>(Framework &amp; Pro) <strong>Fix<\/strong>: Some translations were being applied too early, causing PHP notices since WP 6.7. Now all translations are only loaded at the <code>init<\/code> hook or later. See <a href=\"https:\/\/f.wpsharks.com\/t\/12813\">thread 12813<\/a><\/li>\n<\/ul>\n\n<h4>v250511<\/h4>\n\n<ul>\n<li><p>(Framework) <strong>Fix<\/strong>: Improved the admin notices handler to prevent a PHP 8.1+ error in rare cases when the data wasn't an array as expected.<\/p><\/li>\n<li><p>(Framework) <strong>Enhancement<\/strong>: Added sanitization to the admin notices handler for improved safety.<\/p><\/li>\n<li><p>(Framework &amp; Pro) <strong>Fix<\/strong>: Updated all uses of preg_split() with <code>-1<\/code> instead of <code>NULL<\/code> as the limit to prevent PHP 8.1+ deprecation warnings.<\/p><\/li>\n<li><p>(Pro) <strong>Fix<\/strong>: Fixed an s2Member-List database query with a typo that prevented some custom searches from working as expected.<\/p><\/li>\n<li><p>(Pro) <strong>Fix<\/strong>: Removed a check in Stripe pro-forms that blocked using the same details for trial and regular payments for subscriptions. See <a href=\"https:\/\/f.wpsharks.com\/t\/12818\">thread 12818<\/a>.<\/p><\/li>\n<\/ul>\n\n<h4>v250502<\/h4>\n\n<ul>\n<li><p>(Pro) <strong>Enhancement<\/strong>: Added optional fallback behavior for missing IPN Signup Vars during Stripe webhook processing. When enabled, s2Member will generate a makeshift IPN vars array if none are stored for the user. This helps support migrated or manually imported subscriptions. The setting is available under <em>s2Member Pro &gt; Stripe Options &gt; Stripe Webhook\/IPN Integration<\/em>. See <a href=\"https:\/\/f.wpsharks.com\/t\/11334\">thread 11334<\/a>.<\/p><\/li>\n<li><p>(Framework) <strong>UI<\/strong>: Removed admin notice about Easter promo for Pro add-on.<\/p><\/li>\n<\/ul>\n\n<h4>v250424<\/h4>\n\n<ul>\n<li>(Framework) <strong>Enhancement<\/strong>: Added additional sanitation\/validation to the Logs Viewer, although only Administrators have access to it.<\/li>\n<\/ul>\n\n<h4>v250419<\/h4>\n\n<ul>\n<li><p>(Pro) <strong>Enhancement<\/strong>: Improved the new coupon code limit per user which prevents a user from applying a coupon code unlimited times, Instead of single use, it can now be limited to more uses, e.g. 3. It's been renamed from \"User Once\" to \"User Max\", max number of times a user can use that coupon. This is optional and leaving it blank will give the default \"no limit\".<\/p><\/li>\n<li><p>(Pro) <strong>Enhancement<\/strong>: Improved validation of the template attribute in the s2Member-List-Search-Box shortcode.<\/p><\/li>\n<li><p>(Framework) <strong>UI<\/strong>: Temporary admin notice about Easter promo for Pro add-on at 20% off.<\/p><\/li>\n<\/ul>\n\n<h4>v250214<\/h4>\n\n<ul>\n<li><p>(Pro) <strong>Enhancement<\/strong>: Improved coupon usage logging for better tracking.<\/p><\/li>\n<li><p>(Pro) <strong>Enhancement<\/strong>: Added a new single-use per user option for coupons. Thanks to Carl Borsani for sponsoring this.<\/p><\/li>\n<li><p>(Pro) <strong>Enhancement<\/strong>: Coupons can now be limited to specific pro-forms. Thanks to Carl Borsani for sponsoring this.<\/p><\/li>\n<li><p>(Framework) <strong>Fix<\/strong>: s2Get can now handle s2Member\u2019s custom profile fields. Thanks to Gerard Earley for reporting this.<\/p><\/li>\n<li><p>(Framework) <strong>Fix<\/strong>: Updated the admin notice about the PayPal button encryption setting.<\/p><\/li>\n<li><p>(Pro) <strong>Enhancement<\/strong>: Improved data handling in the Remote Operations API. Props to Istv\u00e1n.<\/p><\/li>\n<li><p>(Pro) <strong>Enhancement<\/strong>: Improved validation of the template attribute in pro-forms and s2Member-List shortcodes. Props to Istv\u00e1n.<\/p><\/li>\n<\/ul>\n\n<h4>v241216<\/h4>\n\n<ul>\n<li><p>(Framework) <strong>Enhancement<\/strong>: Added extra attribute validation to the s2Get shortcode. Props to wcraft.<\/p><\/li>\n<li><p>(Framework) <strong>Enhancement<\/strong>: Improved New User email preparation before send. Props to Hakiduck.<\/p><\/li>\n<\/ul>\n\n<h4>v241114<\/h4>\n\n<ul>\n<li><p>(Framework &amp; Pro) <strong>Fix<\/strong>: An error could happen on PHP8 during Pro activation. Fixed in this release.<\/p><\/li>\n<li><p>(Framework) <strong>Enhancement<\/strong>: s2Get shortcode can now be used to show s2's current user constants. E.g. <code>[s2Get constant=\"S2MEMBER_CURRENT_USER_DISPLAY_NAME\" \/]<\/code> <em>WP Admin &gt; s2Member &gt; API \/ Scripting &gt; s2Member PHP\/API Constants<\/em><\/p><\/li>\n<\/ul>\n\n<h4>v240325<\/h4>\n\n<ul>\n<li><p>(Framework) <strong>Fix<\/strong>: Some sites were getting a warning from v240315's restriction improvement when the WP REST request doesn't include a type or ID. Fixed in this release.See <a href=\"https:\/\/f.wpsharks.com\/t\/11347\">thread 11347<\/a><\/p><\/li>\n<li><p>(Pro) <strong>Enhancement<\/strong>: Checkout success redirection URLs are now validated as safe with WordPress' <em>wp_validate_redirect<\/em>. To use a domain different than the site's, it can be allowed with wp's filter <a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/allowed_redirect_hosts\/\">allowed_redirect_hosts<\/a>.<\/p><\/li>\n<li><p>(Framework) <strong>Enhancement<\/strong>: Additional validation to prevent an invalid s2Member Level role during registration.<\/p><\/li>\n<\/ul>\n\n<h4>v240315<\/h4>\n\n<ul>\n<li>(Framework) <strong>Enhancement<\/strong>: Improved access restrictions applied to WP REST requests.<\/li>\n<\/ul>\n\n<h4>v240218<\/h4>\n\n<ul>\n<li><p>(Framework) <strong>Fix<\/strong>: PayPal button encryption default changed to \"disabled\".<\/p><\/li>\n<li><p>(Framework) <strong>Fix<\/strong>: Mailchimp interest groups integration wasn't working correctly all the time. Fixed in this release.<\/p><\/li>\n<\/ul>\n\n<h4>v230815<\/h4>\n\n<ul>\n<li><p>(Framework) <strong>Fix<\/strong>: Added some missing functions to the list of conditionals allowed by default for s2If (e.g. <code>current_user_days_to_eot_less_than<\/code>, <code>current_user_gateway_is<\/code>). See also: https:\/\/s2member.com\/kb-article\/s2if-simple-shortcode-conditionals\/#toc-5bb69568<\/p><\/li>\n<li><p>(Pro) <strong>Enhancement<\/strong>: New s2If whitelist option for custom conditional functions to be allowed. <em>s2Member Pro &gt; Restriction Options &gt; Simple Shortcode Conditionals &gt; Whitelist<\/em><\/p><\/li>\n<li><p>(Framework) <strong>Enhancement<\/strong>: Handle s2If conditional problems more gracefully. Instead of giving an error that prevents loading the rest of the page, it now just doesn't display that s2If's block, and enters a message in the error log (e.g. <code>\/wp-content\/debug.log<\/code>).<\/p><\/li>\n<li><p>(Framework &amp; Pro) <strong>Enhancement<\/strong>: Prevent output from s2If conditions, only <em>true<\/em> or <em>false<\/em>.<\/p><\/li>\n<li><p>(Framework) <strong>UI<\/strong>: Update the Mailchimp example from <code>Group Title<\/code> to <code>Group Category<\/code>, to match Mailchimp's current name in their settings. <em>s2Member &gt; API \/ List Servers &gt; Mailchimp<\/em><\/p><\/li>\n<\/ul>\n\n<h4>v230808<\/h4>\n\n<ul>\n<li>(Framework) <strong>Fix<\/strong>: Potential security issue under rare circumstances. Fixed in this  &hellip;<\/li>\n<\/ul>","raw_excerpt":"\u2764\ufe0f Excellent membership plugin! Easy, quick, flexible. Monetize your site with memberships and subscriptions. Protect content instantly and securely.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/694","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=694"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/clavaque"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=694"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=694"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=694"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=694"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=694"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=694"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}