如何创建具有友好永久链接的前端用户配置文件

时间:2012-07-16 作者:tiltdown

我想创建一个公共前端配置文件页面,该页面具有如下格式的友好url。

mysite.com/user/someusername
你知道我该如何做到这一点吗?我知道这和重写规则有关,但我不知道该怎么做。如果你有任何链接或教程为我,这将是伟大的。

谢谢

4 个回复
最合适的回答,由SO网友:bybloggers 整理而成

我发现有两种方法可以做到这一点:

具有自定义重写规则的作者页面自定义模板文件与重写规则配对第一个更容易实现,但可能无法在所有情况下都工作(我将很快介绍其中一个)。

自定义重写规则几天前我在这里找到了此解决方案: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;
}
然后可以使用内置的作者。php模板,修改您的心形内容。

诚恳地,检查上面列出的链接,因为简·法布里在解释一切方面做得很好。

查询变量和页面模板对于我在发现这些解决方案时正在处理的主题,我需要基于用户元值(一个单独的ID)提供一个自定义页面。我的客户不希望用户名或用户ID公开可见,因此我们创建了一个单独的层。

唯一的问题是什么?目前,还没有一种明确的方法可以使用重写API通过元键/值进行查询。幸运的是,有一个解决方案。

在您的功能中。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;
}
然后,您需要创建一个新的重写标记和规则,以便它知道何时以及如何处理新的查询变量。

add_rewrite_tag( \'%user%\', \'([^&]+)\' );
add_rewrite_rule(
    \'^user/([^/]*)/?\',
    \'index.php?user=$matches[1]\',
    \'top\'
);
完成此操作后,只需在提供查询var时“捕获”,然后重定向到您选择的模板:

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;
    }
}
只需确保您已经创建了用户配置文件。php。

在我自己的示例中,我创建了第三个函数,该函数通过$wpdb->usermeta表将“public User ID”与实际的User\\u ID相匹配,并将信息传递给模板。

如果需要创建不同于主题其余部分的模板,请记住,使用get\\u header可以指定名称:

get_header( \'user\' );
将调用标头用户。php文件。

结论这两种方法都是有效的有效解决方案。第二层提供了单独的“安全”层,因为如果其他人能够浏览配置文件,它不会显示用户ID或用户名。

希望这有帮助,如果你有任何问题,请告诉我。

SO网友:Miguel

我今天早些时候发现了这一点,并对@bybloggers代码进行了一些修改,不同之处在于,我没有使用template\\u redirect,而是将请求更改为显示静态页面,这意味着您现在可以向页面模板添加任何您喜欢的内容,并在该页面上使用它。

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();
西班牙语->Usario=用户<;-英语

SO网友:Carlos B

这是我基于@bybloggers答案的工作代码(顺便说一句,谢谢)。我刚刚了解到,我们不应该使用template\\u redirect hook然后退出php,因为有些事情可能会因为php执行代码的突然中断而停止工作。

解释如下:https://markjaquith.wordpress.com/2014/02/19/template_redirect-is-not-for-loading-templates/

因此,我们应该使用template\\u include挂钩。有了这个钩子,就不需要使用重定向和退出方法。

另一个区别是,我只需要www.server。com/myaccount,无/userid。

代码如下:

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

}

SO网友:Jens Wedin

另一种方法是使用Buddypress,它内置了这个插件,即使插件有更多可能不感兴趣的功能。

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

结束

相关推荐