web-dev-qa-db-fra.com

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

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 y parvenir? 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!

23
tiltdown

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 peut 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 des 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.

Sincèrement, vérifiez le lien ci-dessus, Jan Fabry faisant un excellent travail pour tout expliquer.

Requête Vars et modèles de page

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;
}

Et 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.

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

Une fois que vous avez fait cela, vous devez simplement "attraper" lorsque la requête est en train d'être 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éé user-profile.php.

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

Si vous avez besoin de 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' );

Ce qui appellera le fichier header-user.php.

Conclusion

Les deux sont 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.

15
bybloggers

J'ai trouvé cela plus tôt aujourd'hui et apporté quelques modifications au code @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 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

2
Poxtron

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 ne plus fonctionner du fait de l'interruption brutale du code d'exécution php.

L'explication est la suivante: https://markjaquith.wordpress.com/2014/02/19/template_redirect-is-not-for-loading-templates/

Nous devrions donc utiliser le hook template_include. Avec ce point d'ancrage, il n'est pas nécessaire d'utiliser les méthodes de redirection et de sortie.

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

C'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;
    }

}
1
Carlos B

Une autre méthode consiste à utiliser Buddypress qui intègre cette fonctionnalité même si le plug-in présente davantage de fonctionnalités qui peuvent ne pas être intéressantes.

http://wordpress.org/extend/plugins/buddypress/

0
Jens Wedin