Intereting Posts
Как изменить ограничение размера загружаемого файла в однопользовательской установке WordPress? Как изменить требуемую слитность пользовательской таксономии? WordPress и простые форумы Мне нужно подключить и изменить язык facebook sdk Могут ли плагины, которые фильтруют содержимое сообщения, работать с сообщениями Word 2007? создать новый сайт-сайт в wordpress multisite пользователем-подписчиком вместо сетевого администратора Многоуровневая установка с несколькими доменами, т.е. (www.exampleone.com, www.exampletwo.com) wordpress alchemy помещает пользовательский метабокс только на определенную страницу Pagination не работает с пользовательским запросом Контролируемая публикация в WordPress Усечение настраиваемых полей Изменение ходока для вставки описания родителя над подменю 302 вместо 301 после переключения на HTTPS Багги wp_nav_menu? post_mime_types Фильтр не работает в режиме списка

Использование WP_Query с несколькими циклами на одной странице в search.php

Я пытаюсь настроить страницу поиска, в которой сначала отображается Loop со всеми сообщениями с мета-ключю Custom Search из 'seek_premium', где meta_value является «yes», а затем второй Loop, где meta_value (тот же meta_key) пуст. У меня это работает по большей части, но способ, которым я занимаюсь, кажется, нарушает функцию поиска по умолчанию, в том случае, если я выполняю поиск, независимо от того, содержит ли сообщение поисковый запрос или нет, я в конечном итоге видя все сообщения, помеченные как «seek_premium» в первом цикле, и все сообщения, где «seek_premium» пуст во втором. Вот мой код:

<?php if ( have_posts() ) : ?> <h1>My Heading</h1> <?php $premium_query = new WP_Query( array( 'meta_key' => 'seek_premium', 'meta_value' => 'yes' ) ); while ( $premium_query->have_posts() ) : $premium_query->the_post(); $seekpremium = get_post_meta( $post->ID, 'seek_premium', true ); ?> SHOW PREMIUM POSTS <?php endwhile; ?> <?php $free_query = new WP_Query( 'post_per_page=50' ); while ( $free_query->have_posts() ) : $free_query->the_post(); $seekpremium = get_post_meta( $post->ID, 'seek_premium', true ); if ( !empty( $seekpremium ) ) continue; ?> SHOW FREE POSTS <?php endwhile; ?> <?php else : ?> <?php include ( TEMPLATEPATH . "/unknown.php" ); ?> <?php endif; ?> 

У кого-нибудь есть идеи? Я видел что-то об использовании $ is_search в качестве параметра, но либо не выполняю его правильно, либо что-то еще с моим запросом не так …

Хорошо, я просто что-то взбивал, это должно это сделать, но это непроверено.

 <?php $premium_args = array( 'post_status' => 'publish', 'meta_query' => array( array( 'key' => 'seek_premium', 'value' => 'yes' ) ) ); $premium_posts = new WP_Query( $premium_args ); ?> <?php foreach( $premium_posts as $p ) : ?> Your output here <?php endforeach; ?> <?php $free_args = array( 'post_status' => 'publish', 'meta_query' => array( array( 'key' => 'seek_premium', 'value' => 'yes', 'compare' => '!=' ) ) ); $free_posts = new WP_Query( $free_args ); ?> <?php foreach( $free_posts as $p ) : ?> Your output here <?php endforeach; ?> <?php if( 0 == count( $premium_posts ) && 0 == count( $free_posts ) ) : ?> No results <?php endif; ?> 

Я также чувствую, что это намного легче читать и следовать, чем ваш текущий код, поэтому, если вы оба работаете, как правило, лучше всего использовать тот, который наиболее читабельен. Естественно, с этим вы можете реализовать have_posts() и т. Д., Но я просто хотел получить общую идею, а именно, используя meta_query.

Попробуйте это один раз и посмотрите, не изменилось ли это:

 <?php if (have_posts()) : ?> <h1>My Heading</h1> <?php $premium_query = new WP_Query(array('meta_key' => 'seek_premium', 'meta_value' => 'yes' )); while ($premium_query->have_posts()) : $premium_query->the_post(); $seekpremium = get_post_meta($post->ID, 'seek_premium', true); ?> SHOW PREMIUM POSTS <?php endwhile; wp_reset_postdata(); ?> <?php $free_query = new WP_Query('post_per_page=50'); while ($free_query->have_posts()) : $free_query->the_post(); $seekpremium = get_post_meta($post->ID, 'seek_premium', true); if ( !empty( $seekpremium ) ) continue; ?> SHOW FREE POSTS <?php endwhile; ?> <?php else : ?> <?php include (TEMPLATEPATH . "/unknown.php"); ?> <?php endif; ?> 

Я добавил в wp_reset_postdata() там, где (чтобы процитировать Codex) делает следующее: «После цикла с помощью отдельного запроса эта функция восстанавливает глобальную $post в текущую запись в основном запросе». Не тестировал это, просто подумал, что я брошу это там.

Это очень легко сделать только с одним запросом и одним циклом. Измените свой запрос на заказ с помощью мета-ключа …

 add_filter('request', 'check_requests_for_search' ); function check_requests_for_search( $request ) { $dummy_query = new WP_Query(); $dummy_query->parse_query( $request ); if ( $dummy_query->is_search() ) { $request['orderby'] = 'meta_value menu_order title'; $request['meta_key'] = 'seek_premium'; $request['order'] = 'DESC'; } return $request; } 

Обратите внимание, что я заказал second by menu_order, а затем название здесь, только потому что это кажется довольно логичным. В любом случае, это позволяет вам иметь нормальную разбивку на страницы, и все должно продолжаться, как и следовало ожидать.

Если вы хотите разделить разделы вверх, вы все равно можете сделать это в одном цикле; поместите if-предложение в цикл, который проверяет, когда изменяется значение seek_premium.

Приветствия ~

Я нашел то, что мне нужно здесь: http://deadlyhifi.posterous.com/separate-posts-and-pages-in-wordpress-search

По сути, мне нужно было знать, как поддерживать основной запрос WP сгенерированный (поэтому он знал, чтобы сохранить его как результат поиска или просто выполнить точный запрос, который я вызывал в файле search.php).

Спасибо всем за ваш вклад!