has_posts () возвращает false, но count говорит "3"

Ситуация такова: я создал пользовательский тип сообщения, который отлично работает, теперь я хочу создать шаблон страницы с конкретным архивом для таксономий этого типа сообщений.

Я продублировал страницу archive.php моей темы (схема МТС), но в этом случае она не работает.

Здесь код:

 <?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->count равен 3 .

Не могли бы вы мне помочь? Заранее большое спасибо!

Здесь неверны ваши предположения, что значения должны быть одинаковыми. Я не знаю, что именно представляет собой термин count, и это не очевидно из документов, но это, скорее всего, количество сообщений, связанных с этим термином. OTOH wp_query (который используется для основного цикла) учитывает права пользователя поверх этого необработанного номера, самый простой пример – по умолчанию результат не будет включать сообщения, которые не публикуются, более сложные вещи могут произойти, если у вас есть некоторые плагины, которые манипулировать запросом.

У меня была такая же проблема.

Согласно документации :

 The hierarchy for a custom taxonomy is listed below: taxonomy-{taxonomy}-{term}.php taxonomy-{taxonomy}.php taxonomy.php archive.php index.php 

Таким образом, неважно, какой файл шаблона ведьмы вы используете, все они будут генерировать такую ​​же проблему.

Когда я вставляю в начало файла шаблона 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 hook:

 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' ) ); } }