根据帖子元值计算的自定义顺序对WP查询帖子进行排序

时间:2020-07-14 作者:houssameddin

我正在使用wordpress REST API查询数据库。对于每个产品(一个自定义帖子),我都有一个metaproduct_price 以某种货币计价currency_rate.我需要运行查询以获取所有订购的产品ASC或DESC,具体取决于product_price . 但是,由于每个价格使用不同的货币,查询需要首先将所有价格转换为一种通用货币,然后按所选的顺序对其进行排序。我做不到这一点。我找到了这个链接wordpress orderby filter 但我不知道如何使用它。文件对我来说一点都不清楚。我需要通过以下类似的方式修改订单

$args = array(
        \'post_type\' => \'product\',
        \'meta_key\' => \'product_price\',
        \'orderby\'   => \'meta_value_num\',
        \'order\' => \'ASC\'
        );
$q = new WP_Query($args);

add_filter( \'posts_orderby\', \'filter_query\',10,2 );

function filter_query($orderby_statement, $wp_query) {
    $orderby_new_statement = \'product_price*currency_rate ASC\';
    return $orderby_new_statement;
}
我需要做的是将每个价格乘以一个转换率,并将其输入到查询中,以正确的顺序给我帖子。我现在被卡住了。谢谢你的帮助。

1 个回复
SO网友:mozboz

所以我认为有两种解决方案。

预先计算此值。如果可以的话,我建议你看看这个。可能会挂接到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_postmetamt1

按过滤顺序

因此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查询的实现发生更改,这可能会中断

所有部件一起

$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\');

相关推荐

OrderItem GET_TOTAL()返回的值小于$ORDER_ITEM->GET_PRODUCT()->GET_PRICE()*数量

我有个奇怪的问题。我在一个订单项目中循环,如下所示:foreach($order->get_items() as $order_item) { 但是,价格是:7400 还有2 但是get_total() 退货11840 而不是预期的14800 - 怎么会这样?$order_item->get_product()->get_price() // returns 7400 $order_item->get_quantity() // returns 2 $or