wp_query должен сначала показывать листы

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

<!-- Begin top thumbnails --> <div class="home-thumbs" style="width:<?php echo $top_width; ?>px;"> <?php $home_query = new WP_Query("cat=$slider_cat&ignore_sticky_posts=0&showposts=$top_row_posts"); $i = 0;?> <ul class="thumbs" style="width:<?php echo $top_width; ?>px;"> <?php while ($home_query->have_posts()) : $home_query->the_post(); $do_not_duplicate = $post->ID; $i++; ?> <li class="post-<?php the_ID(); ?> thumb-big"> <dl class="captioned-image"><dt> <?php get_the_image( array( 'custom_key' => array( 'thumbnail' ), 'default_size' => '320x320', 'width' => '320', 'height' => '320' ) );?></dt> <dd><span><?php echo get_the_title(get_the_ID());?></span></dd> </dl> </li> <?php endwhile; wp_reset_query(); $i = 0; ?> </ul> </div> 

Установив липкие сообщения на ноль, я ожидаю, что он будет показывать липкие сообщения в начале цикла, но кажется, что счетчик циклов по какой-то причине спускается через идентификатор сообщения и просто показывает последние сообщения сначала, игнорируя все мои аргументы wp_query.

Хорошо для стартеров, запрос arg showposts был заменен posts_per_page поскольку WP v2.1

Я не думаю, что ни один из ваших аргументов запроса игнорируется (ну, может быть, сохранить showposts , я не проверял, поддерживает ли поддержка обратной совместимости для arg). Тем не менее, я не знаю, какое значение имеет ваша переменная $top_row_posts или что она должна представлять, но вполне возможно, что данные вставляются в запрос в формате, непригодном для WordPress.

Но (как меня поправил Мило) вы правы, установив ignore_sticky_posts на 0 следует убедиться, что липкие сообщения ignore_sticky_posts вверх. На странице codex WP_Query ,

ignore_sticky_posts: […] Примечание: игнорировать / исключать липкие сообщения, включенные в начале возвращаемых сообщений, но липкий пост все равно будет возвращен в естественном порядке этого списка возвращенных сообщений .

Хотя я не совсем уверен, что не так с вашим запросом, я предлагаю обход, используя два отдельных запроса, которые явно гарантируют желаемый эффект – один для липких сообщений и отдельный для остальных:

Идеальным способом реализации подхода с двумя запросами было бы изменение основного запроса с использованием действия pre_get_posts в плагине или в файле functions.php вашей темы, а затем запуск второго «липкого» запроса непосредственно на домашней странице / фронте вашей темы -страничный шаблон. Что-то вроде

functions.php:

 function modify_home_query( $query ) { /* If not displaying the home/front page or not processing the main query, bail out. */ if( is_admin() || !$query->is_main_query() || !( is_home() || is_front_page() ) ) return; /* If this is the main query for the home/front page, tell it to ignore sticky posts entirely. */ $query->set( 'post__not_in', get_option( 'sticky_posts' ) ); } add_action( 'pre_get_posts', 'modify_home_query' ); 

Обратите внимание, что метод is_main_query() доступен только с WP v3.3.

Выше основного цикла в front-page.php или home.php или index.php (с условной инкапсуляцией):

 $stickyQuery = new WP_Query( array( 'cat' => $slider_cat, //Select posts from the slider category id 'ignore_sticky_posts' => 0, 'post__in' => get_option( 'sticky_posts' ), 'posts_per_page' => -1 //Get ALL the stickies ); while( $stickyQuery->have_posts() ) : $stickyQuery->the_post(); //... ( Sticky Post Template Here ) endwhile; wp_reset_query(); //... ( Main template loop here ) 

Как отметил Мило, независимо от того, хотите ли вы сосредоточиться на исправлении вашего запроса или создании $slider_cat , вы можете дважды проверить значение переменной $slider_cat чтобы убедиться, что оно является допустимым идентификатором категории.