所以我认为有两种解决方案。
预先计算此值。如果可以的话,我建议你看看这个。可能会挂接到post save钩子中,并执行一个简单的操作以将计算出的价格保存到新的元值中。这样可以保存下面复杂的代码。
可以完全按照您所说的那样使用WP\\u查询来实现这一点,下面是如何实现的。这将尽可能多地按照WP\\u Query的方式进行操作,然后进行一个小技巧,按照您的建议创建一个自定义ORDER BY子句,否则单独使用WP Query args是不可能实现的。
首先,确保WP Query两次连接到post元表,并且我们有两个所需的元值:
$args = array(
\'meta_query\' => array(
\'relation\' => \'AND\',
array(
\'key\' => \'currency_rate\',
\'compare\' => \'EXISTS\',
),
array(
\'key\' => \'product_price\',
\'compare\' => \'EXISTS\',
),
),
);
这会导致WP\\U Query设置如下所示的查询:
SELECT SQL_CALC_FOUND_ROWS wp_posts.* FROM wp_posts
INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id )
INNER JOIN wp_postmeta AS mt1 ON ( wpposts.ID = mt1.post_id )
所以我们有两个连接所需的值
wp_postmeta
和
mt1
按过滤顺序
因此
ORDER BY
很容易写,因为它是
meta_value
这两个表中的键相乘:
function orderByPriceTimesCurrency($orderby, $wpq) {
global $wpdb;
return $wpdb->prefix . "postmeta.meta_value * mt1.meta_value ASC";
}
add_filter(\'posts_orderby_request\', \'orderByPriceTimesCurrency\', 10, 2);
我对此进行了测试,效果很好,但是我对变量使用了不同的名称,所以如果您有任何问题,请告诉我。
重要注意事项
它依赖于了解WP\\u查询的内部工作方式,尤其是WP\\u查询连接到元表的方式。如果WP\\U查询的实现发生更改,这可能会中断它只会找到同时设置了两个元数据的帖子,以避免复杂性,这将完全覆盖ORDER BY,因此在此查询中,您不能指定任何其他WP\\U查询顺序参数。您必须手动将它们添加到过滤器中,或者更改过滤器,使其以某种方式附加order语句,而不是替换它们
所有部件一起
$args = array(
\'meta_query\' => array(
\'relation\' => \'AND\',
array(
\'key\' => \'currency_rate\',
\'compare\' => \'EXISTS\',
),
array(
\'key\' => \'product_price\',
\'compare\' => \'EXISTS\',
),
),
);
function orderByPriceTimesCurrency($orderby, $wpq) {
global $wpdb;
return $wpdb->prefix . "postmeta.meta_value * mt1.meta_value ASC";
}
add_filter(\'posts_orderby_request\', \'orderByPriceTimesCurrency\', 10, 2);
$q = WP_Query($args);
remove_filter(\'posts_orderby_request\', \'orderByPriceTimesCurrency\');