новый запрос WP для получения мета-значения максимальной цены не работает
Итак, я пытаюсь получить максимальную цену за все "свойства" (пользовательский тип записи).
$max_price_query = new WP_query(array(
'posts_per_page' => -1,
'post_status' => 'publish',
'post_type' => 'properties',
'nopaging' => true,
'orderby' => 'meta_value_num',
'meta_key' => '_price',
'order' => 'DESC',
));
if ($max_price_query->have_posts()) {
while ($max_price_query->have_posts()) : $max_price_query->the_post();
$pid = $post->ID;
$price_max = get_post_meta($pid, '_price', true);
echo '<pre>' . $pid . '</pre>';
endwhile;
wp_reset_postdata();
}
Первая проблема заключается в том, что они упорядочены по идентификатору, а не по цене. Свойства называются Свойством 1, Свойством 2 и т. Д., Поэтому в данном случае упорядочено по идентификатору == упорядочено по названию == упорядочено по дате.
Вторая проблема заключается в том, что перед упорядочиванием по идентификатору они фактически упорядочиваются другим мета_значением, называемым _featured_prop (которое равно 0 или 1). Ну, это потому, что я также есть следующее:
function set_query_parameters($query) {
if( !is_admin() && is_main_query() && is_post_type_archive( 'properties' ) ) {
$query->set('meta_key', '_featured_prop');
return $query;
}
add_action( 'pre_get_posts', 'set_query_parameters' );
Я не понимаю, почему этот pre_get_posts, похоже, влияет на мой новый WP_Query, так как я указал "is_main_query()" в операторе if. Я думал, что это не повлияет на мой вторичный запрос.
При повторении идентификаторов я, по сути, получаю: 26, 24, 20, 27, 25, 23, 22, 21, 19. Где 26, 24 и 20 имеют _featured_prop = 1.
Если это имеет какое-либо значение, первый фрагмент кода вызывается в sidebar.php файл, который вызывается в archive-properties.php . В другом месте, в файле функций, я вызываю функцию во втором фрагменте кода (поскольку вы не можете выполнить add_action pre_get_posts после запуска pre_get_posts перед загрузкой страницы архива).
Кто-нибудь может мне помочь?
1 answers
Как @Milo предложил, а также кодексно задокументировал это is_main_query в рамках_the_hood
Эта функция является псевдонимом метода
WP_Query::is_main_query()
. В обратных вызовах фильтра или действия, которые передаются объектуWP_Query
, напримерpre_get_posts
, вызов этой функции является циклическим. Вместо этого непосредственно вызовите метод переданного объекта. Например, если ваш обратный вызов фильтра присваивает переданному объектуWP_Query
значение$query
, вы могли бы вызвать метод следующим образом:$query->is_main_query()
Вы должны изменить проводимость на
function set_query_parameters($query) {
if( !is_admin() && $query->is_main_query() && is_post_type_archive( 'properties' ) ) {
$query->set('meta_key', '_featured_prop');
}
}
add_action( 'pre_get_posts', 'set_query_parameters' );
Нет необходимости возвращать запрос. И я действительно удивляюсь, почему вы не получаете УВЕДОМЛЕНИЯ, потому что WordPress также запускает _doing_it_wrong()
при использовании is_main_query()
таким образом!