2

这已经解决了,感谢用户“臭”,请参阅下面的原始问题和我的观察 - 滚动过去选择的答案没有任何意义

原始问题

为 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 的短语法

4

1 回答 1

1

您需要的是is author 条件标签。

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

将条件添加到 single.php。如果你愿意,你可以在同一个文件中添加另一个循环,或者如果满足条件切换到custom-single.php

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

于 2013-11-11T07:37:07.100 回答