是否可以通过数学运算创建WP_Query?

时间:2018-06-26 23:14:48

标签: wordpress

我有这种情况。我正在建立一个WordPress网站来出售某些产品。事实是,产品的价格存储为元值,但是产品价格可以使用不同的货币。现在的问题是,无论价格是什么货币,我都必须对所有产品进行价格过滤,在后台配置过滤货币,并且没有该货币价格的产品必须是按货币兑换税过滤,但是我真的不知道如何构建等价于我的货币等价查询的元查询。

例如,我有这2种产品:

产品1 -价格:10 -currency:美元

产品2 -价格:1000 -货币:xxx

过滤器设置为使用 usd 并找到介于0到10之间的价格。因此,这次搜索将返回产品1 ,但货币转换为 xxx usd 为500到1,产品2 的等效价格为 2美元,因此必须将其包括在搜索结果。

直到现在这是我的代码中处理价格过滤器的部分:

if (
    isset($_REQUEST['max_price']) && $_REQUEST['max_price'] &&
    isset($_REQUEST['min_price']) && ($_REQUEST['min_price'] || $_REQUEST['min_price'] == 0)
) {
    $main_currency = cs_get_option('main_currency');
    $ex_currency = array_diff(['xxx', 'usd'], [$main_currency])[1];

    $args['meta_query'] [] =
        array(
            'relation' => 'AND',
            array(
                'key' => 'price_meta_key',
                'value' => array($_REQUEST['min_price'], $_REQUEST['max_price']),
                'type' => 'numeric',
                'compare' => 'BETWEEN',
            ),
            array(
                'key' => 'product_currency',
                'value' => $main_currency,
                'compare' => '='
            )
        );
}

但这只会过滤使用 $ main_currency 货币的产品。

1 个答案:

答案 0 :(得分:1)

您可以建立与多种货币匹配的查询:

// Define currencies and exchange rates

$currencies = array(
    'usd' => 1,
    'eur' => 0.86
);

// Generate a term for each currency

$terms = array();

foreach ($currencies as $currency => $rate) {
    // Match the currency code and the converted price range

    $terms[] = array(
        'relation' => 'AND',

        array(
            'key' => 'product_currency',
            'value' => $currency
            'compare' => '='
        ),

        array(
            'key' => 'price_meta_key',
            'value' => array(
                $_REQUEST['min_price'] * $rate,
                $_REQUEST['max_price'] * $rate
            ),
            'type' => 'numeric',
            'compare' => 'BETWEEN'
        )
    );
}

// Finally OR the terms together

$args['meta_query'][] = array(
    'relation' => 'OR',
    $terms
);