web-dev-qa-db-ja.com

ユーザー名またはユーザーIDに基づくメニューリンクのリダイレクト

私は、クライアントがログインして、保留中のすべてのプロジェクト、完了したプロジェクト、および新しいプロジェクトを作成できるクライアントポータルを構築しています。

私は最初から立ち往生していますが。

ドロップダウンメニューは "私のプロジェクト"と呼ばれています
"User 1"がログインしていて、彼らが "My Projects"をクリックしたら、そのリンクが必要です。
mysite.com/client-portal/my-projects/(USERID or USERNAME)/

これは彼らの専用ページになるので、ユーザー1のユーザー名がjohndoeの場合、リンクはmy-projects/johndoe/になります。

ユーザー2(janedoe)がログインしている場合、彼らが "My Projects"をクリックすると、my-projects/janedoe/というようになります。

そのため、基本的には、現在ログインしているユーザーのユーザー名に合わせて%username%を変更するカスタムメニューリンクを作成できる%username%パーマリンクが必要です。

これはできますか?

3
Casey

私はあなたがこれをあなたよりはるかに簡単にすることができると思います。 my-projectsページを作成し、カスタム書き換えを忘れてください。どうして?ユーザーは自分のプロジェクトを見るだけでよいからです。 現在のユーザーをいつでも入手できるので/ /だけ書き換える必要はありません

プロジェクトのレンダリングをショートコードに埋め込んで、それを好きなページにポップするだけです。

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
}

とは言っても、本当ににそのURLが欲しいのなら、 カスタム書き換えをする必要があります

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

それからどこかに遅くフックして(例えばtemplate_redirect)、ポータルのためのクエリ変数があれば、顧客のプロジェクトをレンダリングします。

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
}

add_rewrite_tag で何かできることもあるかもしれません。カスタム書き換えはそれがメニューで動作するようにするために他の何かをしなければならないことを意味するでしょう。上記のショートコードアプローチは、通常どおりメニューシステムを使用できることを意味します。

1
chrisguitarguy

WordPressには、現在のユーザーを取得するための組み込み関数があります。

<?php wp_get_current_user(); ?>

私のアプローチはそれから次のような変数を作成することです。

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

それならあなたのHTMLの中でちょうど<a href =userportal?<?php echo $userid ?> >menu <\a>をしてください。

次に、URLからユーザーIDを取得するためにphp GET変数を使用するだけで、ユーザーについて必要な詳細を取得するためにそれを使用できます。

そのようにして、すべてのユーザー用に新しいページを作成する代わりに、AJAXを使用して、IDに基づいて任意のユーザーのポートフォリオを要求できます。長期的にははるかに簡単でよりスケーラブルです。

0
richbai90