2015-05-29 4 views
2

У меня есть запрос Woocomerce, который работает с одним meta_key ('countdown_date' или 'hour').Wordpress заказано двумя настраиваемыми полями meta_key

Это сортирует продукты по обычаю 'meta_key' => 'countdown_date'или'hour' и orders them using 'orderby' => 'meta_value_num'.

Мне нужно присоединиться к двум meta_key's вместе. (ключ «час» возвращает только первые два значения времени 24hr).

Результат требуется, товаров, заказанные два настраиваемых полей countdown_date и часа

$args = array(
      'posts_per_page' => 20, 
      'tax_query' => array(
       'relation' => 'AND', 
       array(
        'taxonomy' => 'product_cat', 
        'field' => 'slug', 
        'terms' => 'live-events' 
       )), 
      'post_type' => 'product', 
      'meta_key' => 'countdown_date', 
// need to add second meta key here 'meta_key' => 'hour', 
      'orderby' => 'meta_value_num', 
      'order' => 'ASC' 
      ); 
     $the_query = new WP_Query($args); 

Я смотрел нагрузки подобных вопросов без каких-либо результатов.

Две петли кажутся излишними, и добавление meta_query не работает для меня.

Любая помощь будет отличной. :)

Полный рабочий код в поле ниже ответ от @Rene_Korss

Могу ли я получить руку добавить это functions.php так, что архив будет сортировать точно так же, как пользовательский цикл.

Ниже приведена упрощенная версия функции, в которой я работал. Мне также нужно добавить два meta_key.

add_filter('woocommerce_get_catalog_ordering_args','wdm_change_ordering',10,1); 
     function wdm_change_ordering($args) { 
      if(is_product_category()) { 

        $args['meta_key'] = 'countdown_date'; 
// need to add second meta key here $args['meta_key'] = 'hour', 
        $args['orderby'] = 'meta_value'; 
        $args['order'] = 'ASC'; 

       } 
    return $args; 
    } 

ответ

2

Добавить как мета ключи к meta_query и установить orderby в meta_value. Затем вы можете заменить его на крючок posts_orderby.

<?php 

// Override orderby if orderby value = 'meta_value' 
function orderby_countdown_date_and_hour($orderby){ 
    return str_replace('meta_value', 'meta_value, mt1.meta_value', $orderby); 
} 

$args = array(
    'post_type'  => 'product', 
    'posts_per_page' => 20, 
    'tax_query'  => array(
     'relation' => 'AND', 
     array(
      'taxonomy' => 'product_cat', 
      'field' => 'slug', 
      'terms' => 'live-events' 
     ) 
    ), 
    'meta_query' => array(
     array(
      'key'  => 'countdown_date', 
      'value' => '', 
      'compare' => '!=' 
     ), 
     array(
      'key'  => 'hour', 
      'value' => '', 
      'compare' => '!=' 
     ) 
    ), 
    'orderby' => 'meta_value', 
    'order'  => 'ASC' 
); 

// Replace orderby 
add_filter('posts_orderby', 'orderby_countdown_date_and_hour'); 

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

// Remove our orderby 
remove_filter('posts_orderby', 'orderby_countdown_date_and_hour'); 

Это приводит к

ORDER BY dbprefix_postmeta.meta_value, mt1.meta_value ASC 

, что означает

ORDER BY countdown_date, hour ASC 
+0

Эй Рене, спасибо за вашу помощь с этим. URL-адрес, если вам интересно: http://epicentre.tv –

+0

Я добавил функцию и фильтры в файл functions.php. Обновлен $ args. Результаты такие же, как если бы они были заказаны, а countdown_date. Не уверен, где отсюда. Вы подходите отлично, просто не можете понять, почему он не набирает час. Часовая доза работает как единый мета-ключ. –

+0

@ Frithir.com Как оказалось, вы не можете установить custome 'orderby', см. [Параметры заказа и порядка WP] (https://codex.wordpress.org/Class_Reference/WP_Query#Order_.26_Orderby_Parameters). Кроме того, таблицы postmeta называются немного разными. Извините за недопонимание. Я отредактировал свой ответ. –

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