новый запрос 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 перед загрузкой страницы архива).

Кто-нибудь может мне помочь?

Author: Joel M, 2016-05-06

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() таким образом!

 1
Author: Sumit, 2017-04-13 12:37:48