You can add a new endpoint for your profile page. There's no need to manage anything with the htaccess. WordPress will do it for you.
codex: add_rewrite_endpoint
Another way (half solution) is to create a template file and load it via template_include
hook. But it will not get the user name (as it is).
add_filter( 'template_include', array($this, 'profile_page'), 99 );
function profile_page($templates){
if ( is_page( 'profile-page' ) ) {
$new_template = YOURPLUGIN_DIR .'templates/profile-page';
if ( '' != $new_template ) {
return $new_template ;
}
}
}
Create a page with permalink set to profile-page and create functions and profile page content...
EDIT:
Here a rewrite complete class for a profile user page, without the need to create a page.
class wpse242114{
public function __construct(){
add_action( 'wp_loaded', array($this,'_flush_rules') );
add_filter( 'rewrite_rules_array', array($this,'_insert_rewrite_rules') );
add_filter( 'query_vars', array($this,'_insert_query_vars') );
add_filter( 'template_include', array($this, '_get_plugin_template'), 99 );
}
public function _flush_rules() {
$rules = get_option( 'rewrite_rules' );
if ( ! isset( $rules['(profile)/(\d*)$'] ) ) {
global $wp_rewrite;
$wp_rewrite->flush_rules();
}
}
public function _insert_rewrite_rules( $rules ) {
$newrules = array();
$newrules['(profile)/(\d*)$'] = 'index.php?pagename=$matches[1]&id=$matches[2]';
return $newrules + $rules;
}
public function _insert_query_vars( $vars ) {
array_push( $vars, 'id' );
return $vars;
}
public function _get_plugin_template($template){
global $wp_query;
if ( $wp_query->query['name'] == 'profile') {
$new_template = APIKEYABLE_DIR .'includes/templates/page-login.php';
if ( '' != $new_template ) {
return $new_template ;
}
}
return $template;
}
}
The template file example:
<?php get_header(); ?>
<div class="container">
<div id="main-grid" class="row">
<div id="primary" class="content-area col-md-8">
<main id="main" class="site-main" role="main">
<?php
$userid = get_current_user_id();
$user = new WP_User($userid);
if ( $user->exists() ) {
// do something
}
</main><!-- #main -->
</div><!-- #primary -->
<?php get_sidebar(); ?>
</div><!-- .row -->