danyo
danyo

Reputation: 5846

wordpress $query->set by meta key value

I am trying to modify all queries of a post type "products" to only show if the product/post has a certain meta_key of "wholesale_price" which the meta_value needs to be greater than 0.

Here is what i have:

add_action( 'pre_get_posts', 'rc_modify_query_get_design_projects' );
function rc_modify_query_get_design_projects( $query ) {

    if($query->is_main_query() && $query->query_vars['post_type'] == 'product' ) {

    $query->set('meta_key', 'wholesale_price');
    $query->set('meta_compare', '>');
    $query->set('meta_value', '0');

}

}

For some reason this still returns everything. Is this the right way of doing things?

Upvotes: 0

Views: 16058

Answers (1)

random_user_name
random_user_name

Reputation: 26160

The problem is the method by which you are setting your meta_query. You should read up on the WP_Query functionality, because meta queries are unfortunately not that simple.

You need to do something more like so:

add_action( 'pre_get_posts', 'rc_modify_query_get_design_projects' );

function rc_modify_query_get_design_projects( $query ) {
    // Do not add meta arguments in admin pages
    if (is_admin()) {
        return;
    }

    if($query->is_main_query() && $query->query_vars['post_type'] == 'product' ) {
        //Get original meta query
        $meta_query = (array)$query->get('meta_query');

        // Add your criteria
        $meta_query[] = array(
                'key'     => 'wholesale_price',
                'value'   => 0,
                'compare' => '>',
        );    

        // Set the meta query to the complete, altered query
        $query->set('meta_query',$meta_query);
}

And no need to return anything in this function.

Upvotes: 4

Related Questions