woocommerce:尽管应用了排序标准,但最终还是会对缺货产品进行排序

vaqhlq81  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(422)

我已经能够使用以下代码片段以默认排序在末尾显示缺货产品:

/**
 * @snippet       Order out of stock products at the end - WooCommerce
 * @author        Sebastian Velandia
 * @compatible    WooCommerce 3.8.0
 */
add_filter('posts_clauses', 'order_by_stock_status');
function order_by_stock_status($posts_clauses) {
    global $wpdb;
    // only change query on WooCommerce loops
    if (is_woocommerce() && (is_shop() || is_product_category() || is_product_tag() || is_product_taxonomy())) {
        $posts_clauses['join'] .= " INNER JOIN $wpdb->postmeta istockstatus ON ($wpdb->posts.ID = istockstatus.post_id) ";
        $posts_clauses['orderby'] = " istockstatus.meta_value ASC, " . $posts_clauses['orderby'];
        $posts_clauses['where'] = " AND istockstatus.meta_key = '_stock_status' AND istockstatus.meta_value <> '' " . $posts_clauses['where'];
    }
    return $posts_clauses;
}

这与默认的排序是可以的,但是当您应用其他排序条件(例如,按价格)时,它将停止工作,缺货的产品将从目录的开头再次可见。
如何修复此代码段以始终在末尾显示缺货的产品,而不考虑在目录中应用的排序?

i7uq4tfw

i7uq4tfw1#

所以这在测试中似乎是有效的。更改“商店”页面上的排序顺序时,orderby子句将被ordering替代。所以它使用过滤器 woocommerce_get_catalog_ordering_args 要将orderby函数附加到所有排序查询,请在从下拉列表中选择之前执行。

add_filter('woocommerce_get_catalog_ordering_args', 'dd_catalog_order');
function dd_catalog_order(){
    add_filter('posts_clauses', 'keep_order_by_stock_status');
}

function keep_order_by_stock_status($posts_clauses){
    $posts_clauses['orderby'] = " istockstatus.meta_value ASC, " . $posts_clauses['orderby'];
    return $posts_clauses;    
}

相关问题