Опубликовать не в той категории

У меня странная проблема: некоторые сообщения появляются в категориях, в которых их нет. Когда я смотрю в своем бэк-офисе и фильтрую по категориям, некоторые сообщения появляются там, но они не отмечены.

В результате они появляются и во фронт-офисе.

Это моя категория.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();
?>

Я посмотрел в таблице "_term_relationships" и все правильно, они не в неправильных категориях.

Так что, может быть, у кого-то есть ключ, чтобы узнать?

PS: я использую WPML, но если я его деактивирую, возникает та же проблема.


person H4mm3R    schedule 09.10.2014    source источник
comment
Отбросьте свой собственный запрос, используйте основной цикл. Также никогда не используйте query_posts, это просто очень плохая функция для создания пользовательских запросов.   -  person Pieter Goosen    schedule 09.10.2014
comment
Вы имеете в виду мой собственный jquery в бэк-офисе? Потому что я не использую один   -  person H4mm3R    schedule 09.10.2014


Ответы (2)


Вы не должны использовать 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;
        ?>
person tinos    schedule 09.10.2014
comment
Ну, в массиве это не «категория», а «кошка». Спасибо за помощь, но проблема осталась прежней. - person H4mm3R; 09.10.2014
comment
если убрать query_posts и оставить только цикл? какой адрес? - person tinos; 09.10.2014
comment
ultraflux.net/category/expertise ultraflux.net/category/services Видел, у них такая же статья, но эта статья просто в экспертизе и не должна появляться в сервисах - person H4mm3R; 10.10.2014

Прежде всего, никогда не используйте query_posts для построения любого типа запроса.

Примечание. Эта функция не предназначена для использования плагинами или темами. Как будет объяснено позже, есть лучшие и более производительные варианты изменения основного запроса. query_posts() — это слишком упрощенный и проблематичный способ изменить основной запрос страницы, заменив его новым экземпляром запроса. Это неэффективно (повторно запускает SQL-запросы) и в некоторых случаях полностью терпит неудачу (особенно часто при работе с разбиением сообщений на страницы).

Во-вторых, никогда не меняйте основной запрос на пользовательский запрос на любом типе страницы архива или домашней страницы. Правильный способ — использовать pre_get_posts для изменения переменных запроса до выполнения основного запроса. Посмотрите этот пост, который я сделал некоторое время назад

В-третьих, страницы категорий в Wordpress действительно работают странно. При посещении страницы категории на ней будут отображаться сообщения из выбранной категории и сообщения из дочерних категорий выбранной категории. Бьюсь об заклад, это то, что вы видите. Это вполне нормальное поведение. Если вам нужно это изменить, взгляните на этот ответ на WPSE от @ialocin. В пользу этого ответа, вот решение

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;
    }
}
person Pieter Goosen    schedule 09.10.2014
comment
Спасибо. Я многому научился благодаря вашему посту. Но нет, мои категории не детские. они 2 родителя... - person H4mm3R; 10.10.2014
comment
Есть ли у вас какие-либо пользовательские запросы, которые вы не сбросили, или какой-либо экземпляр pre_get_posts - person Pieter Goosen; 10.10.2014
comment
Вы вернулись к основному циклу на своей странице. Вы удалили query_posts. Скопируйте свой index.php и переименуйте его в category.php. - person Pieter Goosen; 10.10.2014
comment
Еще нет, сделаю в ближайшее время. Но, честно говоря, я не думаю, что это решит грязную проблему. Потому что в моем бэк-офисе (где я ничего не менял) такая же проблема... - person H4mm3R; 10.10.2014
comment
Пользовательские запросы на архивных страницах всегда вызывают проблемы. Если у вас такая же проблема с серверной частью, скорее всего, вы используете pre_get_posts где-то в своей теме неправильно. я бы начал там - person Pieter Goosen; 10.10.2014