Comment créer un profil d'utilisateur frontal avec un permalien amical

21

Je souhaite créer une page de profil front-end publique avec une URL conviviale telle que celle-ci.

mysite.com/user/someusername

Toute idée sur comment puis-je atteindre cet objectif? Je sais que cela a quelque chose à voir avec la règle de réécriture, mais je ne sais pas comment je peux le faire. Si vous avez un lien ou un tutoriel pour moi, ce sera génial.

Merci!

    
posée tiltdown 16.07.2012 - 17:47
la source

4 réponses

14

J'ai découvert cela de deux manières:

  1. Page auteur avec une règle de réécriture personnalisée
  2. Un fichier de modèle personnalisé associé à une règle de réécriture

Le premier est plus simple à mettre en œuvre, mais risque de ne pas fonctionner dans toutes les circonstances (une que je décrirai bientôt).

Règle de réécriture personnalisée

J'ai trouvé cette solution il y a quelques jours ici: Réécriture d'URL

Et voici le code, avec les commentaires:

// Define the author levels you want to use
$custom_author_levels = array( 'user', 'leader' );

// On init, add a new author_level rewrite tag and add it to the author_base property of wp_rewrite
add_action( 'init', 'wpleet_init' );
function wpleet_init()
{
    global $wp_rewrite;
    $author_levels = $GLOBALS['custom_author_levels'];

    // Define the tag and use it in the rewrite rule
    add_rewrite_tag( '%author_level%', '(' . implode( '|', $author_levels ) . ')' );
    $wp_rewrite->author_base = '%author_level%';

}

// The previous function creates extra author_name rewrite rules that are unnecessary.  
//This function tests for and removes them

add_filter( 'author_rewrite_rules', 'wpleet_author_rewrite_rules' );
function wpleet_author_rewrite_rules( $author_rewrite_rules )
{
    foreach ( $author_rewrite_rules as $pattern => $substitution ) {
        if ( FALSE === strpos( $substitution, 'author_name' ) ) {
            unset( $author_rewrite_rules[$pattern] );
        }
    }
    return $author_rewrite_rules;
}

Vous pouvez ensuite utiliser le modèle author.php intégré, en modifiant le contenu de votre coeur.

Cordialement, vérifiez le lien ci-dessus, car Jan Fabry fait un excellent travail pour tout expliquer.

Vars et modèles de page de requête

Pour le thème sur lequel je travaillais lors de la découverte de ces solutions, je devais proposer une page personnalisée basée sur une méta-valeur utilisateur (un identifiant distinct). Mon client ne souhaitait pas que le nom d'utilisateur ou l'ID utilisateur soit visible publiquement. Nous avons donc créé un calque séparé.

Le seul problème? À l’heure actuelle, il n’existe pas de solution claire pour utiliser l’API Rewrite dans les requêtes par méta clés / valeurs. Heureusement, il y avait une solution.

Dans votre fichier functions.php ...

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

Ensuite, vous devez créer une nouvelle balise et règle de réécriture afin qu’elle sache quand et comment gérer la nouvelle requête var.

add_rewrite_tag( '%user%', '([^&]+)' );
add_rewrite_rule(
    '^user/([^/]*)/?',
    'index.php?user=$matches[1]',
    'top'
);

Une fois que vous avez terminé, vous devez simplement "intercepter" lorsque la requête var est servie, puis rediriger vers le modèle de votre choix:

add_action( 'template_redirect', 'wpleet_rewrite_catch' );
function wpleet_rewrite_catch()
{
    global $wp_query;

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

Assurez-vous simplement que vous avez créé le fichier user-profile.php.

Dans mon propre exemple, j'ai créé une troisième fonction qui associe "l'ID utilisateur public" à l'ID utilisateur actuel via la table $ wpdb- > usermeta, puis a transmis les informations au modèle.

Si vous devez créer un modèle différent du reste de votre thème, n’oubliez pas qu’avec get_header, vous pouvez spécifier un nom:

get_header( 'user' );

Qui appellera le fichier header-user.php.

Conclusion

Ces deux solutions constituent des solutions valables et efficaces. La seconde offre une couche distincte de «sécurité», car elle ne révèle pas les identifiants d’utilisateur ou les noms d’utilisateur, si d’autres personnes pourront parcourir les profils.

J'espère que cela vous aidera, faites-le moi savoir si vous avez des questions.

    
réponse donnée bybloggers 17.07.2012 - 20:07
la source
2

J'ai trouvé cela plus tôt aujourd'hui et apporté quelques modifications au code de @bybloggers avec la différence qu'au lieu d'utiliser template_redirect, je modifie la demande pour afficher une page statique, ce qui signifie que vous pouvez maintenant ajouter ce que vous voulez à un modèle de page et l'utiliser. sur cette page.

class ProfilePage {
function __construct() {
    add_filter( 'init',array($this,'rw_init'));
    add_filter( 'query_vars', array($this,'wpleet_rewrite_add_var') );
    add_filter( 'request', array($this,'change_requests'));
}
function wpleet_rewrite_add_var( $vars ) {
    $vars[] = 'usuario';
    return $vars;
}
function rw_init(){
    add_rewrite_tag( '%usuario%', '([^&]+)' );
    add_rewrite_rule(
        '^usuario/([^/]*)/?',
        'index.php?usuario=$matches[1]',
        'top'
    );
}
function change_requests($query_vars) {
    //go to a specific page when the usuario key is set
    $query_vars['page_id'] = isset($query_vars['usuario']) ? 7581 : $query_vars['page_id'];
    return $query_vars;
}
}
new ProfilePage();

espagnol - > usuario = utilisateur < - anglais

    
réponse donnée Poxtron 14.03.2013 - 01:33
la source
1

Ceci est mon code de travail basé sur la réponse de @bybloggers (merci au fait) Je viens d'apprendre que nous ne devrions pas utiliser template_redirect hook, puis quitter php, car certaines choses peuvent cesser de fonctionner en raison de l'interruption brutale de l'exécution du code php.

L'explication est ici: enlace

Nous devrions donc utiliser le hook template_include. Avec ce hook, il n’est pas nécessaire d’utiliser les méthodes redirect et exit.

Et l’autre différence, c’est que j’avais juste besoin de www.server.com/myaccount sans le / userid.

Ceci est le code:

add_filter( 'query_vars', 'wp58683_userprofile_var' );
function wp58683_userprofile_var( $vars )
{
    $vars[] = 'myprofile';
    return $vars;
}

add_rewrite_tag( '%myprofile%', '([^&]+)' );

add_rewrite_rule(
    '^myprofile/?',
    'index.php?myprofile',
    'top'
);

add_action( 'template_include', 'wp58683_userprofile_page' );
function wp58683_userprofile_page($original_template)
{
    global $wp_query;

    if ( array_key_exists( 'myprofile', $wp_query->query_vars ) ) {
        if (is_user_logged_in() ){ 
            return TEMPLATEPATH . '/user-profile.php';
        }
    }
    else {
        return $original_template;
    }

}
    
réponse donnée Carlos B 08.09.2015 - 09:57
la source
0

Une autre solution consiste à utiliser Buddypress doté de cette fonctionnalité même si le plug-in présente encore plus de fonctionnalités qui peuvent ne pas être intéressantes.

enlace

    
réponse donnée Jens Wedin 17.07.2012 - 22:16
la source

Lire d'autres questions sur les étiquettes