Intereting Posts
Дополнительные темы – хорошо или плохо? Как добавить пользовательские классы в тег HTML тега WordPress? Как настроить страницу параметров на панели управления? Как манипулировать всплывающим окном «добавить медиа» add_query_arg для сравнения и отображения событий с определенной даты Как перепроектировать загрузчик фонового изображения Twenty Eleven? Можно ли публиковать сообщения в типе персонализированной персонализации? Мне нужно подготовить запрос до get_results (), get_row () и get_var ()? Custom Post Type Loop выдает ошибку 500 при использовании в виджетах Добавить поле в редактор таксономии? Загружать содержимое в div с помощью ajax Нужно ли сахаровать печенье до его сохранения? Изменение всплывающего окна Simple Facebook Connect Запрос, чтобы вернуть только два новых вложения (изображения)? Показать предварительный загрузчик ajax для больших изображений в сообщениях

Использование pre_get_posts с WP_Query

Я читал превосходный ответ Стивена Харриса на этот вопрос относительно использования WP_query() , query_posts() и pre_get_posts .

Он говорит: «pre_get_posts – это фильтр для изменения любого запроса. Он чаще всего используется для изменения только« основного запроса ».

Можно использовать pre_get_posts для фильтрации только определенного вторичного запроса, созданного с помощью WP_Query ? например.

 $my_secondary_loop = new WP_Query(...); if( $my_secondary_loop->have_posts() ): while( $my_secondary_loop->have_posts() ): $my_secondary_loop->the_post(); //The secondary loop endwhile; endif; wp_reset_postdata(); 

Любая помощь очень ценится.

Самый простой способ – добавить действие непосредственно перед запросом и сразу же удалить его .

 add_action('pre_get_posts', 'some_function_in_functionsphp'); $my_secondary_loop = new WP_Query(...); remove_action('pre_get_posts', 'some_function_in_functionsphp'); if( $my_secondary_loop->have_posts() ): while( $my_secondary_loop->have_posts() ): $my_secondary_loop->the_post(); //The secondary loop endwhile; endif; wp_reset_postdata(); 

РЕДАКТИРОВАТЬ

Другой способ, который вы можете использовать, – установить свой собственный запрос var и проверить его на крючке:

 // tell WordPress about our new query var function wpse52480_query_vars( $query_vars ){ $query_vars[] = 'my_special_query'; return $query_vars; } add_filter( 'query_vars', 'wpse52480_query_vars' ); // check if our query var is set in any query function wpse52480_pre_get_posts( $query ){ if( isset( $query->query_vars['my_special_query'] ) ) // do special stuff return $query; } add_action( 'pre_get_posts', 'wpse52480_pre_get_posts' ); 

и в шаблоне:

 // set the query var (along with whatever others) to trigger the filter $args = array( 'my_special_query' => true ); $my_secondary_loop = new WP_Query( $args ); 

pre_get_posts запускается для каждого почтового запроса:

  • get_posts ()
  • новый WP_Query ()
  • Этот случайный недавний виджет сообщений, установленный вашим клиентом, без вашего ведома.
  • Все

– @nacin

С учетом сказанного, если вы не исключаете свой фильтр, используйте условное: is_main_query() тогда ваш фильтр загорится на вашем новом WP_Query.

Если вы хотите только настроить таргетинг на свой новый WP_Query, тогда нет способа сделать это.