For reference, my changes to s2Member were:
The first step was changing the logic from hooking into wp_login to filtering the login_redirect. Since s2Member removes all filters on login_redirect, I also had to modify login-redirects-r.inc.php to add the filter back after all others are removed.
The altered login_redirect function in login-redirects.inc.php:
public static function login_redirect ($redirect,$request,$user)
{
foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
do_action ("ws_plugin__s2member_before_login_redirect", get_defined_vars ());
unset /* Unset defined __refs, __v. */ ($__refs, $__v);
$username = $user->user_login;
if (is_string($username) && $username && is_object ($user) && !empty ($user->ID) && ($user_id = $user->ID))
{
update_user_option ($user_id, "s2member_last_login_time", time());
if /* Have we got this yet? */ (!get_user_option ("s2member_registration_ip", $user_id))
update_user_option ($user_id, "s2member_registration_ip", $_SERVER["REMOTE_ADDR"]);
if (($logins = (int)get_user_option ("s2member_login_counter", $user_id) + 1) >= 1 || ($logins = 1))
update_user_option ($user_id, "s2member_login_counter", $logins);
if /* Nag em? */ ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_password"])
delete_user_setting ("default_password_nag") . update_user_option ($user_id, "default_password_nag", false, true);
$disable_login_ip_restrictions = apply_filters ("ws_plugin__s2member_disable_login_ip_restrictions", false, get_defined_vars ());
if (($ok = true) && !is_super_admin ($user_id) && $username !== "demo" && !$disable_login_ip_restrictions)
$ok = c_ws_plugin__s2member_ip_restrictions::ip_restrictions_ok ($_SERVER["REMOTE_ADDR"], $username);
if (($redirect = apply_filters ("ws_plugin__s2member_login_redirect", (($user->has_cap ("edit_posts")) ? false : true), get_defined_vars ())))
{
$obey_redirect_to = apply_filters ("ws_plugin__s2member_obey_login_redirect_to", /* By default, we obey this. */ true, get_defined_vars ());
if (!$obey_redirect_to || empty ($_REQUEST["redirect_to"]) || !is_string ($_REQUEST["redirect_to"]) || $_REQUEST["redirect_to"] === admin_url () || preg_match ("/^\/?wp-admin\/?$/", $_REQUEST["redirect_to"]))
{
foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
do_action ("ws_plugin__s2member_during_login_redirect", get_defined_vars ());
unset /* Unset defined __refs, __v. */ ($__refs, $__v);
if /* Is this a string? */ ($redirect && is_string ($redirect))
return /* Dynamic URL introduced by a Filter? */ ($redirect);
else if ($redirection_url = c_ws_plugin__s2member_login_redirects::login_redirection_url ($user))
return /* Special Redirection URL configured with s2Member. */ ($redirection_url);
else // Else we use the Login Welcome Page configured for s2Member.
return (get_page_link ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_welcome_page"]));
exit /* Clean exit. */ ();
}
}
}
foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
do_action ("ws_plugin__s2member_after_login_redirect", get_defined_vars ());
unset /* Unset defined __refs, __v. */ ($__refs, $__v);
return /* Return for uniformity. */;
}
My altered filter in hooks.php (replaces the add_action(‘wp_login’)):
add_filter("login_redirect", "c_ws_plugin__s2member_login_redirects::login_redirect", 20, 3);
My altered remove_login_redirect_filters in login-redirects-r.inc.php:
public static function remove_login_redirect_filters ()
{
//if(defined ("DOING_AJAX") || DOING_AJAX) return;
do_action ("ws_plugin__s2member_before_remove_login_redirect_filters", get_defined_vars ());
if (!apply_filters ("ws_plugin__s2member_allow_other_login_redirect_filters", false, get_defined_vars ()))
{
remove_all_filters /* Removes all <code>login_redirect</code> Filters. */("login_redirect");
add_filter ("login_redirect", "c_ws_plugin__s2member_login_redirects_r::_empty_login_redirect_filter");
add_filter("login_redirect", "c_ws_plugin__s2member_login_redirects::login_redirect", 20, 3);
do_action ("ws_plugin__s2member_during_remove_login_redirect_filters", get_defined_vars ());
}
do_action ("ws_plugin__s2member_after_remove_login_redirect_filters", get_defined_vars ());
return /* Return for uniformity. */;
}
I realize that filtering the login_redirect twice may be redundant, but I will leave that decision up to s2Member’s team.
The summary of my changes are:
- Changing the use of wp_login hook to login_redirect filter.
- Altering the login_redirect function of s2Member to return the url instead of redirecting to it.
- Re-adding the filter after all filters are removed by remove_login_redirect_filters.