按年和月定制的帖子类型档案?


Answers:


17

是的你可以。您需要做的是对其进行过滤,wp_get_archives();以便它接受post_type参数:

function my_custom_post_type_archive_where($where,$args){  
    $post_type  = isset($args['post_type'])  ? $args['post_type']  : 'post';  
    $where = "WHERE post_type = '$post_type' AND post_status = 'publish'";
    return $where;  
}

然后调用:

add_filter( 'getarchives_where','my_custom_post_type_archive_where',10,2);

每当您要按自定义帖子类型显示存档时,只需传递post_type args:

$args = array(
    'post_type'    => 'your_custom_post_type',
    'type'         => 'monthly',
    'echo'         => 0
);
echo '<ul>'.wp_get_archives($args).'</ul>';

3
您尝试过此解决方案吗?它可以正确地从您的CPT中获取带有帖子的月份列表以及帖子的数量,但是链接没有用。单击它们会将您带到整个站点的一个月,而不是CPT。
jerclarke 2012年

经过一些挖掘(请参阅下面的Tom Nowell的答案),我放弃了自定义帖子类型的每月存档。相反,我使用了帖子类别,并将我的永久链接结构更改为/%category%/%year%/%monthnum%/%postname%/。然后,可能有可能使用类似于上述的钩子来修改链接以开头/%category%/而不只是日期。
凯文

问题。这将创建类似url的URL:mysite.com/2013/04但是会导致404。自定义帖子类型位于:mysite.com/cats,这使我认为mysite.com/cats/2013/04链接应该是什么,但这也解析为404。如何使归档链接起作用?
gaoshan88

2
更好的是,终于有了插件来处理WordPress中缺少的此功能。它是由核心贡献者创建的,目的是解决核心问题。提供插件可以帮助我们解决问题,直到核心问题得到正确解决。wordpress.org/plugins/archives-for-custom-post-types
Trevor

6

并非如此,Wordpress开发人员的官方说法是自定义帖子类型并非旨在完成普通普通帖子的工作,并且,如果您需要日期等的存档,那么您做的事情就不正确,而且您最好使用帖子格式等。

自定义帖子类型旨在用于Web应用程序等,而诸如设置自定义帖子类型作为具有不同名称的辅助博客或并行博客(例如具有功能的Blog与新闻)的功能则不是此功能旨在并且将意味着由于实施而产生的其他技术问题。

如果您仍然坚持这样做,仅使用自定义分类法和帖子格式是不够的,则可以在functions.php中添加重写规则,然后将某些URL中的年/月存档重定向到帖子存档页面,然后检查自定义如果您已在重写规则中指定了变量并加载了其他模板,则请发布存档页面,并确保在重写规则中设置适当的值。


他们只能使用此功能走得这么远似乎有些奇怪。您能举一个例子说明如何使用自定义帖子吗?
李丹

自定义帖子应用于页面和博客帖子(或具有不同名称但工作原理相同的博客帖子)范围之外的任何内容,例如,正确使用自定义帖子的示例包括:事件,菜单,位置,表单,日志等
Tom J Nowell

自定义帖子基本上是生产Web应用程序的方法,不是复制后端中的帖子菜单以简化编辑的方法(这种用法会使wordpress变慢,并且比您想像的要复杂得多)
汤姆Ĵ诺埃尔

1
UUUUgh。不幸的是,这是对这个问题的正确答案。我不敢相信上面的解释是基于“我们不应该有CPT的日期URL”的,几乎可以肯定,“ CPT的日期URL太复杂了”正在推动不执行的实际决定。显然,在某些情况下,人们会希望使用自定义帖子类型的日期档案,但您无法通过指出帖子格式来消除这种明显的欲望。
jerclarke 2012年

1
我必须强烈不同意。自定义帖子类型旨在用于您希望它们用于的任何用途,而食典中没有说明它们用于“ Web应用程序”。另外,您可能非常需要“新闻”部分,该部分具有自己的自定义分类法,并且您需要这些内容的存档。甚至建议使用的“事件”类型,我都认为这是CPT的完美用法,但同样,那些轻松地可能需要基于日期的存档。
Trevor

5

编辑 ->尽管此答案仍适用于<WP4.4,因为自定义帖子类型现在包含4.4支持wp_get_archives()


最后,对于基于日期的WordPress自定义帖子类型档案,有一个简单,快速,简便的解决方案!这是一个长期存在的问题,已记录在WP Core Trac中。

它尚未解决,但Trac的贡献者之一已在GitHub上发布了一个简单的插件,使您可以拥有基于日期的CPT存档。

安装此插件或手动添加功能代码后,您可以使用CPT档案,例如:

<?php wp_get_archives_cpt( 'post_type=custom_post_type' ); ?>

注意,此新功能wp_get_archives_cpt与标准功能相同,wp_get_archives因此您可以使用它接受的任何常规参数。但是,它只是为您添加了添加自定义帖子类型名称参数的功能。


2

声誉不足,无法将此添加到taiken的答案中。

但是想补充一点,但是他的回答确实对我有用,但是链接的格式为“ localhost / date / 2010”。而我需要'localhost / postslug / 2010'格式。我可以通过在wp_get_archives的输出上使用字符串替换来解决此问题。

因此,根据您的永久链接的设置方式,此代码将解决404问题并将链接重定向到自定义帖子类型的永久链接结构:

$yearly_archive = wp_get_archives(array( 'type' => 'yearly', 'post_type' => '<your post type name>', 'echo' => '0') );
$blog_url = get_bloginfo('url');
echo str_replace(($blog_url . '/date'), ($blog_url . '<your post type slug>'),$yearly_archive);

1

无法添加到takien的帖子中,所以这就是我最终要做的事情:

functions.php

add_action('init', 'my_year_archive_rewrites');  
function my_year_archive_rewrites() {   
    add_rewrite_rule('resource/news/([0-9]{4})/page/?([0-9]{1,})/?', 'index.php?post_type=news&year=$matches[1]&paged=$matches[2]', 'top');
    add_rewrite_rule('resource/news/([0-9]{4})/?', 'index.php?post_type=news&year=$matches[1]', 'top');
}

add_filter('getarchives_where', 'my_custom_post_type_archive_where', 10, 2);
function my_custom_post_type_archive_where($where,$args){  
    $post_type = isset($args['post_type']) ? $args['post_type'] : 'post';  
    return "WHERE post_type = '$post_type' AND post_status = 'publish'";
}

add_filter('year_link', 'my_year_link');
function my_year_link($link) {
    global $wp_rewrite;

    if(true) { // however you determine what archive you want
        $link = str_replace($wp_rewrite->front, '/resource/news/', $link);
    }

    return $link;
}

调用wp_get_archives()

wp_get_archives(array('post_type'=>'news', 'type'=>'yearly'));

看到他是您的第一个答案。回答问题时只是提示,而不仅仅是添加代码或相关链接。尽管您的代码可能会起作用,但总是很高兴知道您的代码可以做什么以及为什么应该起作用。否则,您的答案格式正确。为此+1
Pieter Goosen 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.