首页 > 解决方案 > 将 WP_Query 修改为按 total_sales 元键排序

问题描述

我正在尝试更新 wordpress / woocommerce 中搜索结果的排序

因此,当搜索为: mydomain.com/?s=cases&post_type=product

结果按“total_sale”元键排序

我有以下钩子

function sv_update_default_search_to_sales( $query ){
    // check if the user is requesting an admin page
    // or current query is not the main query
    if ( is_admin() || ! $query->is_main_query() ){
        return;
    }

    // Query Update for Search Results pages with products
    if (is_search() && is_woocommerce() ){

        if(get_query_var('post_type') != 'product'){
            return;
        }

        $orderBy = get_query_var('orderby');

        if(empty($orderBy) || $orderBy == 'relevance'){
            $query->set('orderby', 'meta_value_num');
            $query->set('order', 'desc');
            $query->set('meta_key', 'total_sales');
            $query->set('meta_type', 'NUMERIC');
        }
    }
}

add_action( 'pre_get_posts', 'sv_update_default_search_to_sales', 1 );

当我在解析查询后输出 $wp_query 时,我可以看到“meta_key”已设置为空白。

 [meta_key] => 
 [orderby] => meta_value_num
 [order] => DESC
 [meta_type] => NUMERIC

我在其他代码示例中看到他们设置 meta_key 和 meta_value 进行匹配;但是,我没有设定值,我需要按“total_sales”元键对结果进行排序。

我基本上试图重新创建这种类型的查询调用:

$query = new WP_Query([
    'post_type' => 'product',
    'meta_key' => 'total_sales',
    'orderby' => 'meta_value_num'
]);

标签: wordpresswoocommerce

解决方案


OK,所以经过进一步调试。我意识到还有其他插件修改了我的操作后设置为触发的查询。

我不知道具体是哪个插件在修改它,但是在呈现页面后,我打印了过滤器

global $wp_filter;

echo '<pre>';
   print_r($wp_filter['pre_get_posts']);
echo '</pre>';

找出动作编号: 90000 是最后一个被钩住的动作,所以我将地雷设置为 90001

add_action( 'pre_get_posts', 'sv_update_default_search_to_sales', 900001 );

它奏效了!X)


推荐阅读