【问题标题】:Wordpress custom post type categoriesWordpress 自定义帖子类型类别
【发布时间】:2011-06-24 12:07:27
【问题描述】:

嘿。我在 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 的值有误。但为什么?我是否正确注册了分类法(我喜欢为我的自定义帖子类型使用类别和标签)?

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

【问题讨论】:

    标签: php wordpress themes categories custom-post-type


    【解决方案1】:

    确保添加以下内容:

    'paged' => get_query_var('paged')
    

    到您的 $args,它应该可以接受分页。

    更多here

    【讨论】:

    • 嘿大卫。谢谢,但正如您所见,我确实将分页参数传递给 query_posts()。或者这有什么问题?
    • 哎呀,我的错。我建议您发送print_r($args); 以查看确切发送的内容 - 这可能是您发现问题的第一个线索。另一件事:showposts 已弃用,请尝试使用 posts_per_page 代替。最后,您可以尝试显式设置“nopage” => false
    • 我有兴趣解决这个问题。我做了print_r($wp_query); 它似乎 $found_posts 是 0,docs 说它从中计算 $max_num_pages。我猜是时候看看源代码了。
    【解决方案2】:

    在 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);
    

    【讨论】:

      【解决方案3】:

      我刚刚遇到了完全相同的问题,但在任何地方都找不到解决方案!互联网上充斥着有关该主题的资源,但没有一个提供该问题的正确答案。

      这是任何人都可以搜索的正确答案。将以下代码放在主题根目录的 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 很难解决!
      • 这对我有用,CPT 也有同样的问题,谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-01
      • 2021-06-07
      • 2013-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多