这已经解决了,感谢用户“臭”,请参阅下面的原始问题和我的观察 - 滚动过去选择的答案没有任何意义
原始问题
为 wordpress 编写自定义帖子类型插件,我严重卡在这里。
我现在已经在管理端正常工作了,但是在前端我只能得到像 /type/title 这样的页面来呈现。
我真正想要的是通过 /type/author/AUTHORNAME(例如 /games/author/myuser)之类的 url 与特定作者关联的帖子列表。
我已经设置了一个重写规则:
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 过滤器一样简单。
如果您尝试访问 /type/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 以帮助您继续前进,但是,有几个陷阱。
如果您想要一个我所做的自定义永久链接,它仅针对给定用户显示来自您的自定义帖子类型的帖子,并且您希望按照正确的模式隔离设计,那么您需要执行 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
,但请记住它是通过引用传递的,所以你需要 & 在开头
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)。
陷阱
如果您没有将任何帖子分配给您想要获得作者页面的用户,则不会显示您的自定义作者页面或基本页面,由于某种原因,您最终会出现在 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 的短语法