2016-02-24 4 views
-1

Надеюсь, что кто-то может помочь, я сейчас работаю над сборкой для соревнований - объект предназначен для того, чтобы пользователи могли угадать время, затрачиваемое эскапологом на выполнение акта, d имеют следующий сценарий:Поиск ближайших значений в массиве

Act 1 - Escapologist заканчивается в 2mins 30 секунд

Скажем, у вас есть 5 догадок:

Имя 1: 1мин 20

Имя 2: 2мин 20

Имя 3: 5мин 50

Имя 4: 6min 10

Имя 5: 3мин 40

Когда escapologist закончил, они хотели бы иметь возможность показать 4 основных результатов, так в данном случае это будет:

Имя 2: 2мин 20

Имя 1: 1мин 20

Имя 5: 3мин 40

Имя 3: 4min 50

Я использую WordPress на данный момент, так что мой запрос

$args = array(
'post_type' => 'entry', 
'posts_per_page' => 4, 
'order'  => 'ASC', 
'orderby' => 'meta_value_num', 
'meta_key' => 'in_seconds', 

'meta_query' => array(
    'relation' => 'AND', 
    array(
     'key'  => 'act', 
     'value' => $post->ID, 
     'compare' => '=', 
    ), 
    array(
     'key'  => 'in_seconds', 
     'value' => $seconds, 
     'type' => 'numeric', 
     'compare' => '>=', 
    ), 
), 
); 

Это заставляет меня самые близкие значения, но только если они выше, не ниже , Очевидно, я предпочел бы, если бы был способ сделать это с помощью wp_query, но если бы кто-нибудь знал способ сделать это (даже это был тяжелый многократный цикл), я был бы всегда благодарен!

Для справки, все догадки хранятся в базе данных за считанные секунды.

Надеюсь, вы сможете помочь! Спасибо, Andy :)

ответ

0

Я боюсь, что достичь того, чего вы хотите, просто используя простой WP_Query, невозможно. Хотя вы должны иметь возможность заказывать сообщения по абсолютной величине разницы между сообщениями секунд и желаемыми секунд. Ваш код будет что-то вроде:

$args = array(
    'posts_per_page' => 4, 
    'order'  => 'ASC', 
    'orderby' => 'meta_value_num', 
    'meta_key' => 'in_seconds', 
    'meta_query' => array(
     'relation' => 'AND', 
     array(
      'key'  => 'act', 
      'value' => $post->ID, 
      'compare' => '=', 
     ), 
    ), 
); 

posts_orderby фильтр изменить поведение заказа:

global $seconds_where; 
$seconds_where = $seconds; 
function seconds_posts_orderby($orderby) { 
    $orderby = " ABS($seconds - meta_value) ASC"; 
    return $orderby; 
} 
add_filter('posts_orderby', 'seconds_posts_orderby'); 
$my_query = new WP_Query($args); 
remove_filter('posts_orderby', 'seconds_posts_orderby'); 

Это только начало, но я надеюсь, что это помогает.

+0

Это именно то, что мне нужно, работает! Огромное спасибо!!! – imandypugh

+0

Добро пожаловать, @imandypugh! Можете ли вы принять ответ так? : D –

+0

Это не позволит мне почему-то Фелипе, я думаю, потому что я новый пользователь? Как только это позволит мне, я соглашусь! Спасибо! – imandypugh

Смежные вопросы