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


23

Je veux créer une page de profil front-end publique avec une URL conviviale comme ce format.

mysite.com/user/someusername

Une 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 n'ai aucune idée de comment je peux le faire. Si vous avez un lien ou un tutoriel pour moi, ce sera génial.

Merci!

Réponses:


15

J'ai découvert deux façons de faire cela:

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

La première est plus simple à implémenter, mais peut ne pas fonctionner dans toutes les circonstances (dont 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 cœur.

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

Requête Vars et modèles de page

Pour le thème sur lequel je travaillais en découvrant ces solutions, j'avais besoin de servir une page personnalisée basée sur une méta-valeur utilisateur (un ID distinct). Mon client ne voulait pas que le nom d'utilisateur ou l'ID utilisateur soit visible publiquement, nous avons donc créé une couche distincte.

Le seul problème? Pour le moment, il n'y a pas de moyen clair d'utiliser l'API de réécriture pour interroger 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 puis, vous devez créer une nouvelle balise de réécriture et une règle pour qu'il sache quand et comment gérer la nouvelle var de requête.

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

Une fois que vous avez fait cela, il vous suffit de "capturer" lorsque la requête var est servie, puis de 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 d'avoir créé user-profile.php.

Dans mon propre exemple, j'ai créé une troisième fonction qui faisait correspondre "l'ID utilisateur public" à l'identifiant utilisateur réel via la table $ wpdb-> usermeta, et 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 sont valables et fonctionnelles. 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-moi savoir si vous avez des questions.


Je l'ai en fait résolu en utilisant la méthode Query_var. Merci!
tiltdown

1
@bybloggers Je sais que ce message est un peu ancien, mais je serais curieux de savoir si vous pouviez partager votre troisième fonction pour passer le nom d'utilisateur dans l'URL au modèle?
Pat

@Pat Je ne sais pas où se trouve la fonction réelle dans tout mon code pour le moment (comme vous l'avez dit, c'était il y a un certain temps), mais le format suivrait de très près la fonction wpleet_rewrite_catch (). Au lieu de array_key_exists ('user'), je testais l'ID utilisateur public, puis je faisais une recherche sur la table wp_usermeta pour voir à quel utilisateur cet ID public était associé. J'espère que l'algorithme aide, même si le code n'est pas disponible.
bybloggers

2

J'ai trouvé cela plus tôt aujourd'hui et j'ai apporté quelques modifications au code @bybloggers avec la différence qu'au lieu d'utiliser template_redirect, je change la demande pour afficher une page statique, ce qui signifie que vous pouvez maintenant ajouter tout ce que vous aimez à un modèle de page et l'utiliser sur celui-ci. 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


Très agréable! Merci de partager ça. Je voudrais rendre plus dynamique et vous pouvez changer l'identifiant avec get_page_by_path('page-slug')->ID. N'oubliez pas non plus l'utilisation flush_rewrite_rules, j'ajouterais donc:add_action( 'after_switch_theme', 'flush_rewrite_rules' );
Leo Caseiro

1

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

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

Donc, nous devrions utiliser le hook template_include. Avec ce crochet, il n'est pas nécessaire d'utiliser la méthode de redirection et de sortie.

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

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

}

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.