发布错误的类别

时间:2014-10-09 13:09:19

标签: php mysql wordpress categories wpml

我有一个奇怪的问题,有些帖子出现在他们不在的类别中。 当我查看我的后台并按类别过滤时,会出现一些帖子,但它们没有签入。

结果是在前台他们也出现了。

这是我的category.php(但我不认为这是事情)

<?php
get_header();
?>

<section id="wrapper" class="page <?php echo get_query_var('cat'); ?>">
    <div id="container">

        <?php 

            $category = get_category(get_query_var('cat'));
            $cat_id = $category->cat_ID;
            query_posts('showposts=1&cat='.$cat_id);

            if ( have_posts() ) : 

                while ( have_posts() ) : the_post();

                get_template_part( 'content', get_post_format() );

                endwhile;

            endif;
        ?>
    </div>
</section>
<?php
    get_footer();
?>

我看着桌子&#34; _term_relationships&#34;一切都是对的,他们不是错误的类别。

所以也许有人有发现的线索?

PS:我使用的是WPML,但如果我拒绝它,那就是同样的问题

2 个答案:

答案 0 :(得分:0)

你不应该使用query_posts(), 见(https://wordpress.stackexchange.com/questions/1753/when-should-you-use-wp-query-vs-query-posts-vs-get-posts

试试这个:

<?php 

            $category = get_category(get_query_var('cat'));
            $cat_id = $category->cat_ID;

            $args = array( 'category' => $cat_id );


             $query2 = new WP_Query($args);

            if ( $query2->have_posts() ) : 

                while ( $query2->have_posts() ) : 
                    $query2->the_post();

                    get_template_part( 'content', get_post_format() );

                endwhile;

            endif;
        ?>

答案 1 :(得分:0)

首先,永远不要使用query_posts构建任何类型的查询

  

注意:此功能不适用于插件或主题。如后面所述,有更好的,更高性能的选项来改变主查询。 query_posts()是一种过于简单化和有问题的方法来修改页面的主要查询,方法是用新的查询实例替换它。它是低效的(重新运行SQL查询)并且在某些情况下会彻底失败(特别是在处理帖子分页时)。

其次,永远不要在任何类型的存档页面或主页上更改自定义查询的主查询。正确的方法是在主查询执行之前使用pre_get_posts来更改查询变量。查看this post我之前做过的

第三,Wordpress中的类别页面确实以奇怪的方式工作。访问类别页面时,它将显示所选类别的帖子和所选类别的子类别的帖子。我打赌这就是你所看到的。这是非常正常的行为。如果您需要更改此设置,请查看@ialocin的this answer on WPSE。为了这个答案的好处,这是解决方案

add_filter( 
    'parse_tax_query', 
    'wpse163572_do_not_include_children_in_category_archive_parse_tax_query' 
);
function wpse163572_do_not_include_children_in_category_archive_parse_tax_query( $query ) {
    if ( 
        ! is_admin() 
        && $query->is_main_query()
        && $query->is_category()
    ) {
        // as seen here: https://wordpress.stackexchange.com/a/140952/22534
        $query->tax_query->queries[0]['include_children'] = 0;
    }
}