这已经解决了,感谢用户'臭',请看下面的原始问题和我的观察 - 滚动到选定的答案没有任何意义
原始问题
为wordpress编写自定义帖子类型插件,我严重陷入困境。
我现在所有的工作都应该在管理员方面,但在前端我只能获得像/ type / title这样的页面来呈现。
我真正想要的是通过/ type / author / AUTHORNAME等网址与特定作者关联的帖子列表(例如/ games / author / myuser)。
我已经设置了重写规则:
public static function rewrite_rules(&$wpr) {
$key = self::$postType.'/author/(.+)';
$rewrite = 'index.php?author=$matches[1]&post_type=$matches[2]';
$newRules = Array($key => $rewrite);
$wpr->rules = $newRules + $wpr->rules;
//echo "<pre>"; print_r($wpr->rules);
//flush_rewrite_rules();
}
add_filter('generate_rewrite_rules', array(get_class(), 'rewrite_rules'));
(其余课程未显示)
我认为这就像添加到template_include过滤器一样简单。
如果您尝试访问/输入/ author / AUTHORNAME,WP会将您置于archive.php
public static function template_include($path) {
if (get_post_type() == self::$postType) {
if (is_single()) {
if ($theme_file = locate_template(array('single-gamesdb.php'))) {
$path = $theme_file;
} else {
$path = RGPDB_ROOT.'/templates/single-gamesdb.php';
}
} elseif (is_author()) {
echo "!!!"; exit;
if ($theme_file = locate_template(array('author-gamesdb.php'))) {
$path = $theme_file;
} else {
$path = RGPDB_ROOT.'/templates/author-gamesdb.php';
}
} elseif (is_archive()) {
$path = RGPDB_ROOT.'/templates/author-gamesdb.php';
}
} else {
if (is_archive()) {
$type = get_query_var('post_type');
echo "!!!! $type";
}
}
//echo $path;
return $path;
}
template_include的第一位工作 - / games / some-game-title访问single-gamesdb.php并渲染得很好。
WP会到达if(is_archive()){...}的下半部分,但我现在无法从查询字符串中找出我的帖子类型。检查query_vars过滤器显示post_type =和author =完全有效,但是,这被识别为存档页面而不是作者。
我错过了关于设置自定义帖子类型的内容,因为我认为您可以直接将作者页面附加到他们身上。
解决方案
我发现我没有完全正确配置register_post_types()调用,我建议使用stink提供较低版本的链接来帮助构建PHP以帮助您前进,但是,有一对of gotcha's。
如果您想要一个自定义固定链接,我只为给定用户显示自定义帖子类型的帖子,并且您希望按照正确的模式隔离设计,那么您需要执行2个额外步骤:
1)您仍然需要添加一个相当简单的自定义重写:
function my_rewrite_rules(&$wpr) {
$key = 'mypostype/author/([a-zA-Z0-9]+)';
$rewrite = 'index.php?post_type=myposttype&author_name=$matches[1]';
$newRules = Array($key => $rewrite);
$wpr->rules = $newRules + $wpr->rules;
}
add_filter('generate_rewrite_rules', 'my_rewrite_rules);
上面的 $wpr
只是缩短了$wp_rewrite
,但请记住它是通过引用传递的,所以你需要&amp;在开头
2)如果您只想破解主题的author.php文件以添加您的自定义设计,那么post_type
已经是author_name
已注册的变量 - 您只需添加那里有一些逻辑。如果你想要一个像我需要的完全独立的页面,原因有几个,那么你需要加入template_include
钩子。
function my_template_include($path) {
if (get_post_type() == 'myposttype') {
if (is_author()) {
if ($theme_file = locate_template(array('author-myposttype.php','author.php'))) {
$path = $theme_file;
} else {
$path = plugin_dir_path(__FILE__).'/templates/author-gamesdb.php';
}
}
}
}
add_filter('template_include', 'my_template_include');
locate_template()调用将搜索标准层次结构中的子主题,主题等,以尝试在数组中找到其中一个文件(例如author-myposttype.php和author.php)。
The Gotcha
如果您没有为用户分配任何帖子,您想要获取作者页面,您将无法看到您的自定义作者页面或基本作者页面,您将出于某种原因,最终进入archive.php
例如:http://mywebsite.com/myposttype/author/someauthorname
为此自定义帖子类型分配给作者'someauthorname'的帖子会让您进入author-myposttype.php或author.php,但如果您没有该人撰写的帖子,您将不会在那里结束。
请记住,在重写中设置已知变量时,将使用大多数参数自动为您创建WP_Query对象,您只需执行标准循环
if (have_posts()) {
while (have_posts()) {
the_post();
..... your display code ....
}
}
我不喜欢WP默认使用冒号和endwhile / endif
的短语法答案 0 :(得分:1)
您需要的是is author
Conditional Tag.
此条件标记检查是否正在显示作者存档页面。这是一个布尔函数,意味着它返回TRUE或FALSE。
将条件添加到single.php。如果您愿意,可以在同一个文件中添加另一个循环,或者如果满足条件,请切换到 custom-single.php
编辑: 这是great site生成自定义帖子类型的代码。