2013-03-30 6 views
0

У меня есть школьное расписание, как пользовательский тип сообщения. Каждый пост является классом школы с метой-полем после содержащего двух текстовых полей для задания часов и минуты, что класс начинается в 24-часовой формат:Соединить два мета-ключа?

_start_hour 
_start_minute 

Я пытаюсь выводить сообщения в порядке в соответствии с время, например

// the args 
$args = array(
    'post_type' => 'my-cpt', 
    'meta_key' => '???????', 
    'orderby' => 'meta_value_num', 
    'order' => 'ASC', 
    'posts_per_page' => -1, 
); 

// The Query 
$the_query = new WP_Query($args); 

    while ($the_query->have_posts()) : $the_query->the_post(); 

      // ordered output according to time 

      endwhile; 

В 'meta_key' есть способ, которым я могу объединить два мета-ключа?

Я пробовал 'meta_key' => '_start_hour' && '_start_minute', но это нарушает запрос.

ответ

2

К сожалению, wordpress не поддерживает эту функцию, вам придется отсортировать ее самостоятельно после извлечения из базы данных и до цикла.

Disclaimer примечание Это очень некрасиво дизайн, но это Wordpress, так что вы должны играть с тем, что вы получаете, вы можете сделать его менее уродливым, если вы Откат к написанию SQL запросов самостоятельно, зависит от производительности в Мое мнение, так как Wordpress может быть зверьем для деградации производительности, если не обрабатываться должным образом, вы должны подумать о том, чтобы сделать его с SQL-запросами.

// Fetch all posts - (1 SQL Query) 
$query = new WP_Query(array(
    'post_type' => 'my-cpt', 
    'order' => 'ASC', 
    'posts_per_page' => -1, 
)); 

foreach ($query->posts as &$post) { // N queries as the number of posts you have - totally inefficient 
$post->meta = get_post_meta($post->ID); 
} 

usort($query->posts, function($a, $b) { 
    $a_time = strtotime($a->meta['_start_hour'][0] . ':' . $a->meta['_start_minute'][0]); 
    $b_time = strtotime($b->meta['_start_hour'][0] . ':' . $b->meta['_start_minute'][0]); 
    if ($a_time > $b_time) 
     return 1; 
    else if ($a_time < $b_time) 
     return -1; 
    else 
     return 0; 
}); // Sorting by date 

... the_loop ... 

отмечают, что это совершенно не тестировалась поэтому он должен просто дать вам указатели на час вы должны сделать это, и я снова говорю, вы должны реорганизовать это присоединиться к мета ключи заранее, таким образом, вы можете, возможно, уже сортировать его с помощью SQL вместо PHP ...

+0

любые советы о том, как? – user1444027

+0

обязательно, я отредактирую ответ. – gmaliar

+0

Фантастический, спасибо. Это отличное начало. – user1444027

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