如何按属性的最小值和最大值过滤woocommerce产品?

时间:2017-03-18 11:36:56

标签: wordpress woocommerce

产品具有Tempo属性。这是一个输入数字的文本字段。

如何按最小和最大属性值对产品进行排序? 使用此类网址?filtering=1&filter_min-tempo=100&filter_max-tempo=150

是否可以创建整数类型的属性?

1 个答案:

答案 0 :(得分:1)

所有属性都存储为文本,但您可以将它们转换为您需要的类型。

看看这段代码:

function isequal($v1,$v2) {
    return intval($v1) == intval($v2);
}

function filter_loop_shop_post_in( $array ) { 
    if ( !array_key_exists('min_tempo',$_GET) && !array_key_exists('max_tempo',$_GET) ) return $array;
    global $wpdb;

    $min = isset( $_GET['min_tempo'] ) ? floatval( $_GET['min_tempo'] ) : 0;
    $max = isset( $_GET['max_tempo'] ) ? floatval( $_GET['max_tempo'] ) : 9999999999;

    $query = "
    SELECT DISTINCT
        tr.object_id
    FROM
        {$wpdb->term_relationships} AS tr
    LEFT JOIN
        {$wpdb->term_taxonomy} AS tt
    ON
        tr.term_taxonomy_id = tt.term_taxonomy_id
    LEFT JOIN
        {$wpdb->terms} AS t
    ON
        tt.term_id = t.term_id
    WHERE
        tt.`taxonomy` = 'pa_tempo' AND CAST(t.name AS DECIMAL(10, 1)) BETWEEN $min AND $max";

    $raw_results = $wpdb->get_results( $query );
    if (!sizeof($raw_results)) return $array;
    $results = array();
    foreach ($raw_results as $res) {
        $results[] = intval($res->object_id);
    }
    if (!sizeof($array)) return $results;
    return array_uintersect($results, $array, 'isequal');
}; 
add_filter( 'loop_shop_post_in', 'filter_loop_shop_post_in', 10, 1 );

它适用于WooCommerce 2.6.14。