Have_Posts()返回FALSE,但COUNT表示“3”

时间:2016-04-09 作者:castp

情况是这样的:我已经创建了一个可以完美工作的自定义帖子类型,现在我想为该帖子类型的分类创建一个特定的归档页面模板。

我复制了archive.php 我的主题页面(MTS模式),但在这种情况下它不起作用。

代码如下:

<?php

$term = get_term_by( \'slug\', get_query_var( \'term\' ), get_query_var( \'taxonomy\' ), get_query_var( \'count\' ) );
echo $term->name;
echo \' has nr elements: \';
echo $term->count;


?>
<div id="page">
    <div class="<?php mts_article_class(); ?>">
        <div id="content_box">
            <h1 class="postsby">
                <span><?php echo the_archive_title(); ?></span>
            </h1>
            <?php $j = 0; if (have_posts()) : while (have_posts()) : the_post(); ?>
                <article class="latestPost excerpt  <?php echo (++$j % 3 == 0) ? \'last\' : \'\'; ?>">
                    <?php mts_archive_post(); ?>
                </article><!--.post excerpt-->
                <?php endwhile; else: echo \'nothing\'; endif; ?>

            <?php if ( $j !== 0 ) { // No pagination if there is no posts ?>
                <?php mts_pagination(); ?>
            <?php } ?>
        </div>
    </div>
    <?php get_sidebar(); ?>
<?php get_footer(); ?>
奇怪的是,由于函数have_posts() 返回false,但$term->count3.

你能帮帮我吗?提前非常感谢!

3 个回复
SO网友:Ilya Sviridenko

我也有同样的问题。

根据documentation:

The hierarchy for a custom taxonomy is listed below:

taxonomy-{taxonomy}-{term}.php
taxonomy-{taxonomy}.php
taxonomy.php
archive.php
index.php
所以,您使用的witch模板文件并不重要,它们都会生成相同的问题。

当我输入模板文件代码的开头时var_dump($wp_query);, 我发现了这个:

public \'request\' => string \'SELECT SQL_CALC_FOUND_ROWS  wp_posts.ID FROM wp_posts  LEFT JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) WHERE 1=1  AND ( 
  wp_term_relationships.term_taxonomy_id IN (20)
) AND wp_posts.post_type IN (\'post\', \'page\', \'attachment\') AND (wp_posts.post_status = \'publish\' OR wp_posts.post_author = 1 AND wp_posts.post_status = \'private\') GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 10\' (length=433)
  public \'posts\' =>
此查询中的重要部分是wp_posts.post_type IN (\'post\', \'page\', \'attachment\').

出现问题的原因是没有您的自定义post_type 在此阵列中(\'post\', \'page\', \'attachment\').

我不知道为什么会这样,但可以使用pre_get_posts 挂钩:

add_filter(\'pre_get_posts\', \'add_custom_post_type_to_query\');
function add_custom_post_type_to_query($query) {
    // We do not want unintended consequences.
    if ( is_admin() || ! $query->is_main_query() ) {
        return;    
    }

    // Check if custom taxonomy is being viewed
    if( is_tax() && empty( $query->query_vars[\'suppress_filters\'] ) )         
    {
        $query->set( \'post_type\', array( 
            \'post\',
            \'page\',
            \'my_custom_post_type\'
        ) );
    }
}

SO网友:Mark Kaplun

这里的错误在于你认为这些值应该是相同的。我不知道术语计数到底代表什么,从文档中也看不出来,但很可能是与术语相关的原始帖子数。奥托wp_query (用于主循环)在原始数字之上考虑用户权限,这是最简单的示例-默认情况下,结果将不包括未发布的帖子,如果您有一些处理查询的插件,可能会发生更复杂的事情。

SO网友:Phil Birnie

与OP相同的问题。正如@sviriden在回答中指出的,问题是主查询没有在wp_posts.post_type IN 条款我在class-wp-query.php 对于这些行:

    if ( \'any\' == $post_type ) {
        $in_search_post_types = get_post_types( array( \'exclude_from_search\' => false ) );
        if ( empty( $in_search_post_types ) ) {
            $where .= \' AND 1=0 \';
        } else {
            $where .= " AND {$wpdb->posts}.post_type IN (\'" . join( "\', \'", array_map( \'esc_sql\', $in_search_post_types ) ) . "\')";
        }
    } elseif ( ! empty( $post_type ) && is_array( $post_type ) ) {
        $where .= " AND {$wpdb->posts}.post_type IN (\'" . join( "\', \'", esc_sql( $post_type ) ) . "\')";
    } elseif ( ! empty( $post_type ) ) {
        $where           .= $wpdb->prepare( " AND {$wpdb->posts}.post_type = %s", $post_type );
        $post_type_object = get_post_type_object( $post_type );
    } elseif ( $this->is_attachment ) {
        $where           .= " AND {$wpdb->posts}.post_type = \'attachment\'";
        $post_type_object = get_post_type_object( \'attachment\' );
    } elseif ( $this->is_page ) {
        $where           .= " AND {$wpdb->posts}.post_type = \'page\'";
        $post_type_object = get_post_type_object( \'page\' );
    } else {
        $where           .= " AND {$wpdb->posts}.post_type = \'post\'";
        $post_type_object = get_post_type_object( \'post\' );
    }
关键是$in_search_post_types 其中仅包括具有exclude_from_search 为假。就我而言exclude_from_searchtrue 注册自定义帖子类型时。将此值更改为false 已解决问题。