问题描述

我想创建一个公共的 front-end 个人资料页面与友好的网址像这样的格式。

mysite.com/user/someusername

任何想法如何才能实现这一点?我知道它与重写规则有关,但我不知道如何做到这一点。如果你有任何关于我的链接或教程,那将是伟大的。

谢谢!

最佳解决方案

有两种方法我发现这样做:

  1. 作者页面具有自定义重写规则

  2. 与重写规则配对的自定义模板文件

第一个更简单的实现,但可能无法在所有情况下工作 (其中一个我将很快描述) 。

自定义重写规则

前几天我发现这个解决方案: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 做了很好的工作来解释一切。

查询 Vars 和页面模板

对于我正在发现这些解决方案的主题,我需要根据用户元值 (单独的 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 。

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

一旦你这样做,你只需要”catch” 当查询 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 表创建了一个与 「public User ID」 匹配的第三个函数,并将其传递给模板。

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

get_header( 'user' );

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

Conclusion

这两个都是有效的工作解决方案。第二个提供单独的”security” 层,因为它不会显示用户 ID 或用户名,如果其他人可以浏览配置文件。

希望有帮助,让我知道如果你有任何问题。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。