按日期和分类分类的自定义邮政类型档案

时间:2010-09-15 作者:Werner

让我们使用一个名为“movies”的自定义帖子类型的经典示例,它有自己的分类法“流派”。

通过注册自定义帖子类型(使用“movie”slug),永久链接已经设置为

<domain>/movie/action/ 
。。。观看所有动作类型的电影。

但是,按日期归档,比如

<domain>/2010/09/
。。。不知道自定义帖子类型。

我能够使用的最接近日期的存档是:

<domain>/2010/?post_type=movies
。。。其中列出了本年度(2010年)发布的所有自定义帖子类型。由于某些原因,无法将月份、分类法和术语添加到URL以获得预期结果。

必须做些什么才能启用如下url。。。

<domain>/2010/09/movie/action/
。。。按预期工作,从而列出2010年9月发布的所有动作片?

3 个回复
SO网友:somatic

是的,目前没有对CPT归档的内置支持,但这并不意味着您不能扩展WP来提供它。前几天我自己做的。。。

这不会创建您正在查找的基于日期的存档,但会为您提供自定义帖子类型的虚拟存档行为。添加日期应该只是调整重写规则的问题(实际上,基于日期的永久链接可能只按原样工作)。。。

EXAMPLE: 您有一个自定义类型的“电影”和一个名为“乱世佳人”的电影帖子。此代码将为您提供网站的URL结构。com/电影/飘。还有,访问网站。com/movies将只列出电影(就像一个类别存档,虽然它不会调用archive.php模板进行输出,但会像标准index.php循环模板一样格式化输出)。

function register_post_type_archives( $post_type, $base_path = \'\' ) {
    global $wp_rewrite;
    if ( !$base_path ) {
        $base_path = $post_type;
    }
    $rules = $wp_rewrite->generate_rewrite_rules($base_path);
    $rules[$base_path.\'/?$\'] = \'index.php?paged=1\';
    foreach ( $rules as $regex=>$redirect ) {
        if ( strpos($redirect, \'attachment=\') == FALSE ) {
            $redirect .= \'&post_type=\'.$post_type;
            if (  0 < preg_match_all(\'@\\$([0-9])@\', $redirect, $matches) ) {
                for ( $i=0 ; $i < count($matches[0]) ; $i++ ) {
                    $redirect = str_replace($matches[0][$i], \'$matches[\'.$matches[1][$i].\']\', $redirect);
                }
            }
        }
        add_rewrite_rule($regex, $redirect, \'top\');
    }
}
生成自定义帖子类型后立即调用此函数:

register_post_type(\'movies\', $args);
register_post_type_archives(\'movies\');
然后,如果您希望能够使用自定义模板来控制这些准存档列表的输出,可以使用以下方法:

add_action(\'template_redirect\', \'post_type_templates\');
function post_type_templates() {
    $post_type = get_query_var(\'post_type\');
    if (!empty($post_type)) {
        locate_template(array("{$post_type}.php","index.php"), true);
        die;
    }
}
现在,您可以在主题中创建一个“movies.php”模板,并根据自己的喜好自定义循环输出。。

UPDATE: 拥有自定义类型的归档功能非常好,但我意识到我需要一种访问它们的方法。很明显,您可以在某个地方对指向slug的按钮进行硬编码,但我创建了一个生成wp3的函数。0导航栏,其中包含所有自定义类型。现在,它生成了一个新的导航栏并使其成为主导航栏,但您可以将其更改为辅助导航栏,或者只将项目添加到现有导航栏。注意:只有在使用上面的重写规则时,导航链接才会起作用。

function register_typenav() {
    $mainnav = wp_get_nav_menu_object(\'Types Nav\');
    if (!$mainnav) {
        $menu_id = wp_create_nav_menu( \'Types Nav\' );
        // vav item for each post type
        $types = get_post_types( array( \'exclude_from_search\' => false ), \'objects\' );
        foreach ($types as $type) {
            if (!$type->_builtin) {
                wp_update_nav_menu_item( $menu_id, 0, array(
                    \'menu-item-type\' => \'custom\',
                    \'menu-item-title\' => $type->labels->name,
                    \'menu-item-url\' => get_bloginfo(\'url\') . \'/\' . $type->rewrite[\'slug\'] . \'/\',
                    \'menu-item-status\' => \'publish\'
                    )
                );
            }
        }
    if ($mainnav && !has_nav_menu( \'primary-menu\' ) ) {
        $theme = get_current_theme();
        $mods = get_option("mods_$theme");
        $key = key($mods[\'nav_menu_locations\']);
        $mods[\'nav_menu_locations\'][$key] = $mainnav->term_id;
        update_option("mods_$theme", $mods);
    }
}
add_action(\'init\', \'register_typenav\');

SO网友:hakre

自定义帖子类型的设计目的不是像普通博客帖子类型那样提供归档。这可能是将来会改变的事情。

这是缺失的链接:Custom Post Types (CPT) enhancements that deserve consideration in 3.1.

SO网友:baxang

这个插件提供了你想要的东西。它与Wordpress 3.3.1配合得很好。

结束

相关推荐

Saving Taxonomy Terms

我有一个有趣的问题,希望有人能尽快回答。我已经创建了自己的metabox,它基于“我的metabox代码”(下面的列表)正确地显示了我创建的“event\\u types”分类中所有术语的下拉列表。我遇到的问题是,当从下拉列表中选择不同的术语并更新帖子时,能够保存/更新与帖子相关的术语。在对各种代码位进行修补之后,我发现通过手动将term\\u ID number[用逗号分隔]输入数组区域,我得到了我想要的结果。例如,如果在保存帖子时,函数将调用此代码wp_set_post_terms( $post_id