有这种情况。我正在建立一个WordPress网站来销售一些产品。问题是,产品的价格存储为元价值,但产品价格可以是不同的货币。现在的问题是,我必须对所有产品进行价格筛选,无论价格以何种货币表示,筛选货币都是在后台配置的,并且没有该货币价格的产品必须通过货币兑换税进行筛选,但如果我可以按货币等价价格进行筛选,我真的不知道如何构建meta\\u查询。
例如,我有两种产品:
产品1-价格:10-货币:美元
产品2-价格:1000-货币:xxx
过滤器设置为使用usd并查找0到10之间的价格。因此,这次搜索将返回产品1,但从xxx到美元的货币换算为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\\u货币的产品。
最合适的回答,由SO网友:Tom J Nowell 整理而成
No, not without using filters to insert raw SQL, 您可以进行比较,例如大于、小于,但不能进行范围比较,但即使如此,这也是一个非常慢的查询,这样做是一个坏主意:
当post meta表已经知道post ID时,它会针对查找meta进行优化,分类表是为您搜索包含已知数据的帖子而构建的。这是因为在post meta中搜索post的速度非常慢,添加一个数学操作会阻止数据库使用索引,迫使数据库进行表扫描,其中必须测试每一行,以构建一个临时表,最终查询可以在该临时表上运行,您在不知不觉中在速度和准确度之间进行了权衡,并选择了完美的准确度,没有意识到速度的牺牲可能是极端的,并且随着后元数量的增加而变得越来越大
相反,可以使用分类法和自动指定常用价格范围的术语,并使用这些术语进行筛选。这样,您仍然可以在post meta中存储准确的价格,但您有了一种按价格搜索物品的更快方法。此外,UI的实现变得更加简单