【问题标题】:Wordpress ordered by two custom fields meta_key'sWordpress 按两个自定义字段 meta_key 排序
【发布时间】:2015-08-11 21:16:31
【问题描述】:

我有一个使用一个元键('countdown_date'or'hour')的 Woocomerce 查询。

它按自定义'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;  
    }

【问题讨论】:

  • 我一直在寻找一个小时来尝试在 woocommerce_get_catalog_ordering_args 挂钩中找到它。令人惊讶的是,这并不简单。

标签: php wordpress woocommerce


【解决方案1】:

将两个元键添加到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

【讨论】:

  • 嗨,Rene,感谢您在这方面的帮助。感兴趣的网址是:epicentre.tv
  • 我已将函数和过滤器添加到functions.php 文件中。更新了 $args。结果与刚刚订购但 countdown_date 相同。不知道从这里到哪里。你的方法看起来很棒,只是不明白为什么它没有加快时间。小时剂量用作单个元键。
  • @Frithir.com 事实证明,您不能设置客户orderby,请参阅WP Order & Orderby Parameters。此外,postmeta 表的名称略有不同。很抱歉造成混淆。我已经编辑了我的答案。
  • 感谢 Rene,它现在正在处理我的家庭自定义模板。是时候把它变成函数了,这样我也可以在存档页面上使用它。 :)
  • 您是否有机会查看问题的更新以将其也包含在函数中?
猜你喜欢
  • 2017-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多