$wpdb запрашивает тип записи в рамках определенного термина таксономии при заказе записей по пользовательскому мета-значению?


У меня есть пользовательский тип записи "событие", пользовательское мета-поле "event_date" и пользовательская таксономия "местоположения".

Я хочу запросить $wpdb для получения сообщений таким образом

  1. сообщения должны быть типа сообщения "событие"
  2. "события" должны быть связаны с определенным термином $location в таксономии "местоположения"
  3. результаты должны быть упорядочены по пользовательскому мета-значению 'event_date' (которое на самом деле является датой в формате yymmdd) по сравнению с сегодняшним текущая дата

Я пытаюсь использовать следующие параметры запроса (я могу правильно получить значение $location - либо ID, либо slug - и перейти к этому запросу):

SELECT  $wpdb->posts.* 
LEFT JOIN $wpdb->postmeta ON($wpdb->posts.ID = $wpdb->postmeta.post_id)
LEFT JOIN $wpdb->term_relationships ON($wpdb->posts.ID = $wpdb->term_relationships.object_id)
LEFT JOIN $wpdb->term_taxonomy ON($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
LEFT JOIN $wpdb->terms ON($wpdb->term_taxonomy.term_id = $wpdb->terms.term_id)
FROM    $wpdb->posts, $wpdb->postmeta
WHERE   $wpdb->posts.ID = $wpdb->postmeta.post_id 
AND     $wpdb->terms.term_id = $location
AND     $wpdb->term_taxonomy.taxonomy = 'locations'
AND     $wpdb->posts.ID = $wpdb->postmeta.post_id 
AND     $wpdb->posts.post_type = 'event'
AND     $wpdb->posts.post_status = 'publish' 
AND     $wpdb->postmeta.meta_key = 'event_date'
AND     $wpdb->postmeta.meta_value > NOW()
ORDER   BY $wpdb->postmeta.meta_value ASC
LIMIT   $numberofposts

Запрос не работает; если я удалю часть СОЕДИНЕНИЯ и часть таксономии, он будет работать, упорядочивая все результаты, сравнивая мету "дата события" с датой NOW().

Я думаю, что я делаю это неправильно с частью таксономии...

Как и было рекомендовано, я попытался выполнить WP_Query, а не $wpdb запрос:

$args = array(
               'post_type' => 'event',
               'tax_query' => array(
                                     array(
                                            'taxonomy' => 'locations',
                                            'field' => 'id',
                                            'terms' => $location // location term id
                                           )
                                    ),
               'meta_key' => 'event_date',  // this meta field stores event date in yymmdd format
               'meta_value' => $today,  // this would be today's date in yymmdd format
               'meta_compare' => '>=',
               'posts_per_page' => $numberofposts, // this variable stores the number of posts I want to get
               'orderby'=> 'meta_value_num'


  );

Однако в этом последнем случае запрос вернет ВСЕ записи с указанным типом post_type, независимо от любой другой спецификации в $args, включая порядок сортировки

Я пробовал использовать meta_query вместо meta_key, но результат не меняется

Author: unfulvio, 2012-09-02

1 answers

У вас есть опечатка в orderby, и meta_value_num используется только в качестве значения orderby, попробуйте это:

$args = array(
    'post_type' => 'event',
    'tax_query' => array(
        array(
            'taxonomy' => 'locations',
            'field' => 'id',
            'terms' => $location // location term id
        )
    ),
    'meta_key' => 'event_date',  // this meta field stores event date in yymmdd format
    'meta_value' => $today,  // this would be today's date in yymmdd format
    'meta_compare' => '>=',
    'posts_per_page' => $numberofposts, // this variable stores the number of posts I want to get
    'orderby'=> 'meta_value_num'
);
 2
Author: Milo, 2012-09-02 04:27:39