Wordpress由两个自定义字段meta_key排序

时间:2015-05-29 06:06:35

标签: php wordpress woocommerce

我有一个Woocomerce查询使用一个meta_key('countdown_date''hour')。

按自定义'meta_key' => 'countdown_date' 'hour'orders them using 'orderby' => 'meta_value_num'对产品进行排序。

我需要加入两个meta_key's。 ('hour'键仅返回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;  
    }

1 个答案:

答案 0 :(得分:2)

将两个元键添加到meta_query并将orderby设置为meta_value。然后你可以用posts_orderby hook替换它。

<?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