如何创建author-custom_type.php并重写规则?

如何创建author-custom_type.php并重写规则?,php,wordpress,custom-post-type,author,Php,Wordpress,Custom Post Type,Author,这一问题已经解决,多亏了用户“臭味”,请参见下面的原始问题和我的观察结果-滚动到所选答案没有任何意义 原始问题 正在为wordpress编写一个自定义的帖子类型插件,我真的被困在这里了 我现在在管理端一切正常,但是在前端我只能得到像/type/title这样的页面来呈现 我真正想要的是通过像/type/author/AUTHORNAME这样的url(例如/games/author/myuser)与特定作者关联的帖子列表 我已设置重写规则: public static function rewri

这一问题已经解决,多亏了用户“臭味”,请参见下面的原始问题和我的观察结果-滚动到所选答案没有任何意义

原始问题

正在为wordpress编写一个自定义的帖子类型插件,我真的被困在这里了

我现在在管理端一切正常,但是在前端我只能得到像/type/title这样的页面来呈现

我真正想要的是通过像/type/author/AUTHORNAME这样的url(例如/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'));
模板_include works-/games/some game title的第一位访问single-gamesdb.php并呈现良好效果

WP将进入下一部分,其中if(is_archive()){…}是独立的,但我现在无法从查询字符串中找出我的帖子类型。检查query_vars过滤器显示post_type=和author=完全有效,但是,这被识别为归档页面而不是作者

我是否遗漏了一些关于设置自定义帖子类型的内容,因为我认为您可以将作者页面直接附加到它们

解决方案

我发现我没有完全正确地配置register\u post\u types()调用,我建议使用下面臭提供的链接来帮助构建PHP,但是,有几个问题需要解决

如果您想要一个自定义永久链接(我曾经做过),它只为给定用户显示自定义帖子类型中的帖子,并且您想要按照正确的模式隔离设计,那么您需要执行另外两个步骤:

1) 您仍然需要添加一个相当简单的自定义重写:

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');
上面的
$wpr
只是我的缩写
$wp\u rewrite
,但请记住它是通过引用传递的,所以您需要在开头使用&

2) 如果您只是想侵入主题的author.php文件来添加自定义设计,您可以这样做-
post\u type
已经是一个注册变量,就像
author\u name
一样-您只需在那里添加一些逻辑即可。如果出于一些原因,您想拥有一个完全独立的页面,就像我需要的那样,那么您需要将include添加到
模板中

if (have_posts()) {
    while (have_posts()) {
        the_post();
        ..... your display code ....
    }
}
locate_template()调用将搜索标准层次结构中的子主题、主题等,以尝试在数组中查找其中一个文件(例如author-myposttype.php和author.php)

抓住机会

如果您没有为想要获得作者页面的用户分配任何帖子,因为您将无法获得自定义作者页面或基本作者页面,出于某种原因,您将最终进入archive.php

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);
例如:

如果将此自定义帖子类型的帖子分配给作者“someauthorname”,则会将您置于author-myposttype.php或author.php中,但如果您没有该作者撰写的帖子,则不会在那里结束

请记住,在重写中设置已知变量时,将使用大多数参数自动为您创建一个WP_查询对象,您只需执行标准循环即可


我不喜欢WP默认与冒号和endwhile/endif一起使用的简短语法,您需要的是
是作者

此条件标记检查是否正在显示作者存档页。这是一个布尔函数,意味着它返回TRUE或FALSE

将条件添加到single.php。如果需要,可以向同一文件添加另一个循环,或者如果满足条件,则切换到custom single.php

编辑:
这是一个为自定义帖子类型生成代码的方法。

谢谢,但是,它无法签入single.php或author.php中的
is_author()
并且重写系统将我放入存档页面。如果我在模板的顶部回显$path,它将在archive.php中结束。我可以接受,但似乎无法访问任何告诉我这是我的自定义帖子类型的内容,因此我可以返回正确的文件名。谢谢,请您添加链接作为答案,我接受,您可以添加“查看O/P的观察结果”吗因为你的链接最终会达到98%,但是有一些我想让人们看清楚的地方。
if (have_posts()) {
    while (have_posts()) {
        the_post();
        ..... your display code ....
    }
}