2015-11-24 5 views
0

У меня есть эти данные:Сортировать по стоимости таможенные в WordPress

id  meta_key meta_value 
1  d_t_w  4 weeks 
2  d_t_w  2 Days 
3  d_t_w  3 Weeks 
4  d_t_w  4 Days 
5  d_t_w  1 Week 

WP запрос:

$query['orderby'] = 'd_t_w'; 
$query['order'] = ASC; 
$query = new WP_Query($query); 

Результат:

id  meta_key meta_value 
    5  d_t_w  1 Week 
    2  d_t_w  2 Days 
    3  d_t_w  3 Weeks 
    4  d_t_w  4 Days 
    1  d_t_w  4 weeks 

но то, что я ожидал:

id  meta_key meta_value 
2  d_t_w  2 Days 
4  d_t_w  4 Days 
5  d_t_w  1 Week 
3  d_t_w  3 Weeks 
1  d_t_w  4 weeks 

Как можно применить заказ на пользовательские значения, такие как (1 день, 2 дня, 3 дня, ..., 3 недели, 4 недели)

ответ

0

в необработанном языке запросов (wordpress indipendent), вы можете извлечь свое поле и рассчитать дни строки заказа в запросе

как этого

SELECT 
    * 
FROM (
    SELECT '1 Week' as c 
    UNION ALL SELECT '2 Days' 
    UNION ALL SELECT '3 Days' 
    UNION ALL SELECT '3 Weeks' 
    UNION ALL SELECT '1 Day' 
    ) as t 
ORDER BY TRIM(SUBSTR(t.c, 1, LOCATE(' ', t.c))) * 
    IF(TRIM(SUBSTR(LOWER(t.c), LOCATE(' ', t.c))) = 'week', 7, 
     IF(TRIM(SUBSTR(LOWER(t.c),LOCATE(' ', t.c))) = 'weeks', 7, 
      IF(TRIM(SUBSTR(LOWER(t.c), LOCATE(' ', t.c))) = 'day', 1, 
       IF(TRIM(SUBSTR(LOWER(t.c), LOCATE(' ', t.c))) = 'days', 1, 
        1)))) ASC; 
+0

Я хочу это в WP_Query пожалуйста. –

0

Ваш запрос должен выглядеть так:

$args = array(
'orderby' => 'meta_value', 
'meta_key' => 'meta_value', 
'order'  => 'ASC', 
); 
$query = new WP_Query($args); 

справочного веб-страница: https://codex.wordpress.org/Class_Reference/WP_Query

+0

это не моя проблема, моя проблема заключается в том, чтобы заказать d_t_w, и это поле является строкой, и мне нужно заказать его как раз: за 5 дней до 2 сорняков, но если мы закажем его, как строка 2 недели будет до 5 дней и это неправда. –

0

Вы можете запросить обычную дату/время order_by ASC/DESC, а затем преобразовать метазначение в d_t_w.

+0

в дизайне WP, пожалуйста? –

1

если в вас суффиксом таблице meta_value такие же, как недели, дни вы можете использовать этот подход

SELECT meta_value, 
REPLACE(
REPLACE(
REPLACE(REPLACE(meta_value,' weeks','00'),' week','00'),' Days','0'),' Day','0' 
    ) as odr 
FROM `product` 
ORDER by CAST(odr AS UNSIGNED) 
0

Я решил проблему путем добавления фильтра:

add_filter('posts_orderby', 'deliver_to_weeks', 11, 2); 
    function deliver_to_weeks($orderBy, $query) { 

     $orderBy = str_ireplace('wp_postmeta.meta_value', "field(wp_postmeta.meta_value, '1 Day', '2 Days', '3 Days', '4 Days', '5 Days' , '1 Week', '2 Weeks', '3 Weeks', '4 Weeks')", $orderBy); 
     return $orderBy; 
    } 
Смежные вопросы