Проблема с различными циклами запросов (и «основной цикл») на странице шаблона шаблона!

так, вот проблема:

Я создал шаблон категории (category.php) с двумя циклами запросов и основным циклом (в котором содержимое из категории должно зацикливаться). если теперь я нажимаю на категорию, отображаемую на странице шаблона, но и на нее влияют первые два цикла запросов. все перепутано.

выше – моя архитектура шаблона. как вы можете видеть, я использовал функцию wp_reset_query, но это не помогло. как я могу заставить JUST MAIN LOOP реагировать на категовые сообщения?

первый цикл:

<div id="slider1"> <?php $args = array( 'post_type' => 'slider'); $loop = new WP_Query( $args ); while ( $loop->have_posts() ) : $loop->the_post();?> <div class="startslide" style="background-color: <?php echo get_post_meta($post->ID, 'Farbcode', true); ?>"> <div class="slideimg"><?php the_post_thumbnail( 'slider' ); ?></div> <h1><?php the_title(); ?></h1> <div class="subline"><?php the_content(); ?></div> </div> <?php endwhile; ?> <?php wp_reset_query(); ?> </div> <!--! end of #slider1 --> 

второй цикл:

 <div id="topteaser"> <?php $args = array( 'post_type' => 'teaser'); $loop = new WP_Query( $args ); while ( $loop->have_posts() ) : $loop->the_post();?> <div class="topteaseritem" style="background:url(<?php $src = wp_get_attachment_image_src( get_post_thumbnail_id($post->ID), array( 36,36 ), false, '' ); echo $src[0]; ?>) no-repeat 10px top"> <h3><?php the_title(); ?></h3> <?php the_content(); ?> </div> <?php endwhile; ?> <?php wp_reset_query(); ?> </div> 

.. и третий цикл (основной цикл):

 <div id="slider2"> <?php if (have_posts()) : ?> <?php while (have_posts()) : the_post(); ?> <div class="post"> <div class="postimg"><a href="<?php the_permalink() ?>"><?php the_post_thumbnail( 'related' ); ?> </a></div> <div class="postcontent"> <h3><?php the_title(); ?></h3> <?php the_content(); ?> </div> </div> <?php endwhile; ?> <?php endif; ?> </div> <!--! end of #slider2 --> 

я надеюсь, что вы получите мою проблему, поскольку я не являюсь носителем английского языка (трудно объяснить все это) 😉

Чтобы обеспечить более конкретную помощь, нам нужно будет узнать более подробно о том, что именно происходит, чего вы не ожидаете, или чего не происходит, что вы ожидаете, или того, что происходит иначе, чем вы ожидаете.

Тем не менее, есть по крайней мере две вещи, которые, вероятно, помогут вам:

  1. Используйте описательные и уникальные имена переменных для хранения ваших пользовательских запросов
  2. Включите часть if ( have_posts() ) цикла
  3. Вызовите wp_reset_postdata() вместо wp_reset_query()

Переменные имена

Вы используете общую переменную $arg для хранения ваших пользовательских аргументов запроса и генератор переменной $loop для хранения обоих ваших пользовательских запросов. Вместо этого я бы предложил:

 $slider_query_args = array( 'post_type' => 'slider'); $slider_query = new WP_Query( $slider_query_args ); 

…а также…

 $teaser_query_args = array( 'post_type' => 'teaser'); $teaser_query = new WP_Query( $teaser_query_args ); 

Это упрощает чтение и просмотр кода, помогает не смешивать два пользовательских запроса и помогает избежать непредвиденных последствий в двух пользовательских вызовах запросов.

Полный вызов

Ты используешь:

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

Вместо этого используйте:

 if ( $slider_query->have_posts() ) : while ( $slider_query->have_posts() ) : $slider_query->the_post(); // Loop output endwhile; endif; 

…а также…

 if ( $teaser_query->have_posts() ) : while ( $teaser_query->have_posts() ) : $teaser_query->the_post(); // Loop output endwhile; endif; 

Сброс данных после пользовательских запросов

Примечание. Вероятно, это может быть вашей главной проблемой.

Функция wp_reset_query() предназначена для сброса основного запроса после его изменения (например, через query_posts() ). Поскольку вы не изменяете основной запрос, вызов wp_reset_query() ничего не сделает для вас.

Вместо этого используйте wp_reset_postdata() , который предназначен для сброса глобальной переменной $post и всех связанных тегов шаблона (например, the_title() , the_content() , the_permalink() и т. Д.), Чтобы снова обратиться к основному запросу. Поскольку вы вызываете the_post() в своих настраиваемых циклах запросов, вы хотите использовать wp_reset_postdata() :

 // Slider Loop if ( $slider_query->have_posts() ) : while ( $slider_query->have_posts() ) : $slider_query->the_post(); // Loop output endwhile; endif; // Rest postdata wp_reset_postdata(); // Teaser Loop if ( $teaser_query->have_posts() ) : while ( $teaser_query->have_posts() ) : $teaser_query->the_post(); // Loop output endwhile; endif; // Rest postdata wp_reset_postdata(); // Main Query Loop if ( have_posts() ) : while ( have_posts() ): the_post(); // Loop output endwhile; endif;