Answers:
我发现有两种方法可以做到这一点:
第一种方法更易于实现,但可能无法在所有情况下都有效(我将在稍后描述其中一种情况)。
我几天前在这里找到了此解决方案: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或用户名。
希望对您有帮助,请让我知道。
我今天早些时候发现了这个问题,并对@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 =用户<-英语
get_page_by_path('page-slug')->ID
。另外,请不要忘记使用它flush_rewrite_rules
,因此我想添加一下:add_action( 'after_switch_theme', 'flush_rewrite_rules' );
这是我基于@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;
}
}
另一种方法是使用内置了此功能的Buddypress,即使该插件具有更多可能不需要的功能。