web-dev-qa-db-fra.com

Lien de redirection de menu sur le nom d'utilisateur ou l'ID utilisateur

Je construis un portail client où mes clients peuvent se connecter et voir tous leurs projets en attente, leurs projets terminés et créer de nouveaux projets.

Bien que je sois bloqué au début.

Le menu déroulant s'appelle "Mes projets"
Si "L'utilisateur 1" est connecté et qu'il clique sur "Mes projets", il me faut ce lien pour se connecter à
mysite.com/client-portal/my-projects/(USERID or USERNAME)/

Ce sera leur page dédiée, donc si le nom d'utilisateur de l'utilisateur 1 est johndoe, le lien sera my-projects/johndoe/

Si l'utilisateur 2 (janedoe) est connecté. Lorsqu'il clique sur "Mes projets", il sera pris my-projects/janedoe/ et ainsi de suite, donc quatrième.

Donc, fondamentalement, j'ai besoin d'un permalien %username% que je peux mettre dans un lien de menu personnalisé qui changera %username% avec le nom d'utilisateur de l'utilisateur actuellement connecté.

Cela peut-il être fait?

3
Casey

Je pense que vous pouvez rendre cela beaucoup plus facile que vous l'êtes. Créez simplement une page my-projects et oubliez la réécriture personnalisée. Pourquoi? Parce qu'un utilisateur n'aura besoin que de voir ses propres projets. Pas besoin de juste réécrire car vous pouvez obtenir l'utilisateur actuel à tout moment .

Intégrez le rendu du projet dans un shortcode et insérez-le simplement dans la page de votre choix.

add_action('init', 'wpse105306_add_shortcode');
function wpse105306_add_shortcode()
{
    add_shortcode('wpse105306_projects', 'wpse105306_projects');
}

function wpse105306_projects()
{
    $user = wp_get_current_user();

    $projects = wpse105306_get_projects_somehow($user);

    // do stuff with $projects
}

function wpse105306_get_projects_somehow($user)
{
    // whatever you need here
}

Cela dit, si vous vraiment voulez cette URL, vous devrez faire une réécriture personnalisée .

// make the rewrite work
add_action('init', 'wpse105306_add_rewrite');
function wpse105306_add_rewrite()
{
    add_rewrite_rule(
        '^client-portal/my-projects/([^/]+)/?$',
        'index.php?wpse105306_portal=$matches[1]',
        'top'
    );
}

// make sure WordPress doesn't eat the wpse105306_portal query var
add_filter('query_vars', 'wpse105306_add_var');
function wpse105306_add_var($vars)
{
    $vars[] = 'wpse105306_portal';
    return $vars
}

Puis accrochez-vous quelque part tard (par exemple, template_redirect) et si vous avez la requête var pour le portail, restituez les projets clients.

add_action('template_redirect', 'wpse105306_catch_portal');
function wpse105306_catch_portal()
{
    $username = get_query_var('wpse105306_portal');
    if (!$username) {
        return; // things go on as normal
    }

    $projects = wpse105306_get_projects_somehow($username);

    // do stuff with $projects
}

function wpse105306_get_projects_somehow($username)
{
    // whatever you need here
}

Vous pourriez aussi être capable de faire quelque chose avec add_rewrite_tag . Une réécriture personnalisée signifiera que vous devez effectuer d'autres tâches pour que cela fonctionne dans les menus. L’approche shortcode ci-dessus signifie que vous pouvez utiliser le système de menus normalement.

1
chrisguitarguy

WordPress a une fonction intégrée pour obtenir l'utilisateur actuel:

<?php wp_get_current_user(); ?>

Mon approche serait alors de créer une variable telle que:

<?php $userid = wp_get_current_user(); ?>

Ensuite, dans votre code HTML, faites simplement ceci <a href =userportal?<?php echo $userid ?> >menu <\a>

Ensuite, utilisez simplement la variable php GET pour obtenir l’identifiant de l’utilisateur à partir de l’URL. Vous pouvez l’utiliser pour obtenir les détails dont vous avez besoin sur l’utilisateur.

Ainsi, au lieu de créer une nouvelle page pour chaque utilisateur, vous pouvez utiliser AJAX et demander le portefeuille de tout utilisateur en fonction de son ID. Beaucoup plus facile et plus évolutif à long terme.

0
richbai90