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

时间:2013-11-10 22:10:35

标签: php wordpress custom-post-type author

这已经解决了,感谢用户'臭',请看下面的原始问题和我的观察 - 滚动到选定的答案没有任何意义

原始问题

为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

的短语法

1 个答案:

答案 0 :(得分:1)

您需要的是is author Conditional Tag.

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

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

编辑: 这是great site生成自定义帖子类型的代码。