Okay, first let me thank you for all of your help so far. I am getting S2member figured out — it is certainly fantastic.
I am using MailChimp to have the capability to send emails to everyone (the MailChimp list) and separate emails to different types (MailChimp Groups). S2member works great to manage the MailChimp side as my S2 users are created, expire, renew, or are even deleted. I have used the http://www.s2member.com/kb/changing-the-eot-demotion-level-dynamically/ hack to setup for dynamic demoting of users — works great!
Further, I am starting to understand what I can and can’t do with amr-user to generate lists for my S2member users. CCap’s work well to provide needed filtering. However, I need some of my ccap’s used for the amr-list filtering to not be removed when the EOT is reached.
Now to my question. It appears to me that the ccap’s are being removed in the hack I have created using the hack described above. I am looking at the code immediately below where the dynamic demotions are set:
/* added by WPE based on Dynamic EOT hack post in the S2member forum */
$existing_role = c_ws_plugin__s2member_user_access::user_access_role ($user);
if($existing_role === 's2member_level12') // Corporate Member
$demotion_role = 's2member_level6'; // expired Corporate Member
elseif($existing_role === 's2member_level11') // Corporate Alternate
$demotion_role = 's2member_level5'; // expired Corporate Alternate
elseif($existing_role === 's2member_level10') // Corporate Member-at-Large
$demotion_role = 's2member_level4'; // expired Corporate Member-at-Large
elseif($existing_role === 's2member_level9') // Individual Member
$demotion_role = 's2member_level3'; // expired Individual Member
else // Guest
$demotion_role = c_ws_plugin__s2member_option_forces::force_demotion_role("subscriber");
Then, it appears that the code immediately after this block is used to remove the data from various fields to include the ccap’s.
eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
do_action ("ws_plugin__s2member_during_auto_eot_system_during_before_demote", get_defined_vars ());
do_action ("ws_plugin__s2member_during_collective_mods", $user_id, get_defined_vars (), $eot_del_type, "modification", $demotion_role);
do_action ("ws_plugin__s2member_during_collective_eots", $user_id, get_defined_vars (), $eot_del_type, "modification");
unset ($__refs, $__v); /* Unset defined __refs, __v. */
/**/
if ($existing_role !== $demotion_role) /* Only if NOT the existing Role. */
$user->set_role ($demotion_role); /* Give User the demotion Role. */
/**/
foreach ($user->allcaps as $cap => $cap_enabled)
if ( preg_match ("/^access_s2member_ccap_/", $cap) )
$user->remove_cap ($ccap = $cap);
/**/
delete_user_option ($user_id, "s2member_custom");
delete_user_option ($user_id, "s2member_subscr_id");
Specifically, the foreach loop appears to be removing the ccap’s.
Two questions:
1) can I add an if statement after
if ( preg_match ("/^access_s2member_ccap_/", $cap) )
that would allow me to test for specific ccap's, e.g. access_s2member_corp_mbr,
and skip the removal of that ccap? If so, what would that if statement look like?
2) can I add a ccap if another is to be removed, e.g, could I test for ccap = active with
if ( preg_match ("/^access_s2member_ccap_active/", $cap) )
and then add a ccap "access_s2member_inactive"? If so, how?
Thank you in advance,
Bill
-
This topic was modified 4 years, 2 months ago by
Eduan. Reason: Removed unnecessary pre tags