web-dev-qa-db-ja.com

フレンドリーなパーマリンクを使ってフロントエンドユーザープロファイルを作成する方法

この形式のようなわかりやすいURLを使用して、パブリックフロントエンドのプロフィールページを作成します。

mysite.com/user/someusername

どのように私はこれを達成することができますかについての任意のアイデア?書き換え規則と関係があることはわかっていますが、どうすればよいかわかりません。あなたが私のためにリンクまたはチュートリアルを得たならば、それはすばらしいでしょう。

ありがとうございます。

23
tiltdown

私がこれを行うことを発見した2つの方法があります:

  1. カスタム書き換えルールを含む作成者ページ
  2. 書き換えルールとペアになったカスタムテンプレートファイル

1つ目は実装がより簡単ですが、すべての状況で機能するわけではありません(そのうちの1つをすぐに説明します)。

カスタム書き換え規則

私は数日前にここでこの解決策を見つけました: URL Rewriting

そして、これがコメント付きのコードです。

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

それから、あなたの心の内容に変更しながら、author.phpの組み込みテンプレートを使うことができます。

Jan Fabryがすべてを説明する優れた仕事をしているので、心から上記のリンクをチェックしてください。

クエリ変数とページテンプレート

これらの解決策を見つけながら取り組んでいたテーマでは、ユーザーメタ値(別のID)に基づいてカスタムページを提供する必要がありました。私のクライアントは、ユーザー名やユーザーIDを公開したくないので、別のレイヤーを作成しました。

唯一の問題?現時点では、Rewrite APIを使用してメタキー/値でクエリする方法は明確ではありません。幸いなことに、解決策がありました。

あなたの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;
}

そして、いつ、どのようにして新しいクエリvarを処理するかがわかるように、新しいrewriteタグとルールを作成する必要があります。

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

これが終わったら、クエリ変数が提供されていることを「キャッチ」してから、選択したテンプレートにリダイレクトするだけです。

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

User-profile.phpを作成したことを確認してください。

私の例では、$ wpdb-> usermetaテーブルを介して "public User ID"を実際のuser_idに一致させる3番目の関数を作成し、その情報をテンプレートに渡しました。

他のテーマとは異なるテンプレートを作成する必要がある場合は、get_headerを使用して名前を指定できます。

get_header( 'user' );

これはheader-user.phpファイルを呼び出します。

結論

どちらも有効で実用的なソリューションです。他の人がプロファイルを閲覧できるようになるならば、それはユーザーIDまたはユーザー名を明らかにしないので、2番目は「セキュリティ」の別の層を提供します。

それが役立つことを願って、あなたが質問をするかどうか私に知らせてください。

15
bybloggers

私は今日これを発見し、template_redirectを使用する代わりに静的ページを表示するようにリクエストを変更するという違いで@bybloggersのコードにいくつかの修正を加えました。ページ。

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();

スペイン語 - > usuario = user < - 英語

2
Poxtron

これは@bybloggersの回答に基づいた私の作業コードです(ちなみにありがとう)私は、template_redirectフックを使用してphpを終了するべきではないことを学びました。

説明はここにあります: https://markjaquith.wordpress.com/2014/02/19/template_redirect-is-not-for-loading-templates/

ですから、template_includeフックを使うべきです。このフックでは、リダイレクトおよび終了メソッドを使用する必要はありません。

もう1つの違いは、/ useridなしでwww.server.com/myaccountが必要だったことです。

これはコードです:

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

もう1つの方法は、プラグインがそれほど興味を引かないかもしれないさらに多くの機能を持っていても、このビルトインを持っているBuddypressを使うことです。

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

0
Jens Wedin