谢谢!
#1 楼
我发现有两种方法可以执行此操作:具有自定义重写规则的作者页面
与重写规则配对的自定义模板文件
第一个更易于实现,但可能无法在所有情况下都有效(我将在稍后描述)。前几天在这里:URL重写
这是带有注释的代码: php模板,修改您的内心内容。
此致,请检查上面列出的链接,因为Jan Fabry出色地解释了所有内容。 />
对于我在发现这些解决方案时正在研究的主题,我需要根据用户元值(一个单独的ID)提供一个自定义页面。我的客户不希望用户名或用户ID公开可见,因此我们创建了一个单独的层。
唯一的问题?目前,尚没有明确的方法来使用Rewrite API来按元键/值进行查询。幸运的是,有一个解决方案。
在functions.php文件中...
// 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;
}
然后,您需要创建一个新的重写标记和规则,以便它知道何时以及如何处理新查询变量。
// 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'
);
只需确保您已创建user-profile.php。
在我自己的示例中,我创建了第三个函数,该函数通过$ wpdb-> usermeta表将“公共用户ID”与实际的user_id匹配,并将信息传递给模板。 >
如果需要创建与主题其余部分不同的模板,请记住,使用get_header可以指定名称:
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;
}
}
调用header-user.php文件。
结论
两者都是有效的有效解决方案。第二个提供单独的“安全性”层,因为如果其他人将能够浏览配置文件,它不会显示用户ID或用户名。
希望有帮助,如果您有任何疑问,请告诉我。
#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 =用户<-英文
评论
非常好!感谢您的分享。我想使其更具动态性,您可以使用get_page_by_path('page-slug')-> ID切换ID。同样不要忘记使用flush_rewrite_rules,所以我要添加:add_action('after_switch_theme','flush_rewrite_rules');
– Leo Caseiro
16年8月28日在7:12
#3 楼
这是我基于@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;
}
}
评论
我实际上使用Query_var方法解决了它。谢谢!
–倾斜
2012年7月18日,0:36
@bybloggers我知道这篇文章有点老了,但是很好奇您是否可以共享将URL中的用户名传递给模板的第三个功能?
–帕特
13年3月17日在3:22
@Pat目前尚不确定实际功能在我所有代码中的位置(就像您之前说的那样),但是格式将非常接近wpleet_rewrite_catch()函数。我没有测试array_key_exists('user'),而是测试了公共用户ID,然后在wp_usermeta表上进行搜索以查看哪个用户具有与其关联的公共ID。希望该算法有所帮助,即使代码不可用。
–博客作者
13年4月3日在23:34