Support » Developing with WordPress » Login Redirects based on custom profile field

  • Resolved Binary Web

    (@binarywc)


    Let me start by saying we looked at most of the membership plugins that are out there and many of them require purchase of add-ons to get the functionality we want and even then they do not have all the functionality we want. So we decided to do this completely custom without any of the existing plugins.

    We have set up two custom user types and two custom post types to pair with those user types to use for Front End user profiles. I am not looking for a way to add an admin only field to the default WP profile that will allow us to run a check when users login and forward them to their own profile. Also, we have implemented a star rating system using a custom plugin that adds the functionality to the default commenting system and we would like to use this new admin only profile field to confirm the user is looking at their own profile and make it so they can not submit comments.

    Thank you in advance for your help.

Viewing 15 replies - 1 through 15 (of 20 total)
  • Moderator Steven Stern

    (@sterndata)

    Support Team Volunteer

    I think you could write a filter/action for this plugin to do redirects on login based on your custom field(s):

    https://wordpress.org/plugins/peters-login-redirect/

    I plan to use code similar to this for the redirect

    function my_login_redirect( $url, $request, $user ){
        if( $user && is_object( $user ) && is_a( $user, 'WP_User' ) ) {
            if( $user->has_cap( 'administrator' ) ) {
                $url = admin_url();
            } else {
                $url = home_url('/user/home/');
            }
        }
        return $url;
    }
    add_filter('login_redirect', 'my_login_redirect', 10, 3 );
    

    It would get too cumbersome to be adding a new redirect using Pete’s Login Redirect plugin for every new user. Also, the profiles are not being automatically created on signup. The client wanted his office to create each profile manually. I am not sure how to add the custom field in the default WordPress profile screen.

    Moderator bcworkz

    (@bcworkz)

    Hiya Davood

    Add fields to the user profile screen by hooking any of the several actions on /wp-admin/user-edit.php. You can also use filters as actions as long as your callback returns the passed value. It doesn’t matter of the filter is unrelated as long as it fires at the right time.

    Save the added field value by hooking the ‘profile_update’ action. Get your value from $_POST. Be sure to validate and sanitize before saving.

    Is there any documentation I should refer to that may help me better understand what you are suggesting I do?

    Thank you in advance.

    $user->has_cap( 'administrator' )
    It is never a good idea to mix capabilities and roles. If you are checking for a capability, name it. If you want a role, check that.

    I knew about $user->has_cap( 'administrator' )

    I am not sure I follow what you are suggesting about mixing capabilities and roles.

    has_cap is a function that checks capability. administrator is a role. So it is mixed. That doesn’t guarantee good results because the role can change its capabilities.

    Moderator bcworkz

    (@bcworkz)

    Sorry, no docs. You just hook one of the mentioned actions and output whatever form field you want. Do pick an action that fires inside the page’s <form> tags. Then the field value will be in $_POST when your callback for “profile_update” runs.

    There are really very few reasons to check a user’s role. You should be checking for capability instead. Check for the capability related to the reason you are checking. If you are checking before allowing a user to edit something about another user, check for the “edit_users” capability. It shouldn’t matter what role a user has as long as they have the capability to do something.

    Actually, the more i’ve thought about it I do not need to check the role or capabilities at all because users will not ever see the default WP profile screen. I really just need to know how to add the field to the profile where I can type in the slug of the users custom profile page

    for instance, for an employee named jan wells her profile page would be /employee/jan-wells and I would type jan-wells as the users slug and have it check for and print the user type to get form the full url.

    hopefully that makes sense and someone can provide me some pointers on how to add the profile field.

    Thank you in advance.

    Use a capability check and a nonce check, or you will be fixing a hack.
    Search for plugins that do something similar and read the code.

    Okay, I will do that. But I am still very lost on how to add the field in the first place.

    Moderator bcworkz

    (@bcworkz)

    If there is existing data in user meta which you merely wish to see and not edit on a user’s profile screen, the process is a lot easier. You’re right that role or capability does not need to be checked in this case because WP does this for you. Also, a read only field will not contribute to any vulnerability.

    An example to display read-only meta data at the bottom of a profile screen’s personal options section:

    add_action('profile_personal_options', function($user) {
       $meta = get_user_meta( $user->ID, 'foobar_meta_key', true );
       echo "<tr class=\"user-meta-wrap\">
           <th><label for=\"user-meta\">User's foobar meta</label></th>
           <td>$meta</td>
         </tr>";
    });

    I am trying to add a field to the profile.
    Profiles are created manually and we want to place the slug of the profile that is created into a field in the profile that we can then use code to read that field and automate the page to forward users to when they click a my profile button. We decided not to do a forwarder on login but instead forward to a neutral dashboard page on login.

    Thanks again for all your help.

    Moderator bcworkz

    (@bcworkz)

    The profile displayed at wp-admin/profile.php? What is this field accomplishing that the username or ID could not do? Why not forward all users to the same page and have the template decide upon the content shown based on the current user? Basically how profile.php works. All users go to the same profile.php, but each user sees their own profile information.

    Use the login_redirect filter to go directly to a page with a custom template. The template code displays the content users would have been sent to in your scheme. Instead of sending a user to content, bring the content to the user 🙂

    We are forwarding all users to the same custom “dashboard” page which we have created and keeps them in the front end. Please read my post from last night again. We want to create a button that says my profile and links them to their profile (a custom post we’ve created with their profile information).

    We’ve added two custom post types called employee and employer so that the url structure for each user matches their user role. So an employee with the name Jane Doe would have the url /employe/jane-doe and a employer named Company ABC would have the url /employer/company-abc.

    We do not want them seeing the default WP profile screen at all. I have considered using the website field that is there by default but I am not sure the client will want to do that which is why I want to know how to add a field.

    Hopefully this makes sense now.

Viewing 15 replies - 1 through 15 (of 20 total)
  • You must be logged in to reply to this topic.