WordPress自定义文章类型分类

6

嘿,我在WordPress中使用自定义文章类型。我像这样注册自定义文章类型:

        register_post_type("lifestream", array(
            'label' => 'Lifestream',
            'public' => true,
            'hierarchical' => true,
            'menu_position' => 5,
            'supports' => array('title','editor','author','thumbnail','comments','custom-fields'),
            'taxonomies' => array('category','post_tag'),
            'query_var' => true,
            'publicly_queryable' => true,
            'exclude_from_search' => false,
            'caller_get_posts' => 1

        ));
        register_taxonomy_for_object_type('category', 'lifestream');
        register_taxonomy_for_object_type('post_tag', 'lifestream');

在主题(循环模板)中,我希望将文章和我的自定义文章类型结合起来,为此我使用query_posts()函数,并使用以下参数:
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = array(
    'post_type' => array('post', 'lifestream'),
    'paged' => $paged,
    'cat' => $wp_query->get('cat'),
    'tag' => $wp_query->get('tag'),
    'year' => $wp_query->get('year'),
    'monthnum' => $wp_query->get('monthnum'),
    'post_status' => 'publish',
    'showposts' => 3
);
query_posts($args); 


# the loop     
while ( have_posts() ) : the_post(); 
# markup
endwhile;


if($wp_query->max_num_pages > 1): 
# next_posts_link / previous_posts_link
endif;

wp_reset_query();   

到目前为止,这个工作还不错。但是,我在类别和标签页面上遇到了问题。如果我调用首页,一切都很好,我可以通过页面进行分页并获得正确的结果。

而且,如果我调用一个分页的URL,例如/category/mycat/page/2,就会抛出404错误。但是肯定应该有帖子存在,无论类别中是自定义类型帖子还是普通帖子。我想我的query_posts()参数不正确,但是不确定……

似乎$wp_query->max_num_pages的值是错误的。但为什么呢?我是否正确注册了分类法(我喜欢为我的自定义帖子类型使用类别和标签)?

你有什么想法吗?非常感谢!

3个回答

2
我刚遇到了完全相同的问题,但无论在哪里都找不到解决方案!网络上有很多关于这个主题的资源,但没有一个能提供正确的答案来解决这个问题。
以下是正确的答案,适用于任何搜索的人。将下面的代码放入您的主题根目录中的functions.php中。
function init_category($request) {
    $vars = $request->query_vars;
    if (is_category() && !is_category('Blog') && !array_key_exists('post_type', $vars)) :
        $vars = array_merge(
            $vars,
            array('post_type' => 'any')
        );
        $request->query_vars = $vars;
    endif;
    return $request;
}
add_filter('pre_get_posts', 'init_category');

所有的功劳归功于Mike,他在WordPress.com上发布了这篇文章。干杯!


我正准备从我的笔记中给你这种形式的代码。干得好。pre_get_posts 很难控制! - Ben Racicot
这对我有用,CPT也有同样的问题,谢谢。 - MrRoman

0
在archive.php中尝试使用以下内容:
query_posts( array(
  'post_type' => 'lifestream',
  'posts_per_page' => 6,
  'orderby' => 'menu_order',
  'orderby' => 'date',
  'order' => 'ASC',
  'paged' => '' . get_query_var('paged')
));

if ( have_posts() ) : while ( have_posts() ) : the_post();

endwhile; else:
endif;

对于下一页和上一页的链接,我使用:

next_posts_link('Older Entries', $wp_query->max_num_pages);
previous_posts_link('Newer Entries', $wp_query->max_num_pages);

0

请确保您添加了这个:

'paged' => get_query_var('paged')

将它返回到你的$args中,它应该可以正常接受分页。

更多这里


嘿,David。谢谢,但是你可以看到我确实将paged参数传递给了query_posts()。或者有什么问题吗? - Status4
糟糕,我的错。我建议你执行print_r($args);以查看确切发送了什么 - 这可能是你解决问题的第一个线索。另外一件事:showposts已经被弃用,请尝试使用posts_per_page代替。最后,你可以尝试显式设置"nopaging"=>false。 - David
我对解决这个问题很感兴趣。我执行了print_r($wp_query);。看起来$found_posts为0,并且文档说它从中计算$max_num_pages。我想是时候查看源代码了。 - ben author

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接