Creating a custom public user page

The question:

I’d like to develop a plugin that allows me to have custom user pages. I really like the way the author archive template handles the URL: /author/username. I don’t want to rewrite the author_base as I’d like to keep that functionality in place untouched.

I’d like to replicate that clean URL layout in my plugin, so that when a user goes to /users/username it will go to my custom template. I’d like to know if anyone has examples of how to properly parse the username from the URL so that I can lookup the user’s data from the plugin and display my template.

The Solutions:

Below are the methods you can try. The first solution is probably the best. Try others if the first one doesn’t work. Senior developers aren’t just copying/pasting – they read the methods carefully & apply them wisely to each case.

Method 1

I found the answer to this from @bybloggers answer found here. https://wordpress.stackexchange.com/a/58793/12920

I modified his code very slightly to tailor it to my needs, but this is the code that worked for me and was exactly what I was looking for:

// Create the query var so that WP catches the custom /member/username url
function userpage_rewrite_add_var( $vars ) {
    $vars[] = 'member';
    return $vars;
}
add_filter( 'query_vars', 'userpage_rewrite_add_var' );

// Create the rewrites
function userpage_rewrite_rule() {
    add_rewrite_tag( '%member%', '([^&]+)' );
    add_rewrite_rule(
        '^member/([^/]*)/?',
        'index.php?member=$matches[1]',
        'top'
    );
}
add_action('init','userpage_rewrite_rule');

// Catch the URL and redirect it to a template file
function userpage_rewrite_catch() {
    global $wp_query;

    if ( array_key_exists( 'member', $wp_query->query_vars ) ) {
        include (TEMPLATEPATH . '/user-profile.php');
        exit;
    }
}
add_action( 'template_redirect', 'userpage_rewrite_catch' );

After this was in my functions.php file, I had to re-save my Permalinks.

Sometimes re-saving the permalinks didn’t finish the job 100% and browsing to www.mysite.com/member/username would 404, so I had to manually flush the rules by putting this into my functions.php and loading my site once. Then removing it so I don’t run it every time the site loads, since that’s unnecessary overhead.

// Code needed to finish the member page setup
function memberpage_rewrite() {
     global $wp_rewrite;
     $wp_rewrite->flush_rules();
}
add_action('init','memberpage_rewrite');


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

Leave a Comment