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


23

我想用这种格式的友好网址创建一个公共的前端配置文件页面。

mysite.com/user/someusername

关于如何实现这一点的任何想法?我知道它与重写规则有关,但是我不知道该怎么做。如果您有任何链接或教程对我来说太好了。

谢谢!

Answers:


15

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

  1. 具有自定义重写规则的作者页面
  2. 自定义模板文件与重写规则配对

第一种方法更易于实现,但可能无法在所有情况下都有效(我将在稍后描述其中一种情况)。

自定义重写规则

我几天前在这里找到了此解决方案:URL重写

这是带有注释的代码:

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

然后,您需要创建一个新的重写标记和规则,以便它知道何时以及如何处理新的查询变量。

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

只要确保您已创建user-profile.php。

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

如果您需要创建一个与主题其余部分不同的模板,请记住,使用get_header可以指定一个名称:

get_header( 'user' );

它将调用header-user.php文件。

结论

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

希望对您有帮助,请让我知道。


我实际上使用Query_var方法解决了它。谢谢!
倾斜

1
@bybloggers我知道这篇文章有点老了,但是很好奇您是否可以共享将URL中的用户名传递给模板的第三个功能?
2013年

@Pat目前尚不确定实际函数在我所有代码中的位置(就像您之前说的那样),但是格式将非常接近wpleet_rewrite_catch()函数。我没有测试array_key_exists('user'),而是测试了公共用户ID,然后在wp_usermeta表上进行搜索以查看哪个用户具有与之关联的公共ID。希望该算法有所帮助,即使代码不可用。
bybloggers 2013年

2

我今天早些时候发现了这个问题,并对@bybloggers代码进行了一些修改,不同之处是我不使用template_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();

西班牙语-> usuario =用户<-英语


非常好!感谢您的分享。我想使其更具动态性,您可以使用切换ID get_page_by_path('page-slug')->ID。另外,请不要忘记使用它flush_rewrite_rules,因此我想添加一下:add_action( 'after_switch_theme', 'flush_rewrite_rules' );
Leo Caseiro,

1

这是我基于@bybloggers答案的工作代码(顺便说一句),我只是得知我们不应该使用template_redirect钩子然后退出php,因为某些事情可能会由于php执行代码的突然中断而停止工作。

解释在这里:https//markjaquith.wordpress.com/2014/02/19/template_redirect-is-not-for-loading-templates/

因此,我们应该使用template_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;
    }

}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.